unity 动画系统networkView动画状态同步问题

Unity3D游戏开发从零单排(七) - NetworkView的Demo
Unity3D游戏开发从零单排(七) - NetworkView的Demo
今天做了一个移动设备的网络通信demo,分两个部分,一个是网络连接,一个是数据通信。
需要两台Android设备A,B。A作客户端,B作服务端。
最终的效果是玩家控制设备A中的方块,B中的方块也一起动,同时在A的加速度传感器的信息在B中也实时更新。
首先两台设备要联网,且IP在同一个网段,比如连接在同一个路由上,或者通过笔记本发出wifi信号,然后把设备连在上面。
在Unity3d中创建一个新工程,在场景中创建两个空物体,一个Client,一个Server。
在client创建一个脚本client.cs
using UnityE
using System.C
public class client : MonoBehaviour {
private string IP = "10.66.208.191";
private string clientIp;
private string clientIpS
private Vector3
public GameO
private bool cubeInitialed =
//Connet port
private int Port = 10000;
void Awake()
clientIp = Network.player.ipA
string[] tmpArray = clientIp.Split('.');
clientIpSplite = tmpArray[0] + "." + tmpArray[1] + "." + tmpArray[2] + ".";
void OnGUI()
switch (Network.peerType)
case NetworkPeerType.Disconnected:
StartConnect();
case NetworkPeerType.Server:
case NetworkPeerType.Client:
OnConnect();
case NetworkPeerType.Connecting:
void StartConnect()
if (GUILayout.Button("Connect Server"))
NetworkConnectionError error = Network.Connect(IP, Port);
Debug.Log("connect status:" + error);
void OnConnect()
if(!cubeInitialed)
Network.Instantiate(cube, transform.position, transform.rotation, 0);
cubeInitialed =
客户端根据当前当前的状态来执行相应的动作。StartConnect负责连接,用到了
static NetworkConnectionError Connect(string[] IPs, int remotePort)
第一个参数是Ip,第二个参数是端口。
连接上之后调用OnConnect函数初始化一个方块。注意这个方块是在客户端初始化的,属于这个客户端,创建成功之后会在其他的一桶连接的设备上都实例化一个cube出来,但是只有在这个client上NetworkView.isMine才为true。
接下来是服务端的代码。
using UnityE
using System.C
public class server : MonoBehaviour {
private int serverP
public GUIT
void Awake()
serverPort = 10000;
//OnGUI方法,所有GUI的绘制都需要在这个方法中实现
void OnGUI()
//Network.peerType是端类型的状态:
//即disconnected, connecting, server 或 client四种
switch (Network.peerType)
//禁止客户端连接运行, 服务器未初始化
case NetworkPeerType.Disconnected:
StartServer();
//运行于服务器端
case NetworkPeerType.Server:
OnServer();
//运行于客户端
case NetworkPeerType.Client:
//正在尝试连接到服务器
case NetworkPeerType.Connecting:
GUILayout.Label(Network.player.ipAddress);
void StartServer()
//当用户点击按钮的时候为true
if (GUILayout.Button("创建服务器"))
//初始化本机服务器端口,第一个参数就是本机接收多少连接
NetworkConnectionError error = Network.InitializeServer(12, serverPort, false);
Debug.Log("错误日志" + error);
void OnServer()
GUILayout.Label("服务端已经运行,等待客户端连接");
int length = Network.connections.L
for(int i = 0; i & i++)
GUILayout.Label("客户端" + i);
GUILayout.Label("客户端ip" + Network.connections[i].ipAddress);
GUILayout.Label("客户端端口" + Network.connections[i].port);
void OnSerializeNetworkView(BitStream stream, NetworkMessageInfo info)
// Always send transform (depending on reliability of the network view)
if (stream.isWriting)
Vector3 pos = transform.localP
Quaternion rot = transform.localR
stream.Serialize(ref pos);
stream.Serialize(ref rot);
// When receiving, buffer the information
// Receive latest state information
Vector3 pos = Vector3.
Quaternion rot = Quaternion.
stream.Serialize(ref pos);
stream.Serialize(ref rot);
点击屏幕上的创建服务器之后就在设备上创建了一个服务端,监听对应的端口,当有其他设备连接上来的时间,客户端的信息就会打印出来,可以支持多个设备的连接。
还要创建一个cube的prefab,用于动态创建。
CubeController用于控制方块的运动,NetWorkView用于数据通信。
需要进行数据通信的GameObject都要添加一个NetworkView 组件,数据通信有两种方式,状态同步和RPC(远程过程调用)。在CubeController.cs中,两种方法都有用到。
using UnityE
using System.C
public class CubeController : MonoBehaviour {
private GUIText accelT
void Start()
accelText = GameObject.FindGameObjectWithTag("AccelTip").GetComponent&GUIText&() as GUIT
accelText.text = "";
void Update()
if(Network.isClient)
Vector3 acceleration = Input.
accelText.text = "" +
networkView.RPC("UpdateAcceleration", RPCMode.Others, acceleration);
Vector3 moveDir = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
Vector3 cubescreenPos =
Camera.main.WorldToScreenPoint(transform.position);
if (Input.GetMouseButton(0))
moveDir = new Vector3(Input.mousePosition.x - cubescreenPos.x, Input.mousePosition.y - cubescreenPos.y, 0f).
Debug.Log("moveDir: " + moveDir);
float speed = 5;
transform.Translate(speed * moveDir * Time.deltaTime);
void OnSerializeNetworkView(BitStream stream, NetworkMessageInfo info)
if (stream.isWriting)
Vector3 pos = transform.
stream.Serialize(ref pos);
Vector3 receivedPosition = Vector3.
stream.Serialize(ref receivedPosition);
transform.position = receivedP
void UpdateAcceleration(Vector3 acceleration)
accelText.text = "" +
function OnSerializeNetworkView(stream : BitStream, info : NetworkMessageInfo) {}这是在Network class中提供的一个func. 主要负责message sent / receive,他会同步被network view所关注的script中的对象,也就是当你写了一个script内含OnSerializeNetworkView(){},并且丢到observed属性中,则OnSerializeNetworkView()裡的code就会开始运作。基本上他透过BitStream物件收发网路上的资讯,使用上不需要了解封包的问题,也不需要知道如何切割封包。在这的demo中,服务端只负责接收信息,所以只执行else后面的代码,客户端发送信息,执行if后面的代码。
这里cube的state synchronization选的是Unreliable,对应的通讯协议是UDP,特点是无连接,比较快。
RPC典型的应用场景就是聊天室,使用也非常简单,首先定义一个rpc函数在(在上面加上[RPC]),然后通过NetWork.RPC来调用就可以了。这里是把客户端重力传感器的数据传了出去,在界面上更新。
unity3D的網路資料傳輸 & 角色控制 - /2011/12/unity3d.html
网络视图 Network View - /Components/class-NetworkView.html
远程过程调用的细节 RPC Details - /Components/net-RPCDetails.html
状态同步的细节 State Synchronization Details/Components/net-StateSynchronization.html
Unity Networking Tutorial - http://www.palladiumgames.net/tutorials/unity-networking-tutorial/
如果您想提高自己的技术水平,认识同行朋友、开拓技术视野,请加入QQ群:
Powered by
& 2014 &&&联系本站:Unity3D开发手机网络游戏 前期策划准备工作_新闻_不凡游戏网
热门搜索:
共收录 1305 产业消息
今日共 9 篇文章
当前位置:&&&&
Unity3D开发手机网络游戏 前期策划准备工作
来源:网络 & 作者:未知
11:56|&&我要分享:&
Unity3d 简介&&&& Unity3d是时下比较流行的一款游戏引擎,流行是因为用它做游戏很方便,无论是3d还是2d都会有非常好的效果,即便某些朋友不懂编程,也可以通过Unity自带的组件做出一些简单的诸如三维视频游戏、建筑可视化、实时三维动画等类型的小作品。在正式发布前,Unity经历的多年的开发阶段,Gooball在2005三月发布,运用了Unity的预发售版本 开发。Unity从出道到现在已有8年历史,有很多优秀的作品都是用Unity做的,诸如《神庙逃亡》、《绝代双骄》、《坦克英雄》、《将魂三国》、《梦幻国度2》、《新仙剑Online》以及《纵横无双》等。网络游戏简介&&& 网络游戏又称为MMOG(Massivemultiplayeronlinegame)。通常只要某一游戏的服务器端到客户端连线玩家数量超过1000人即可算作大型多人在线游戏,但是狭义上必须有大量玩家处于同一“游戏世界”的游戏才能称之为大型多人在线游戏。&&& 目前网络游戏的分类主要如下:&&&& 1.从使用形式上进行分类:&&& 浏览器形式和客户端形式。基于浏览器的游戏,也就是通常说到的网页游戏,又称为WEB游戏,它不用下载客户端,任何地方任何时间任何一台能上网的电脑快乐的游戏,尤其适合上班族。其类型及题材也非常丰富,典型的类型有角色扮演(天书奇谭)、战争策略(热血三国)、社区养成(猫游记)、SNS(开心农场)等。 而对于客户端形式这一种类型是由公司所架设的服务器来提供游戏,而玩家们则是由公司所提供的客户端来连上公司服务器以进行游戏,而现在称之为网络游戏的大都属于此类型。此类游戏的特征是大多数玩家都会有一个专属于自己的角色(虚拟身份),而一切存盘以及游戏资讯均记录在服务端。此类游戏大部分来自欧美以及亚洲地区,这类型游戏有World of Warcraft(魔兽世界)(美)、战地之王(韩国)、EVE Online(冰岛)、战地(Battlefield)(瑞典)、信长之野望Online(日本)、天堂2(韩国)、梦幻西游(中国)等等。&&& 2.从游戏种类上进行分类:&& 棋牌类休闲网络游戏:即登陆网络服务商提供的游戏平台后,进行双人或多人对弈,如纸牌、象棋等,提供此类游戏的公司主要有腾讯、联众、新浪等。网络对战类游戏 :即玩家通过安装市场上销售的支持局域网对战功能游戏,通过网络中间服务器,实现对战,如CS、星际争霸、魔兽争霸等,主要的网络平台有盛大、腾讯、浩方等。角色扮演类大型网上游戏:即RPG类,通过扮演某一角色,通过任务的执行,使其提升等级,等到宝物等,如大话西游、传奇等,提供此类平台的主要有盛大等。&& 3.从游戏模式上进行分类:&&&& 这样分类比较多,主要有:一、 MMORPG-大型多人角色扮演类游戏,如时下火爆的《DNF》《DN》《诛仙3》等。二、MMOFPS-大型多人第一人称射击游戏,如《CF》等。三、MMOKTS-大型多人及时策略游戏,这类游戏目前主要以浏览器形式发展而非客户端,如《破碎银河系》等。 四、MMODG-大型多人网络舞蹈游戏,《劲舞团》已经火了很多年了。 五、MMOMG-大型多人网络经营类游戏,这类游戏也是主要依托浏览器形式发展,如《Hattrick》等游戏。 六、MMOR-大型多人网络竞速类游戏,如《跑跑卡丁车》等游戏。 七、MMOTG-大型多人网络大亨类游戏,代表作为《网络大富翁》。 八、MMOSG-大型多人网络体育类游戏,以《街头篮球》为代表。网络游戏的架构:&&&& 一、PTP(Peer-to-Peer)即在多个玩家参与的游戏中,各玩家之间采用Peer-to-Peer的直接通信方式。在网络通信服务的形式上,一般采用浮动服务器的形式,即其中一个玩家的机器既是客户端,又扮演服务器的角色,一般由创建游戏局的玩家担任服务器(主机)。很多对战型的RTS网络游戏都采用这种结构。&&&& 二、基于游戏大厅代理的结构,通过会话大厅(lobby)结构,为不同玩家牵线搭桥,既直接管理客户端,也管理游戏局,是回合制网络游戏的常见类型&&&& 三、网络游戏的最典型的结构是C/S结构,特别适合于多人在线游戏,如RPG,成千上万人进行同一场游戏。服务器上有完整的游戏世界模型,玩家在客户端去观察这个世界,并与之互动。C/S结 构的优点是能够充分发挥客户端计算机的处理能力,很多工作可以在客户端处理后再提交给服务器,使得客户端响应速度快。对于网络游戏来讲,这是十分关键的。 其缺点就是网络游戏的升级比较麻烦,每次升级需要客户端下载体积庞大的更新软件,然后进行安装,对于一些带宽并不是十分充足的用户而言,升级就成了游戏的梦魇。不过,良好的客户端程序框架设计完全可以避免升级时下载庞大的更新软件。比如,客户端软件可以把场景定义文件独立出来,客户端程序在运行时动态加载 场景定义文件。这样,当网络游戏的设计者发现需要增加游戏场景时,他只需要更新一个场景定义文件就可以了,当然还需要一些必需的场景资源文件,如新增加的 图像、背景音效等。使用Unity开发简单的网络游戏&&& 网络游戏和单机游戏最大的区别就是网络游戏把单机游戏的逻辑判断移到了服务器端。当客户端向服务器发出一个请求后,比如说行走,服务器收到客户端发来的这个数据包,然后读出内容,进行逻辑判断处理,然后把结果从新返回给客户端。客户端收到服务器的回复后,开始进行屏幕渲染,于是就出现了行走的动画了。逻辑判断在服务器端,客户端只负责渲染。把逻辑放在服务器端有一个很明显的好处,就是防止第三方修改数据,即降低玩家“开挂”的可能性。使用Unity进行网络游戏开发,最好不要用Unity自带的NetworkView,选择socket更好,理由如下:(我这里借鉴A哥所总结)& 一、unity network 需要向unity的masterserver服务器注册我们的服务,而socket服务由开发者自己定义& 二、采用socket想要共享哪些数据更加灵活 而network显然是没有这么方便& 三、网络占用 socket在需要的时候 只需要传输开发者定义好的需要交互的数据即可 network则是整个的实时同步 网络占用会高出不少& 四、network是类似于p2p的客户端直连共享模式 需要nat穿透 用户的设备不一定支持。
&& 【责任编辑:零zXr0】
2923万港币
纵观IT及互联网发展史,软硬件的发展一直相辅相成,当软件发展到了一定高度时,必然...
AppFlood最新发布数据显示绝大多数安卓系统的新用户都来自于亚洲、拉丁美洲以...1044人阅读
已有结构:
|------GameObject & A
| |--------Script aaa: ID、Title...
|------GameObbject B
创建一个Prefab的Clone并设置aaa的属性ID
GameObject tmp =(GameObject)GameObject.Instantiate(P,somePosition,someRotation);
aaa script =(aaa)tmp.GetComponentInChildren&aaa&();
script.ID = 1;注解:
1. Instantiate 的用法见:
2. GetComponentInChildren是获取一个GameObject的子项中的&T&,T为泛型,在此设置为Script的类名称:aaa
3. 指定script该类型为aaa后才能调用其内的方法(monoDevelop会有语法提示)
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:28768次
排名:千里之外
原创:27篇
(3)(4)(1)(1)(2)(2)(4)(4)(1)(1)(2)(2)(1)

我要回帖

更多关于 unity3d动画系统 的文章

 

随机推荐