unity3d游戏开发之多人网络翻译

About this tutorial
我一直认为unity需要一个好一点的多人网络的教程。当我开始用unity网络功能的时候,我感觉unity自带的例子太混乱了;一个好的网络功能的例子应该包括源文件,这样你可以迅速找到你需要的资料。由于这个想法,我决定参加UniKnowledge比赛并且终于完成了一个网络功能的教程,我希望这个教程包括了你所需要的所有的内容。

这个教程介绍了很多案例;从最小的细节一直到真正的FPS游戏。我建议你从头到尾看一遍这个教程,不过如果你学东西很快的话,也可以自己看一下这些案例,如果需要更多细节,再回过头来看一下这个文档。

About the author
这个教程由M2H的Mike Hergaarden(Leepo)所写。我们已经使用unity两年多了,不过我们真正用unity进行正规开发只有最近的几个月。我们在最开始就在关注多人游戏的功能。实际上我们的第一个游戏就是多人在线游戏;其实很简单!我们的多人游戏有:Crashdrive 3D, Cratemania, Surrounded by Death, Verdun Online 还有最近我们正在搞的Hyberon。

希望你能够享受这个教程。如果你你搞出什么名堂来,记得和我们联络哦。

How to use this tutorial
和文档一起的还有一个压缩包,里面是教程中用到的案例的源文件。我们假设你已经知道怎么用unity编辑器和脚本,如果你不熟悉这些,请先去看unity的视频教程。

多人游戏的debug很麻烦,因为你有两个机器在跑(服务器和客户端)这个项目。所以我们建议你在学习这个教程的时候,在编辑器里跑服务器端,在web里跑客户端。

如果你想把教程中的源文件用在自己的项目里,注意这些文件已经针对教程进行了设置。在你自己的项目里,要确保Run in background选项被选中,这可以让你把服务器端在后端激活,避免进入睡眠状态。这样的话你就可以再后端跑服务器。不然的话你就没办法在跑客户端的时候同时在后端跑服务器。你可以打开这个选项在:Edit-Project settings-Player. 

Tutorial 1:Connect &Disconnect
让我们开始吧
1.打开教程的第一个场景:这个场景在:Tutorial1/Tutorial_1. 这个场景包括了一个摄像机,一个游戏物体和它的脚本,还有另一个物体用来显示场景标题。
2.Build一个webplayer然后运行
3.在编辑器里也开始跑同一个场景,然后点击:Start a server(用默认的IP和端口)
4.在webplayer里点击:Connect as client
5.你应该可以在你的两个项目里都看到:Connection status:Client! 还有:Connection status:Server! 恭喜啦,连接上了!

简单吧;幸运的是这个脚本一点都不难。看一下脚本:Tutorial 1/Connect.js . 这个例子里用到的所有的代码都在OnGUI()函数里,看下这个函数,然后确定你明白这个函数是怎么工作的。这段代码挺简单的(如果你看的懂代码的话,嘿嘿),不过我们还是大致看一下这部分代码。

脚本最上面的两个参数(connectToIP 和 connectPort)是用来对应GUI对话框里的用户输入,当用户点击链接按钮的时候,它们就会被调用。GUI函数分为4个部分:服务器,客户端已连接,客户端连接中,客户端断开。我们直接使用unity提供的状态:Network.peer.Type 来查看当前的链接状态。我们调用Network.Connect函数用来把客户端连接到服务器端,这个函数包含IP,端口还有密码(可选项)作为参数。建立一个服务器也差不多,我们调用另一个函数:Network.InitializeServer。这个函数包含端口和允许的最大连接数量作为参数。注意这里,你在服务器运行的时候,总是可以把连接数调低,但是没有办法超过在服务器初始化时所设置的数值。在你连接服务器或者初始化服务器之前,还有一个选项需要注意:Network.useNat 你应该能在connection/initializing函数的代码上方看到它。

NAT connection(Network.useNat)
我们设置Network.useNat为false因为我们不想用Network Address Translation(网络地址转换)。NAT 在客户端处在路由器之后的时候很有用(内部局域网)。这个网络Demo应该只在局域网中运行;你肯定没办法连接你朋友家(除非你朋友有个无限制的防火墙/路由器)

现在,最后的一段代码;这十来个函数,会被unity自行调用。其实你不需要它们,就算你把它们都删了,这个Demo还是一样能跑。前六个客户端和服务器端的函数应该很好懂;它们只被客户端或者服务器端调用,如果你想调用这些函数传送的参数,自己去查查unity的手册吧。

最后的三个函数不一样,OnFailedToConnectToMasterServer当你不能连接到主服务器的时候被客户端调用,主服务器的信息在后面会提到。OnNetworkInstantiate被实例化的物体调用,这个在后面也会被提到。OnSerializeNetworkView是我们用来在服务器和客户端之间传送信息的两个方法之一。RPC调用你自己定义的网络信息或网络函数。下一个教程里我们会看一下序列化还有RPC调用。

教程的最后看一下这几个函数:Network.Messages Sent,Class Variables 和Class Functions


现在你知道在哪里能找到这些参考信息了,恩~用户手册。我们已经大致介绍了大概75%的信息了,爽吧! 


Tutorial 2: Sending messages

Tutorial 2A:服务器播放,客户端监视,非实例化。
Tutorial 2/Tutorial 2A1


不要让这些标题吓到了,打开场景:Tutorial 2/Tutorial 2A1. 教程1中网络连接的脚本,现在已经放在:Connect物体上了。另外PlayerCube物体被赋予了Tutorial2A1.js脚本和NetworkView组件。每一个物体,只要需要接受或者发送网络信息的,都需要一个NetworkView组件。你可以在整个游戏中只使用一个NetworkView组件,然后用脚本引用它。但是这样太麻烦了,最简单就是给每个需要网络功能的物体都加一个组件。

跑一下这个demo,服务器和客户端都打开。客户端应该能看到服务器移动方块物体。神奇吧,其实这一切就是使用了NetworkView组件的observing(观察)参数,它监视了这个方块的移动。现在看一下方块物体上的Tutorial 2A1.js脚本。这段代码只能在服务器上跑(因为用了Network.isServer来检查是否为服务器端):当服务器端的玩家移动方块,它就会立刻移动。不过你也能看到客户端上方块的移动特别卡,但是不要担心,我们回头会解决这个问题,现在先讲最基本的内
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值