0

我有这个来自我正在制作的多人射击游戏的脚本,我对 [Command] 属性的使用有疑问

这是代码:

[Command]
public void CmdShoot()
{
    //Creat the bullet
    GameObject Bullet = (GameObject)Instantiate(bulletPrefab, Barrle.transform.position, Barrle.transform.rotation);
    BulletController bc = Bullet.GetComponent<BulletController>();
    bc.SetOrigin(this.transform.name);
    NetworkServer.Spawn(Bullet);

    //Shoot the bullet
    Rigidbody rb = Bullet.GetComponent<Rigidbody>();
    rb.AddForce(cam.transform.forward * BulletForce, ForceMode.VelocityChange);
}


//Called from the bullet when it hit something
[Command]
public void CmdHit(GameObject other,GameObject _bullet)
{
    Debug.Log(other.transform.name);
    GameObject bullet = _bullet;
    if (other.GetComponent<NetworkIdentity>() != null)
    {
        //Destroy the coin if you hit it
        if (other.transform.name.Equals("Coin"))
        {
            NetworkServer.Destroy(other.gameObject);
        }

        //Apply dmg to other player if hit it
        else if (other.transform.tag.Equals("Player"))
        {
            Player playerHit = GameManager.GetPlayer(other.transform.name);
            playerHit.TakeDamage(BulletForce);
        }
    }

    //Destroy the bullet if you hit anything
    NetworkServer.Destroy(bullet.gameObject);  
}

现在,如果我从 CmdShoot 中删除 [Command] 属性,则远程玩家无法射击,因为他没有 NetworkServer(据我了解)

我认为 CmdHit 也是一样的,远程玩家无法摧毁子弹或硬币,因为他没有网络服务器。

但是.. CmdHit 即使没有 [Command] 属性也能正常工作,我想知道为什么?

4

1 回答 1

1

如果您在此处查看 Unity 的有关远程操作的文档,应该会对您有所帮助。当您将[Command]属性添加到方法时,您将该方法标记为一旦客户端调用它就在服务器上执行的代码。

在您的情况下,这意味着一旦客户端上有输入导致拍摄(例如按空格键),您就会调用CmdShoot()自己,然后将在服务器上执行。这是一个需要发送到服务器的事件,否则远程玩家将永远不会拥有那个子弹。CmdHit然而,这是一个不必在服务器上执行的本地操作 - 正如您在自己的代码注释中所写的CmdHit那样,一旦它击中某些东西,就会从项目符号中调用。鉴于子弹在两个客户端上都存在,它会在两个客户端上击中某些东西,因此不必在网络上发送信息。

于 2017-07-31T13:23:59.317 回答