如何评价unity unet 中文教程5中多人游戏和网络模块UNet

&&&&& Unity5.1为开发者发布全新的多玩家在线工具、技术和服务。该技术的内部项目名称为 UNET,全称为 Unity Networking。我近期的工作便是研究并使用unet,将自己的研究结果在这里记录一下,如有纰漏,请大家多多指正。我主要记述的不是很具体的用法而是一些我遇到的问题,用法在网上也能查到很多。
  Unet针对不同用户的使用有高级和低级API两种--用Unity制作多玩家游戏的用户,这类用户应该从NetworkManager或者高级API开始。搭建网络架构或制作高级的多玩家游戏的用户,这类用户应该从网络传输层低级API开始。
  下面从高级API(HLAPI)开始介绍,使用高级API可以实现:
  - 通过Network Manager控制游戏的网络状态  - 操作客户端主持的游戏,主持游戏的客户端同时也是一个玩家  - 使用一个通用的序列化器序列化数据  - 发送和接收网络消息  - 从客户端向服务器发送网络命令  - 在服务器上远程调用客户端提供的过程(RPC)  - 从服务器向客户端发送网络事件
  关于Unet的介绍网上有很多,大家可以自行查找。
  首先,Unet提供了网络连接以及管理的组件:
  网络管理器(NetworkManager)可以作为控制多人游戏的核心组件。在场景中创建一个空的游戏对象或挑选一个方便管理器对象。从Network/NetworkManager菜单项里选择添加NetworkManager组件。新添加的NetworkManager应如图所示:
在编辑器中的NetworkManager的的inspector 面板上,有允许您配置和控制与网络相关的很多东西。  NetworkManagerHUD 是与NetworkManager相关的的另一个组件。游戏运行控制网络状态时,它给你一个简单的用户界面。用来调试或者实验都可以,但不能用作游戏最终的 ui 设计。NetworkManagerHUD 看起来像:
真正的游戏用户需要自己设置正确的UI ,用于控制游戏状态和允许玩家选择什么样的游戏 。用户设置自己的UI时,脚本需要继承NetworkManager,使用里面的StartHost(),StartClient()来开启伺服器和客户端。并且可以重写方法来检测连接或者实现相应功能,eg:OnClientConnect,OnStartHost等。
  之后便可以使用一系列组件实现自己想要的功能了:
unity自带的组件有上述这些,根据名字也可以大致推测出可以实现什么功能,下面简要介绍一下:
--Animator:动画同步
--Identity:网络标识组件(带有Identity的物体只有网络开启后才会显示出来)
--LobbyManager:游戏大厅
--LobbyPlayer:玩家控制
--Manager:网络管理器
--ManagerHUD:默认UI
--StartPosition:游戏开始玩家所处的位置
--Tranform:物体位移等的同步控制(挂载在需要同步物体的最小父物体上即可)
&这一章到这里,下一章我主要记述我所遇到的问题。
阅读(...) 评论()5950人阅读
Editor私人定制(140)
孙广东& 本节提供了与网络系统一起使用的组件的详细信息。1、Network AnimatorNetworkAnimator 用于跨网络同步动画。PropertiesProperty:Function:animator要同步的对象上的Animator 组件。Details& 暂无2、NetworkBehaviourNetworkBehaviours 是特别脚本,用于处理对象上的 NetworkIdentity 组件。这些脚本都能够执行 HLAPI ,像Commands、 ClientRPCs、 SyncEvents 和 SyncVars 等功能。与Unity Network System服务器authoritative 权威系统,网络对象的 NetworkIdentities 必须是“spawned”,由服务器使用 NetworkServer.Spawn()。这会导致他们被分配一个NetworkInstanceId,在连接到服务器的客户端上创建。PropertiesProperty: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.connectionToClientNetworkConnection object to use to send to the client.NetworkBehaviours 具有以下的特点,介绍如下。o Synchronized Variables&同步变量o Network callbacks&网络回调o Server and Client functions服务器和客户端功能o Sending Commands发送命令o Client RPC Calls&客户端 RPC 调用o Networked Events&网络事件Synchronized Variables同步的变量NetworkBehaviours 成员变量可以从服务器同步到客户端。因为该服务器是有权威在此系统中,同步是仅在& 服务器到客户端& 的方向。 客户请求做的事情是通过命令Commands处理,不是从客户端同步的变量。SyncVar 属性用于 标记 成员变量,如& 正在同步。SyncVars 可以是任何 基本类型、 不是类、 列表或其他集合。public class SpaceShip : NetworkBehaviour
public string playerN
}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 本地客户端,这两个函数将被同一个对象调用。其他回调包括:o OnSerialize - called to gather state to send from the server to clients 调用以收集状态将从服务器发送到客户端o OnDeSerialize - called to apply state to objects on clients 调用以将状态应用于客户端上的对象o OnNetworkDestroy - called on clients when server told the object to be destroyed 当服务器告诉要被销毁的对象在客户端上调用o OnStartLocalPlayer - called on clients for player objects for the local client (only)o OnRebuildObservers - called on the server when the set of observers for an object is rebuildo OnSetLocalVisibility - called on a host when the visibility of an object changes for the local cliento OnCheckObserver - called on the server to check visibility state for a new clientServer and Client functions服务器和客户端功能NetworkBehaviours 中的成员函数可以用来&& 自定义属性& 来指定它们 作为 仅服务器或仅客户端的功能标记。例如:using UnityE
using UnityEngine.N
public class SimpleSpaceShip : NetworkBehaviour
public void TakeDamage( int amount)
// will only work on server
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 UnityE
using UnityEngine.N
public class SpaceShip : NetworkBehaviour
public void CmdThrust(float thrusting, int spin)
if (!alive)
this.thrusting = 0;
this.spin = 0;
this.thrusting =
this.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 UnityE
using UnityEngine.N
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 UnityE
using UnityEngine.N
// Server script
public class MyCombat : NetworkBehaviour
public delegate void TakeDamageDelegate(int side, int damage);
public delegate void DieDelegate();
public delegate void RespawnDelegate();
float deathT
[SyncEvent(channel=1)]
public event TakeDamageDelegate EventTakeD
[SyncEvent]
public event DieDelegate EventD
[SyncEvent]
public event RespawnDelegate EventR
void TakeDamage(int amount)
if (!alive)
if (health & amount) {
health = 0;
// send die event to all clients
EventDie();
deathTimer = Time.time + 5.0f;
[ServerCallback]
void Update()
if (!alive)
if (Time.time & deathTimer)
Respawn();
void Respawn()
// send respawn event to all clients
EventRespawn();
HintsThis is a base class that provides Commands and ClientRpc calls.
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:717604次
积分:10617
积分:10617
排名:第1221名
原创:253篇
转载:15篇
译文:32篇
评论:184条
阅读:11858
文章:13篇
阅读:60239
阅读:40568
文章:25篇
阅读:117132
爱科技、爱游戏、有梦想、一起!
(3)(2)(4)(5)(6)(2)(10)(7)(5)(5)(3)(7)(2)(5)(3)(4)(7)(16)(26)(12)(10)(22)(28)(4)(9)(2)(6)(10)(16)(13)(2)(8)(3)(2)(5)(3)(11)(14)3800人阅读
Editor私人定制(140)
除了high level facilities 的命令和 RPC 调用,还有可能将原始网络消息进行发送。还有一类被称为 MessageBase,可以扩展,使可序列化的网络消息类。此类有读/写对象的序列化和反序列化功能。开发人员可以执行这些函数本身,或依赖于通过网络系统自动被创建的代码生成实现。基类看起来像这样:public abstract class MessageBase
// De-serialize the contents of the reader into this message
public virtual void Deserialize(NetworkReader reader) {}
// Serialize the contents of this message into the writer
public virtual void Serialize(NetworkWriter writer) {}
}有内置message 类为常用的网络messages类型:EmptyMessageStringMessageIntegerMessage发送一条消息有是 Send() 函数, 在&NetworkClient、 NetworkServer 和NetworkConnection 的工作方式相同。他们把消息 Id 和消息对象从 MessageBase 派生。下面的代码显示了如何发送和处理消息,使用的内置message classes之一:using UnityE
using UnityEngine.N
using UnityEngine.Networking.NetworkS
public class Begin : NetworkBehaviour
const short MyBeginMsg = 1002;
NetworkClient m_
public void SendReadyToBeginMessage(int myId)
var msg = new IntegerMessage(myId);
m_client.Send(MyBeginMsg, msg);
public void Init(NetworkClient client)
m_client =
NetworkServer.RegisterHandler(MyBeginMsg, OnServerReadyToBeginMessage);
void OnServerReadyToBeginMessage(NetworkMessage netMsg)
var beginMessage = netMsg.ReadMessage&IntegerMessage&();
Debug.Log(&received OnServerReadyToBeginMessage & + beginMessage.value);
声明一个自定义网络message类并 使用它:using UnityE
using UnityEngine.N
public class Scores : MonoBehaviour
NetworkClient myC
public class MyMsgType {
public static short Score = MsgType.Highest + 1;
public class ScoreMessage : MessageBase
public Vector3 scoreP
public void SendScore(int score, Vector3 scorePos, int lives)
ScoreMessage msg = new ScoreMessage();
msg.score =
msg.scorePos = scoreP
msg.lives =
NetworkServer.SendToAll(MyMsgType.Score, msg);
// Create a client and connect to the server port
public void SetupClient()
myClient = new NetworkClient();
myClient.RegisterHandler(MsgType.Connect, OnConnected);
myClient.RegisterHandler(MyMsgType.Score, OnScore);
myClient.Connect(&127.0.0.1&, 4444);
public void OnScore(NetworkMessage netMsg)
ScoreMessage msg = netMsg.ReadMessage&ScoreMessage&();
Debug.Log(&OnScoreMessage & + msg.score);
public void OnConnected(NetworkMessage netMsg)
Debug.Log(&Connected to server&);
请注意,此示例中的 ScoreMessage 类没有序列化代码。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:717606次
积分:10618
积分:10618
排名:第1221名
原创:253篇
转载:15篇
译文:32篇
评论:184条
阅读:11858
文章:13篇
阅读:60239
阅读:40568
文章:25篇
阅读:117132
爱科技、爱游戏、有梦想、一起!
(3)(2)(4)(5)(6)(2)(10)(7)(5)(5)(3)(7)(2)(5)(3)(4)(7)(16)(26)(12)(10)(22)(28)(4)(9)(2)(6)(10)(16)(13)(2)(8)(3)(2)(5)(3)(11)(14)

我要回帖

更多关于 unity5 unet 局域网 的文章

 

随机推荐