找回密码
 立即注册
查看: 3265|回复: 86

[学术/精华文章] Unity3D 实现多人场景网络连接

[复制链接]
发表于 2012-11-25 14:39 | 显示全部楼层 |阅读模式

1.首先要准备一个client和server通信的连接对象和脚本,可以做到同一个程序里,通过点击不同的按钮决定充当client或是server。

2.服务器不需要控制人物,只需要提供一个连接的场所,客户端连入后,需要每个为客户端创建一个新角色。可以把玩家作为一个prefab,建立另一个对象SpawnPlayer,并附加脚本Spawnscript.js监控客户端连接到服务器上的事件OnConnectedToServer,这个事件只有客户端才会触发。当触发后,就会在场景中用角色的prefab创建出一个新的实例,并且让所有人的场景中也都创建出来,这需要使用Network.Instantiate方法,这个方法会用参数中给出的prefab在所有的客户端场景指定位置创建一个实例,底层其实是封装了RPC调用。

3.玩家本身会附带控制脚本,但是客户端需要进行镜头追踪,因为玩家是动态生成出来的,所以开始时Camera上的追踪脚本的追踪目标并没有绑定到玩家,所以需要进行这一步操作。还要保证绑定的对象是自己客户端所对应的人物,而不是别人的人物,所以最好从刚才Network.Instantiate时保存下自己创建出来的人物,然后将Camera脚本的target赋值为它。

从一个对象获取它的脚本的方法是用GameObject.GetComponet(Type type)函数,参数需要传脚本的类名,类名Unity规定是和脚本文件名的前缀是相同的,比如SmoothFollow.js就是SmoothFollow。

4.需要给人物的prefab增加NetworkView的Component来,因为需要既需要同步人物的Transform信息,也需要同步Animation,所以增加2个NetworkView,这里决定使用状态同步机制(也可以用RPC),所以设置相关状态同步的属性。

5.人物角色的控制需要一些特殊处理,因为每个创建出来的角色都有相同的控制脚本,而一个客户端只能控制自己的人物,在进行控制响应之前,需要确定是自己的人物才可以操作。

这里使用人物身上的networkView的类方法isMine来判断。只有创建了这个人物的client的这个属性才会为true。所以只要看这个属性不为true,在控制人物位移、跳跃、动画之前就直接return掉就可以了。


欢迎到论坛参与提问与讨论!~~
发表于 2013-4-5 14:11 | 显示全部楼层
小米 应该结合代码讲解一下!!{:soso_e112:}
发表于 2017-2-18 16:12 | 显示全部楼层
楼主是超人
发表于 2017-2-18 15:48 | 显示全部楼层
好帖就是要顶
发表于 2017-2-18 15:28 | 显示全部楼层
真心顶
发表于 2017-2-18 16:05 | 显示全部楼层
说的非常好
发表于 2017-2-18 15:44 | 显示全部楼层
LZ真是人才
发表于 2017-6-3 18:37 | 显示全部楼层
楼主是超人
发表于 2017-6-3 18:30 | 显示全部楼层
顶顶多好
发表于 2017-6-3 18:16 | 显示全部楼层
真心顶
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-24 23:16 , Processed in 0.117776 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表