Unity5.1 新的网络引擎UNET(四) UNET Remote Actions

孙广东   2015.7.12


网络系统 具有网络中执行操作actions 的方法。这些类型的actions 有时是调用远程过程调用(Remote Procedure Calls)。

在网络系统中有两种类型的 Rpc :

1、Commands 命令-  从client调用 和 执行在server上。

2、ClientRpc calls  -  并在server上调用 和 client上执行。



下图显示了远程操作的方向:


Commands:


命令是   从在clientplayer对象 发送到server上的player对象。

为了安全,命令 仅仅能从YOUR player 对象发送。所以你不能控制其它玩家的对象。要使一个函数成为一个命令。将[Command] 自己定义特性 加入到它,并加入 "Cmd" 前缀。当它在client被调用时,此函数将如今执行在server上。不论什么參数自己主动将传递到server的命令。


Commands 函数 命令功能必须有前缀 "Cmd"。这是一个暗示,当阅读代码调用该命令时,此函数是特殊。并不像正常的函数在本地被调用.

class Player : NetworkBehaviour
{

    public GameObject bulletPrefab;

    [Command]
    void CmdDoFire(float lifeTime)
    {
        GameObject bullet = (GameObject)Instantiate(
            bulletPrefab, 
            transform.position + transform.right,
            Quaternion.identity);
            
        var bullet2D = bullet.GetComponent<Rigidbody2D>();
        bullet2D.velocity = transform.right * bulletSpeed;
        Destroy(bullet, lifeTime);

        NetworkServer.Spawn(bullet);
    }

    void Update()
    {
        if (!isLocalPlayer)
            return;

        if (Input.GetKeyDown(KeyCode.Space))
        {
            CmdDoFire();
        }

    }
}


小心, 它将每一帧从client发送命令!  这会导致大量的网络流量。


默认情况下。命令都是zero零 - 默认在可靠信道上发送的。因此。默认情况下全部命令可靠地都发送到server。这能够定制 “Channel” 參数的 [Command] 自己定义属性。此參数应为一个整数,表示通道数。



Channel 通道 1 是设置在默认情况下、是不可靠的通道,所以要使用这个。使用命令属性 參数的值为 1的 。:   像这种

[Command(channel=1)]



ClientRpc Calls:


ClientRpc 调用是,从server上的对象发送到client上的对象。他们能够从不论什么server对象发送。一个已经产生了的 NetworkIdentity 。

由于server具有authority授权。然后没有安全性方面的问题。server对象能够发送这些调用。 要做成 ClientRpc 调用一个函数,将 [ClientRpc] 自己定义特性加入到函数上。并加入 "Rpc" 前缀。它在server上调用时,此函数将执行在client上。

不论什么參将数自己主动传递给 ClientRpc 调用client。

ClientRpc 函数必须具有前缀  "Rpc" 。这是一个暗示。阅读代码调用该方法时。此函数是特殊,并不像正常的功能在本地调用.

class Player : NetworkBehaviour
{

    [SyncVar]
    int health;

    [ClientRpc]
    void RpcDamage(int amount)
    {
        Debug.Log("Took damage:" + amount);
    }

    public void TakeDamage(int amount)
    {
        if (!isServer)
            return;

        health -= amount;
        RpcDamage(amount);
    }
}


当作为一个 LocalClient 的主机游戏执行时, ClientRpc 将被将被LocalClient调用  -。即使它是在同样的server进程。所以 LocalClients 和 RemoteClients 的行为是同样的。 对于ClientRpc 调用。






原文地址:https://www.cnblogs.com/wzjhoutai/p/6752212.html