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

原创 2015年07月24日 09:17:41

孙广东  2015.7.21

本节提供了与网络系统一起使用的组件的详细信息。

1、Network Animator

NetworkAnimator 用于跨网络同步动画。

Properties

Property:Function:
animator要同步的对象上的Animator 组件。

Details  暂无

2、NetworkBehaviour


NetworkBehaviours 是特别脚本,用于处理对象上的 NetworkIdentity 组件。这些脚本都能够执行 HLAPI ,像Commands、 ClientRPCs、 SyncEvents 和 SyncVars 等功能。


与Unity Network System服务器authoritative 权威系统,网络对象的 NetworkIdentities 必须是“spawned”,由服务器使用 NetworkServer.Spawn()。这会导致他们被分配一个NetworkInstanceId,在连接到服务器的客户端上创建。

Properties

Property:Function:
isLocalPlayerTrue if this object is the player object for the local client.
isServerTrue if this object is running on the server, and has been spawned.
isClientTrue if this object is running on a client.
hasAuthorityTrue if this object is the authoritative version of the object. So either on the server, or on the client with localPlayerAuthority.
assetIdThis is the assetId of the object’s NetworkIdentity.
netIdThis is the netId of the object’s NetworkIdentity.
playerControllerIdThis is the playerControllerId of the object’s NetworkIdentity.
connectionToServerNetworkConnection object to use to send to the server.
connectionToClient

NetworkConnection object to use to send to the client.


NetworkBehaviours 具有以下的特点,介绍如下。

• Synchronized Variables 同步变量
• Network callbacks 网络回调
• Server and Client functions服务器和客户端功能
• Sending Commands发送命令
• Client RPC Calls 客户端 RPC 调用
• Networked Events 网络事件


Synchronized Variables
同步的变量
NetworkBehaviours 成员变量可以从服务器同步到客户端。因为该服务器是有权威在此系统中,同步是仅在  服务器到客户端  的方向。 客户请求做的事情是通过命令Commands处理,不是从客户端同步的变量。


SyncVar 属性用于 标记 成员变量,如  正在同步。SyncVars 可以是任何 基本类型、 不是类、 列表或其他集合。

public class SpaceShip : NetworkBehaviour
{
    [SyncVar]
    public int health;

    [SyncVar]
    public string playerName;
}


SyncVar 的值在服务器上更改,它将发送到所有的游戏中准备好的clients 。当 生成对象 时,客户端上创建他们从服务器的所有 SyncVars 的最新状态。


Network callbacks
网络回调


有各种 网络事件的 NetworkBehaviour 脚本调用的回调函数。这些是对基类 虚函数,所以它们可以被重写在使用这样的代码:

public class SpaceShip : NetworkBehaviour
{
    public override void OnStartServer()
    {
        // disable client stuff
    }

    public override void OnStartClient()
    {
        // register client events, enable effects
    }
}


当对象在服务器上被生成或当服务器启动时 对场景中的对象   调用 OnStartServer 函数。  当对象在客户端被生成 ,或者当客户端连接到服务器以进行场景中的物体,将调用 OnStartClient 函数。这些函数是有用的, 去做那些特定于客户端或服务器的事,  例如suppressing effects 抑制效应在服务器上,或设置客户端事件。

      请注意,当使用的是local client 本地客户端,这两个函数将被同一个对象调用。

其他回调包括:
• OnSerialize - called to gather state to send from the server to clients 调用以收集状态将从服务器发送到客户端
• OnDeSerialize - called to apply state to objects on clients 调用以将状态应用于客户端上的对象
• OnNetworkDestroy - called on clients when server told the object to be destroyed 当服务器告诉要被销毁的对象在客户端上调用
• OnStartLocalPlayer - called on clients for player objects for the local client (only)
• OnRebuildObservers - called on the server when the set of observers for an object is rebuild
• OnSetLocalVisibility - called on a host when the visibility of an object changes for the local client
• OnCheckObserver - called on the server to check visibility state for a new client


Server and Client functions
服务器和客户端功能

NetworkBehaviours 中的成员函数可以用来   自定义属性  来指定它们 作为 仅服务器或仅客户端的功能标记。例如:

using UnityEngine;
using UnityEngine.Networking;

public class SimpleSpaceShip : NetworkBehaviour
{
    int health;

    [Server]
    public void TakeDamage( int amount)
    {
        // will only work on server
        health -= amount;
    }

    [Client]
    void ShowExplosion()
    {
        // will only run on client
    }

    [ClientCallback]
    void Update()
    {
        // engine invoked callback - will only run on client
    }
}


这些属性  使函数立即返回, 如果他们在客户端或服务器未处于活动状态时调用。他们不会生成编译时错误,但如果调用错误的范围内,他们将发出警告日志消息。ServerCallback 和 ClientCallback 的属性可以用于用户代码不能控制的调用的引擎回调函数。这些属性不会导致生成的警告。


Sending Commands
发送命令


     命令是为客户端请求做某事  在服务器上的方式。由于 HLAPI 是一个服务器的权威系统,客户可以只通过命令做事情。发送该命令的客户端上的player 对象对应的服务器上运行命令。这种路由会自动发生,客户端一个不同的player发送命令它是不可能的。

命令必须以  前缀"Cmd" 开头和有  [Command] 自定义属性,如以下:

using UnityEngine;
using UnityEngine.Networking;

public class SpaceShip : NetworkBehaviour
{
    bool alive;
    float thrusting;
    int spin;

    [Command]
    public void CmdThrust(float thrusting, int spin)
    {   
        if (!alive)
        {
            this.thrusting = 0;
            this.spin = 0;
            return;
        }
            
        this.thrusting = thrusting;
        this.spin = spin;
    }

    [ClientCallback]
    void Update()
    {
        int spin = 0;
        if (Input.GetKey(KeyCode.LeftArrow))
        {
            spin += 1;
        }
        if (Input.GetKey(KeyCode.RightArrow))
        {
            spin -= 1;
        }
        // this will be called on the server
        CmdThrust(Input.GetAxis("Vertical"), spin);
    }
}


        命令被调用,通常在客户端上  。但是,而不是命令函数在客户端上运行的 ,它将在该服务器上的客户端Player对象调用。因此,命令是类型安全,有内置的安全机制和路由到player,以及使用参数有效的序列化机制,使快速调用它们。


Client RPC Calls
客户端 RPC 调用


      客户端 RPC 调用是   一个服务器对象 让  客户端对象 做一些事情的方式。这是和如何用命令发送消息 方向相反,但概念是相同的。客户端 RPC 调用然而不只调用player对象,他们可以在任何 NetworkIdentity 对象上调用。必须以前缀 "Rpc" 开头,并且必须 [ClientRPC] 的自定义属性,像下面:

using UnityEngine;
using UnityEngine.Networking;

public class SpaceShipRpc : NetworkBehaviour
{
    [ClientRpc]
    public void RpcDoOnClient(int foo)
    {
        Debug.Log("OnClient " + foo);
    }

    [ServerCallback]
    void Update()
    {
        int value = UnityEngine.Random.Range(0,100);
        if (value < 10)
        {
            // this will be invoked on all clients
            RpcDoOnClient(value);
        }
    }
}

Networked Events
网络的事件


      网络的事件就像   客户端 RPC 调用,但不是只在客户端对象上调用一个函数,客户端对象上的事件将被触发。为事件 注册的其他脚本 然后调用 -  参数在服务器上,所以这使得网络的客户端上脚本间交互。事件必须以前缀 “Event” 开头并且有 SyncEvent 的自定义属性。


事件可以用于生成功能强大的网络游戏系统,可以通过其他脚本扩展。此示例演示如何影响脚本在客户端上的可以响应由服务器上的战斗脚本生成的事件。

using UnityEngine;
using UnityEngine.Networking;

// Server script
public class MyCombat : NetworkBehaviour
{
    public delegate void TakeDamageDelegate(int side, int damage);
    public delegate void DieDelegate();
    public delegate void RespawnDelegate();
    
    float deathTimer;
    bool alive;
    int health;

    [SyncEvent(channel=1)]
    public event TakeDamageDelegate EventTakeDamage;
    
    [SyncEvent]
    public event DieDelegate EventDie;
    
    [SyncEvent]
    public event RespawnDelegate EventRespawn;

    [Server]
    void TakeDamage(int amount)
    {
        if (!alive)
            return;
            
        if (health > amount) {
            health -= amount;
        }
        else
        {
            health = 0;
            alive = false;
            // send die event to all clients
            EventDie();
            deathTimer = Time.time + 5.0f;
        }
    }

    [ServerCallback]
    void Update()
    {
        if (!alive)
        {
            if (Time.time > deathTimer)
            {
                Respawn();
            }
            return;
        }
    }

    [Server]
    void Respawn()
    {
        alive = true;
        // send respawn event to all clients
        EventRespawn();
    }
}

Hints

  • This is a base class that provides Commands and ClientRpc calls.







版权声明:本文为博主原创文章,未经博主允许不得转载。出自 游戏开发实验室_孙广东

相关文章推荐

UnityNetwork简单demo

这两周开始了解Unity联网方面的知识,虽然之前在学校做过一些联网的测试,不过都是基于Socket实现,因为那时候也不知道有Network View之类的组件。个人觉得Unity的Network可以实...
  • zzmkljd
  • zzmkljd
  • 2016年11月17日 17:59
  • 3042

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

孙广东   2015.7.12 我们先来看看这第一个大类的 定义:http://docs.unity3d.com/ScriptReference/Networking.NetworkManager.h...

使用Multiplayer Networking做一个简单的多人游戏例子-2/3(Unity3D开发之二十六)

使用Multiplayer Networking做一个简单的多人游戏例子-1/3 7. 在网络中控制Player移动上一篇中,玩家操作移动会同时控制同屏内的所有Player,且只有自己的屏幕生效。因为...

Unity Network初窥 内置的网络组件使用整理

版本:unity 5.3.4  语言:C#   这边主要参考了雨松大的文章(没找到原文,大家自己找找看看吧)。   听说现在Unity最新的版本已经用了一种新的网络组件,不过公司的项目都还是老...

Unity Network 使用小结

使用网络资源实现CS的局域网功能

Unity3d 网络编程(一)(Unity3d内建网络Network介绍)

首先个人说说题外话,Unity3d使用的网络库核心是用C++实现的一款商业网络游戏引擎库, RakNet。所以对于移动设备来说,用Unity3d来写服务器是完全可以的,并且内建网络库的各项功能封...

Unity网络通信(二)Unity Network 聊天

在上一个例子基础上,我们构建一个聊天室程序。 1,首先建立一个新项目,文件夹名为chat。 2,给接收请求的脚本所绑定的对象,添加网络视图组件(听起来有点绕口)。我们的服务器脚本是绑定在主摄像机上...

Unity多人游戏和网络功能(二) 使用网络管理类

[本文翻译自Unity 5.2的官方文档]NetworkManager是一个可以管理多玩家游戏的网络状态的组件。实际上,它是完全用HLAPI实现的,因此开发者可以使用其他的方式实现他的所有功能。然而,...

使用Multiplayer Networking做一个简单的多人游戏例子-3/3(Unity3D开发之二十七)

上一篇中血条还没有同步到所有客户端,下面添加血条同步。主要用到[SyncVar]同步变量。13. 网络同步血条 打开Health脚本 添加命名空间UnityEngine.Networking usin...

unity3d 局域网组件network及netview的使用

network使用示例 public int connections = 10;     public int listenPort = 8899;     public boo...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Unity5.1 新的网络引擎UNET(十五) Networking 引用--上
举报原因:
原因补充:

(最多只允许输入30个字)