UnityNetwork简单demo

本文通过一个简单的Unity项目示例,介绍了如何利用Unity的UNet系统实现客户端与服务器间的游戏对象同步,包括基本原理、组件配置及脚本编写等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先给出Project:http://download.youkuaiyun.com/detail/zzmkljd/9686285
以及demo程序:http://download.youkuaiyun.com/detail/zzmkljd/9686286

这两周开始了解Unity联网方面的知识,虽然之前在学校做过一些联网的测试,不过都是基于Socket实现,因为那时候也不知道有Network View之类的组件。个人觉得Unity的Network可以实现一些比较简单的网络传输,对于学习来说是绰绰有余。不过网上的教程都是前篇一律,大多数都是讲解那个胶囊体小人的官方例子,这边也链一个我学习UNet时看的文章:http://blog.youkuaiyun.com/cocos2der/article/details/51006463。但是跟着例子做一遍之后还是对UNet感到比较陌生,于是又自己做了一个小demo,配合着Unity Manual的说明,算是对UNet有了一个初步的了解,所以想把它记录下来, 帮助理解UNet。
这是运行截图,没错,这就是Unity自带的那个帅小伙,控制其中一个Client的人物移动,Sever和Client会会同步相应动作,是不是很简单的demo呢。其中左上为Sever,其他三个为Client,当然你也可以将Sever变成一个既是服务器又是客户端的Host。
这里写图片描述
在开始之前我们需要理解两幅图,相信大家已经见过了。
这里写图片描述
这里写图片描述
第一幅图想要表达的意思就是在C/S的网络结构中,服务器保存着所有玩家和敌人的Object,而客户端拥有的是服务器端场景的复制版,并且每个客户端都有一个由客户端操控的角色,叫做LocalPlayer。
在第一幅图的基础上理解第二幅图就可以归结为一个流程:
这里写图片描述
也就是说Client的所有操作都需要在Sever中处理,之后Sever再将处理结果同步到各个Client中。有了这样一个认识之后就可以开始啦。

一、工程
1.创建工程,我将该工程取名为TestUNet,并导入Characters包。
这里写图片描述

2.在场景中添加一个Plane,将Characters的prefab拖入场景中Reset位置,运行后可控制小人移动,确认可以移动之后删除场景中的小人。
这里写图片描述

3.找到小人的prefab,给他添加Network Identity组件和Network Transform组件,并设置Transform Sync Mode为Sync Transform。
这里写图片描述
这边说说这两个组件的意义,Network Identity组件相当于一个UNet的入口,每个需要使用UNet生成的物体都需要挂上这个组件,它会分配给物体一个NetID,类似InstanceID。Server Only选项决定这个物体是否只在服务器中生成,Local Player Authority选项就和第二个组件Network Transform有关,Network Transform组件是用来同步物体的Transform的,当该选项未勾选时同步的方向从服务器到客户端,而勾选时按字面意思理解,本地玩家就有了控制角色的权利,所以同步方向会从客户端到服务器。

4.创建一个空的物体并命名为NetworkManager,为该物体添加NetworkManager组件和NetworkManagerHUD组件,并将小人的prefab拖入Manager的Spawn Info中的PlayerPrefab中。
这里写图片描述

二、代码
小人上的脚本有两个,ThirdPersonUserControl和ThirdPersonCharacter
1.打开ThirdPersonUserControl,发现输入的判断在FixedUpdate()中执行,并调用了后者的Move()方法,传入的是输入的值。而客户端只能控制一个小人的移动,所以得判断该脚本所在的物体是否为LocalPlayer。添加或更改代码:
这里写图片描述

2.打开ThirdPersonCharacter,按照之前的思路应使用户输入的执行发生在服务端,所以也继承NetworkBehaviour,为Move()方法添加[Command]特性并改为CmdMove(),修改错误代码。
这里写图片描述

3.现在上传了用户输入,还需要从服务端同步到客户端执行结果,仔细查看代码发现动画的改变其实是由m_ForwardAmount、m_TurnAmount、m_Crouching、m_IsGrounded这四个值所控制了,很容易就想到了用[SyncVar]特性同步值。这里需要注意一点的是该特性具有单向性,即只能从服务端同步值到客户端,反之则否。所以为这四个值添加该特性。
这里写图片描述

4.但是实验证明这样做不能实现动画状态的改变,原因在于四个值虽然改变了,但却没有应用到控制器中。所以还需要做如下图所示的修改。
这里写图片描述

如果不需要考虑客户端避免碰撞,一个简单UNet的demo就做好啦。现在就可以Build一个exe文件,然后开两个程序进行测试啦。另外,关于动画同步的问题其实是可以使用NetwokrAnimator来进行同步,具体用法可以参考http://www.iqiyi.com/w_19rrx2jrax.html 这个视频,因为我用过之后会有严重的卡帧,所以就不详细介绍了。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值