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.







版权声明:本文为博主原创文章,未经博主允许不得转载。出自 游戏开发实验室_孙广东 https://blog.csdn.net/u010019717/article/details/46993697

终极版C语言(十五)

-
  • 1970年01月01日 08:00

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

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

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

孙广东   2015.7.12 我们先来看看这第一个大类的 定义:http://docs.unity3d.com/ScriptReference/Networking.NetworkManager.h...
  • u010019717
  • u010019717
  • 2015-07-12 22:11:43
  • 20262

UnityNetwork简单demo

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

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

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

Unity Network 使用小结

使用网络资源实现CS的局域网功能
  • u011611902
  • u011611902
  • 2015-10-27 16:45:09
  • 2695

Unity新版网络-NetworkManager

NetworkManager NetworkManager是一个组件,用来管理网络多人游戏的状态。它实际上是完全使用HLAPI实现,所以它所做的一切程序员可以使用其他方式实现。然而,NetworkM...
  • liulong1567
  • liulong1567
  • 2016-05-03 17:43:55
  • 7972

【UNet】初识Unity Network,制作一个简单的网络聊天室

UNet官方文档:https://docs.unity3d.com/Manual/UNet.html 初识UNet,粗略看了一遍Unity Manual的UNet模块,了解到一些基本慨念。理论结合实...
  • final5788
  • final5788
  • 2017-10-05 22:47:40
  • 835

untiy3d 5x,network的服务器端和客户端通信

unity3d 5x以前,可以用NetworkView.RPC的方式进行通信。5x,之后,虽然还可以用networkview建立服务器和客户端,但是NetworkView.RPC的通信方式被取消了。 ...
  • wuyt2008
  • wuyt2008
  • 2016-04-29 15:04:19
  • 6162

Unity 网络通信(一)Unity Network 初步

翻了半天unity的API,也没有发现可以处理Socket的方法。Unity自己封了个网络处理的类Network,主要用于状态同步。 似乎是要实现MMO级别的网络应用,只能用C#自己去写了。(Unit...
  • chenggong2dm
  • chenggong2dm
  • 2012-08-22 17:32:05
  • 20406
收藏助手
不良信息举报
您举报文章:Unity5.1 新的网络引擎UNET(十五) Networking 引用--上
举报原因:
原因补充:

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