• 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 调用。





    
  • 相关阅读:
    python中几种数据类型常用的方法
    WSGI
    从开学到初赛的一些个人总结
    CSP-S2020 浙江 游记
    CF1416D Graph and Queries
    单次期望 O(1) 的RMQ
    P3177 [HAOI2015]树上染色
    CF835F Roads in the Kingdom/P1399 [NOI2013]快餐店
    P4381 [IOI2008]Island
    P5655 基础数论函数练习题
  • 原文地址:https://www.cnblogs.com/wzjhoutai/p/6752212.html
Copyright © 2020-2023  润新知