Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# PUN2 |该过程被调用两次_C#_Unity3d_Photon - Fatal编程技术网

C# PUN2 |该过程被调用两次

C# PUN2 |该过程被调用两次,c#,unity3d,photon,C#,Unity3d,Photon,我目前正在使用PUN2创建一个多人射击游戏。 在一个房间里进行了参与,并实现了移动和子弹的同步 但是,执行两次hit时的处理。 也许这是因为存在于两台设备上的完全相同的对象正在处理每个快照。(也许) 如何避免重复命中处理 代码: 流量:射手将自己的识别号分配给炮弹并发射→ 任何击中炮弹的人都会受到伤害 Player.cs private void OnCollisionEnter(Collision collider) { BulletController bulletContr

我目前正在使用PUN2创建一个多人射击游戏。 在一个房间里进行了参与,并实现了移动和子弹的同步

但是,执行两次hit时的处理。 也许这是因为存在于两台设备上的完全相同的对象正在处理每个快照。(也许)

如何避免重复命中处理

代码: 流量:射手将自己的识别号分配给炮弹并发射→ 任何击中炮弹的人都会受到伤害

Player.cs

private void OnCollisionEnter(Collision collider)
{
        BulletController bulletController = collider.gameObject.GetComponent<BulletController>();

        if (photonView.Owner.ActorNumber != bulletController.shooterUserId)
        {
            photonView.RPC(nameof(Damaged), RpcTarget.All, bulletController.Damage, bulletController.shooterUserId);
            bulletController.Remove();
        }
}

[PunRPC]
void Damaged(int damage, int userId)
{
    var hashtable = new Hashtable();
    hashtable["HP"] = HP;
    PhotonNetwork.LocalPlayer.SetCustomProperties(hashtable);

    if (photonView.IsMine)
    {
        HP -= damage;
        if (HP <= 0)
        {
            this.gameObject.SetActive(false);
            HP = 0;

            if (userId != photonView.OwnerActorNr)
                photonView.RPC("KilledPlayer", RpcTarget.Others);

        }
    }
}

[PunRPC]
void KilledPlayer()
{
    GameSparksLeaderboard.SaveXP(100);
}
private void OnCollisionEnter(碰撞碰撞器)
{
BulletController BulletController=collider.gameObject.GetComponent();
if(photonView.Owner.ActorNumber!=bulletController.shooterUserId)
{
RPC(名称(损坏),RpcTarget.All,bulletController.Damage,bulletController.shooterUserId);
bulletController.Remove();
}
}
[扑克牌]
无效损坏(整数损坏,整数用户ID)
{
var hashtable=新的hashtable();
哈希表[“HP”]=HP;
PhotonNetwork.LocalPlayer.SetCustomProperties(哈希表);
if(photonView.IsMine)
{
HP-=损害;

如果(HP我只是忘记附加
photonView.IsMine

这很重要,但很容易忘记……

您需要决定如何管理逻辑:通常它是权威服务器(这意味着只有该服务器计算子弹击中等重要内容,并将结果发送给所有“愚蠢”客户端)或者点对点,每个点都可以控制自己的目标,这意味着如果玩家A开火,他会计算他是否击中了任何人并得到结果,如果B开火,他有控制权。所以在我看来,你需要决定你的方法并坚持使用它谢谢你的评论:)这是指“射击的玩家计算”还是“被击中的玩家计算”?然后我想做后一个。被击中的玩家执行损坏(int-damage,int-userId)并且不想被其他设备执行。这也是一个选项,但可能是最糟糕的一个。我已经开发了几个快节奏的实时多人游戏,发现每个客户端都说“我击中了X”“在大多数情况下,以最少的努力/费用提供总体最佳体验。如果你计算命中玩家的命中率,我很确定这种体验对射击的人来说不是一种好的体验。如果你有一款使用hitscan武器的第一人称游戏,通常采用第一种方法是最具成本效益的。