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

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

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

Properties

Property: Function:
isLocalPlayer True if this object is the player object for the local client.
isServer True if this object is running on the server, and has been spawned.
isClient True if this object is running on a client.
hasAuthority True if this object is the authoritative version of the object. So either on the server, or on the client with localPlayerAuthority.
assetId This is the assetId of the object’s NetworkIdentity.
netId This is the netId of the object’s NetworkIdentity.
playerControllerId This is the playerControllerId of the object’s NetworkIdentity.
connectionToServer NetworkConnection 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 可以是任何 基本类型、 不是类、 列表或其他集合。

[csharp] view plain copy

print?

  1. public class SpaceShip : NetworkBehaviour
  2. {
  3. [SyncVar]
  4. public int health;
  5. [SyncVar]
  6. public string playerName;
  7. }

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

Network callbacks
网络回调

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

[csharp] view plain copy

print?

  1. public class SpaceShip : NetworkBehaviour
  2. {
  3. public override void OnStartServer()
  4. {
  5. // disable client stuff
  6. }
  7. public override void OnStartClient()
  8. {
  9. // register client events, enable effects
  10. }
  11. }

当对象在服务器上被生成或当服务器启动时 对场景中的对象   调用 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 中的成员函数可以用来   自定义属性  来指定它们 作为 仅服务器或仅客户端的功能标记。例如:

[csharp] view plain copy

print?

  1. using UnityEngine;
  2. using UnityEngine.Networking;
  3. public class SimpleSpaceShip : NetworkBehaviour
  4. {
  5. int health;
  6. [Server]
  7. public void TakeDamage( int amount)
  8. {
  9. // will only work on server
  10. health -= amount;
  11. }
  12. [Client]
  13. void ShowExplosion()
  14. {
  15. // will only run on client
  16. }
  17. [ClientCallback]
  18. void Update()
  19. {
  20. // engine invoked callback - will only run on client
  21. }
  22. }

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

Sending Commands
发送命令

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

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

[csharp] view plain copy

print?

  1. using UnityEngine;
  2. using UnityEngine.Networking;
  3. public class SpaceShip : NetworkBehaviour
  4. {
  5. bool alive;
  6. float thrusting;
  7. int spin;
  8. [Command]
  9. public void CmdThrust(float thrusting, int spin)
  10. {
  11. if (!alive)
  12. {
  13. this.thrusting = 0;
  14. this.spin = 0;
  15. return;
  16. }
  17. this.thrusting = thrusting;
  18. this.spin = spin;
  19. }
  20. [ClientCallback]
  21. void Update()
  22. {
  23. int spin = 0;
  24. if (Input.GetKey(KeyCode.LeftArrow))
  25. {
  26. spin += 1;
  27. }
  28. if (Input.GetKey(KeyCode.RightArrow))
  29. {
  30. spin -= 1;
  31. }
  32. // this will be called on the server
  33. CmdThrust(Input.GetAxis("Vertical"), spin);
  34. }
  35. }

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

Client RPC Calls
客户端 RPC 调用

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

[csharp] view plain copy

print?

  1. using UnityEngine;
  2. using UnityEngine.Networking;
  3. public class SpaceShipRpc : NetworkBehaviour
  4. {
  5. [ClientRpc]
  6. public void RpcDoOnClient(int foo)
  7. {
  8. Debug.Log("OnClient " + foo);
  9. }
  10. [ServerCallback]
  11. void Update()
  12. {
  13. int value = UnityEngine.Random.Range(0,100);
  14. if (value < 10)
  15. {
  16. // this will be invoked on all clients
  17. RpcDoOnClient(value);
  18. }
  19. }
  20. }

Networked Events
网络的事件

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

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

[csharp] view plain copy

print?

  1. using UnityEngine;
  2. using UnityEngine.Networking;
  3. // Server script
  4. public class MyCombat : NetworkBehaviour
  5. {
  6. public delegate void TakeDamageDelegate(int side, int damage);
  7. public delegate void DieDelegate();
  8. public delegate void RespawnDelegate();
  9. float deathTimer;
  10. bool alive;
  11. int health;
  12. [SyncEvent(channel=1)]
  13. public event TakeDamageDelegate EventTakeDamage;
  14. [SyncEvent]
  15. public event DieDelegate EventDie;
  16. [SyncEvent]
  17. public event RespawnDelegate EventRespawn;
  18. [Server]
  19. void TakeDamage(int amount)
  20. {
  21. if (!alive)
  22. return;
  23. if (health > amount) {
  24. health -= amount;
  25. }
  26. else
  27. {
  28. health = 0;
  29. alive = false;
  30. // send die event to all clients
  31. EventDie();
  32. deathTimer = Time.time + 5.0f;
  33. }
  34. }
  35. [ServerCallback]
  36. void Update()
  37. {
  38. if (!alive)
  39. {
  40. if (Time.time > deathTimer)
  41. {
  42. Respawn();
  43. }
  44. return;
  45. }
  46. }
  47. [Server]
  48. void Respawn()
  49. {
  50. alive = true;
  51. // send respawn event to all clients
  52. EventRespawn();
  53. }
  54. }

Hints

    • This is a base class that provides Commands and ClientRpc calls.
时间: 2024-12-17 17:49:03

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

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(一) 概括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(三) UNET NetworkManager

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

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 单人游戏转换为多人

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

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

孙广东   2015.7.12 网络系统 具有网络中执行操作actions 的方法.这些类型的actions 有时是调用远程过程调用(Remote Procedure Calls).在网络系统中有两种类型的 Rpc : 1.Commands 命令-  从客户端调用 和 运行在服务器上. 2.ClientRpc calls  -  并在服务器上调用 和 客户端上运行. 下图显示了远程操作的方向: Commands: 命令是   从在客户端player对象 发送到服务器上的player对象.为了安全

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

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