在多人游戏过程中需要复杂的状态同步机制来支撑多个玩家的状态同步,其中包括位置信息、场景信息、动画信息等等,unity提供了netcode插件来轻松完成这些复杂的网络功能,上手也是非常简单的。下面是该插件使用的基本步骤和注意事项:
1.安装网络组件netcode
2.配置netcode环境(必备)
- 必须添加的脚本networkManager和unityTransport
- 同步单个预制体:需要同步的玩家预制体对象Player Prefab(对象要挂载Network Object脚本)
- 同步多个对象,需创建网络预制体列表
下面这张图中标记了需要同步的单个预制体和预制体列表,最下面使用了unity的网络功能
3.玩家配置
- 玩家需要挂载networkobject脚本
- 玩家需要挂载物理碰撞脚本
- 玩家需要挂载网络动画同步脚本
4.需要了解的概念
- 一些必要脚本
- RPC远程方法调用
4.玩家位置同步(注:脚本继承由MonoBehaviour 换成NetworkBehaviour)
使用NetworkVariable同步玩家信息
客户端:不停的上传位置,代码如下:
NetworkVariable<Vector3> _syncPos=new NetworkVariable<Vector3>() { };
NetworkVariable<Quaternion> _syncRot=new NetworkVariable<Quaternion>() { };
[ServerRpc]
private void UploadTransformServerRpc(Vector3 position, Quaternion rotation)
{
_syncPos.Value = position;
_syncRot.Value = rotation;
}
服务端:不停的下载位置
private void SyncTransform()
{
_syncTransform.position = _syncPos.Value;
_syncTransform.rotation = _syncRot.Value;
}
5.玩家动画同步
6.玩家帧同步,调用以下代码
private void FixedUpdate()
{
if(!IsLocalPlayer)
{
SyncTransform();
}
}
- 设置同步频率
7.使用rcp进行数据同步
客户端更新:客户端有消息提交应使用serverRpc标记的方法,serverRpc是从服务端执行的(首先会接收客户端提交的数据,先更新自身,然后调用ClientRpc,让客户端更新)
服务端更新:服务端有消息提交应使用ClientRpc标记的方法,ClientRpc是从客户端执行的(会接收服务端提交的更新数据)
标签:netcode,同步,游戏,玩家,unity,预制,NetworkVariable,服务端,客户端 From: https://blog.csdn.net/qingtian305/article/details/139597497