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

孙广东   2015.7.12

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

1、Commands 命令-  从客户端调用 和 运行在服务器上。

2、ClientRpc calls  -  并在服务器上调用 和 客户端上运行。

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

Commands:

命令是   从在客户端player对象 发送到服务器上的player对象。为了安全,命令 只能从YOUR player 对象发送,所以你不能控制其他玩家的对象。要使一个函数成为一个命令,将[Command] 自定义特性 添加到它,并添加 "Cmd" 前缀。当它在客户端被调用时,此函数将现在运行在服务器上。任何参数自动将传递到服务器的命令。

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();
        }

    }
}

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

默认情况下,命令都是zero零 - 默认在可靠信道上发送的。因此,默认情况下所有命令可靠地都发送到服务器。这可以定制 “Channel” 参数的 [Command] 自定义属性。此参数应为一个整数,表示通道数。

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

[Command(channel=1)]

ClientRpc Calls:

ClientRpc 调用是,从服务器上的对象发送到客户端上的对象。他们可以从任何服务器对象发送,一个已经产生了的 NetworkIdentity 。因为服务器具有authority授权,然后没有安全性方面的问题,服务器对象能够发送这些调用。 要做成 ClientRpc 调用一个函数,将 [ClientRpc] 自定义特性添加到函数上,并添加 "Rpc" 前缀。它在服务器上调用时,此函数将运行在客户端上。任何参将数自动传递给 ClientRpc 调用客户端。

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调用  -,即使它是在相同的服务器进程。所以 LocalClients 和 RemoteClients 的行为是相同的, 对于ClientRpc 调用。

??

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-11 17:55:55

Unity5.1 新的网络引擎UNET(四) UNET Remote Actions的相关文章

Unity5.1 新的网络引擎UNET(一) 概括1

Unity新的网络引擎UNET(一) 概括   孙广东    2015. 7.12 Unity5.1    为开发者发布全新的多玩家在线工具.技术和服务.该技术的内部项目名称为 UNET,全称为 Unity Networking.然而,我们的愿景却不仅仅只是简单的联网.众所周知,Unity 公司的愿景是实现游戏开发民主化.Unity Networking 团队尤其想实现多玩家在线游戏开发的民主化.我们希望所有游戏开发人员都能够创建支持任意玩家数量的不同类型游戏. 加盟 Unity 公司之前,Ne

Unity5.1 新的网络引擎UNET(九) UNET 官方推荐视频教程

孙广东  2015.7.14 在新的网络引擎出现之前,Unity提供的是 内置 Raknet网络引擎, 这一次Unity想更新UGUI一样,花了大的手笔更新了, UNET. 原来的旧的网络组件 被提示 "Deprecate"  或者 "Legacy",  也就是宣告退役了呗.    只是就的网络在实际项目中应用的还是比較少的. 以下给大家分享一下 Unity 推荐的一套视频,  当然了在 youtube上能够找到.  可是须要FQ.本人上传了爱奇艺, 感兴趣能够看看

Unity5.1 新的网络引擎UNET(二) UNET 官方推荐Demo案例

http://blog.csdn.net/u010019717/article/details/46873153 孙广东  2015.7.14 总体感觉,  新的网络引擎的出现,并没有带来太大的轰动,  至少相对于 UGUI推出而言, 但是官方论坛依然和 UGUI时一样,提供了各种讨论的帖子. 其中包括很多分享的小Demo等 其实都差不多,  让大家看看内容吧! UNet Sample Projects- 附加到这篇文章一些样例项目,关于新联网系统.所有这些项目都使用High Level  网络

Unity5.1 新的网络引擎UNET(一) 概括2

孙广东   2015.7.12 有两种网络功能的用户:? 用户使用Unity 制作多人游戏.这些用户应该开始使用NetworkManager 或者 High Level API.? 用户建设网络基础设施 或 高级的多人游戏.这些用户应该开始使用 NetworkTransport API. High level scripting API  高层次的脚本 API Unity 的网络有一个"high-level" 的脚本 API (它我们将称为 HLAPI).使用这种方法可以访问命令 涵盖

Unity5.1 新的网络引擎UNET(三) UNET NetworkManager

孙广东   2015.7.12 我们先来看看这第一个大类的 定义:http://docs.unity3d.com/ScriptReference/Networking.NetworkManager.html 直接继承自  MonoBehaviour,  还有就是被设计成了单例  singleton NetworkManager 网络管理器是一个方便的HLAPI 类,用于管理网络系统 . 对于简单的网络应用NetworkManager 网络管理器可以使用HLAPI控制 .它提供了简单的方法来  启

Unity5.1 新的网络引擎UNET(十五) Networking 引用--上

http://blog.csdn.net/u010019717/article/details/46993697 孙广东  2015.7.21 本节提供了与网络系统一起使用的组件的详细信息. 1.Network Animator NetworkAnimator 用于跨网络同步动画. Properties Property: Function: animator 要同步的对象上的Animator 组件. Details  暂无 2.NetworkBehaviour NetworkBehaviour

Unity5.1 新的网络引擎UNET(七) UNET 单人游戏转换为多人

?? 单人游戏转换为多人   孙广东   2015.7.12 本文档描述将单人游戏转换为使用新的网络系统的多人游戏的步骤.这里描述的过程是简化,对于一个真正的游戏其实需要更高级别版本的实际流程,现在介绍的是不工作就像这的每一场比赛,但它提供了基本配方. 1.NetworkManager 安装 ? 向场景添加一个新的游戏对象并将它重命名为"NetworkManager".? 为新的游戏对象添加NetworkManager 组件.? 将 NetworkManagerHUD 组件添加到游戏物

Unity5.1 新的网络引擎UNET(五) UNET Network Messages

?? 孙广东   2015.7.12 除了high level facilities 的命令和 RPC 调用,还有可能将原始网络消息进行发送. 还有一类被称为 MessageBase,可以扩展,使可序列化的网络消息类.此类有读/写对象的序列化和反序列化功能.开发人员可以执行这些函数本身,或依赖于通过网络系统自动被创建的代码生成实现.基类看起来像这样: public abstract class MessageBase { // De-serialize the contents of the r

Unity5.1 新的网络引擎UNET(六) UNET Multiplayer Lobby

?? 孙广东   2015.7.12 Multiplayer Lobby 多人游戏大厅 很多多人游戏 都有一个暂存区(staging area ):实际游戏之前等待所有玩家加入的地方,在这一area  -  通常被称为 "lobby", 玩家可能能够选择选项,能将自己设置为准备好后比赛开始. NetworkLobbyManager 是专门的NetworkManager网络管理器,可以提供Unity多人游戏大厅(Unity Multiplayer lobby ).它包括: ? 限制可以加