目录
一、相关属性及变量
1.ServerRpc属性
2.ClientRpc属性
3.NetworkVariable变量
二、相关组件
1.NetworkManager
2.Unity Transport
3.Network Object
4.NetworkBehaviour:
5.NetworkTransform
Syncing(Synchronizing)
Thresholds
Interpolation
三、Demo
1.同步位置及颜色
2.NetworkTransform应用
Netcode for GameObjects(简称Netcode或NGO)是一个为Unity构建的高级网络库,可用于抽象化网络逻辑,抽象化网络逻辑是指将网络通信的复杂性和细节隐藏在一个高级接口之后,使开发者能够更专注于构建游戏,而无需深入了解底层的网络协议和通信机制。Netcode提供了简单的网络操作,让我们能够更方便的将GameObject和世界数据通过网络会话发送给多个玩家或接收,并在多个玩家之间同步数据。
官网:Unity Multiplayer Networking | Unity Multiplayer Networking
一、相关属性及变量
1.ServerRpc属性
被添加到方法上以标记方法为远程过程调用,ServerRpc在客户端调用,服务器端执行。
[ServerRpc]
public void ColorServerRpc()//注意函数以ServerRpc为后缀
{
Debug.Log("来自客户端的请求,server ColorServerRpc:"+ material.color);
if (NetworkManager.Singleton.IsServer)//判断可省略
ColorClientRpc(material.color);
}
2.ClientRpc属性
被添加到方法上以标记他们为远程过程调用,ClientRpc在服务器端调用,但是会在客户端执行。
[ClientRpc]
public void ColorClientRpc(Color color)//注意函数名以ClientRpc为后缀
{
Debug.Log("来自服务端的要求,ColorClientRpc:"+ color);
GetComponent<MeshRenderer>().material.color = color;
}
3.NetworkVariable变量
这是一种特殊类型的变量,当服务器中的NetworkVariable<T>的值发生更改时,任何已连接的客户端会自动同步;在游戏中途加入的客户端会自动同步服务器的当前状态。
NetworkVariable<T>也对外提供值被修改时触发的回调OnValueChanged 。
public NetworkVariable<Color> ServerColor = new NetworkVariable<Color>();
[ServerRpc]
public void ColorServerRpc()
{
ServerColor.Value = material.color;
}
void Update()
{
GetComponent<MeshRenderer>().material.color=ServerColor.Value;
}
二、相关组件
1.NetworkManager
可通过该组件来启动不同的端。该组件是整个NGO中最为重要的组件,包含了项目中所有与网络代码相关的设置,可以说netcode的中心。它提供了启动和停止作为主机(Host)、客户端(Client)或服务器(Server)的功能。
- Player Prefab:玩家角色的预制件。
- Host :启动服务器并以客户端的形式加入,同时充当服务器和客户端的角色。
- Client :以客户端玩家的形式加入服务器,负责向服务发送请求和接收来自服务端的数据更新。
- Server :以服务器的形式启动游戏,通常用于专门运行游戏逻辑而不参与任何客户端交互操作场景。一旦客户端连接成功,服务器通常会为该客户端实例化一个 Player Prefab。
2.Unity Transport
设置IP、端口号、连接超时、最大连接数、心跳超时等。
3.Network Object
这是附加到Player Prefab上的一个组件,它标记了该对象需要在网络上进行同步。
4.NetworkBehaviour:
NetworkBehaviour是一个抽象类,继承自MonoBehavior 。一个自定义脚本类继承自此类可以实现网络行为。它允许你同步变量、调用远程过程调用(RPCs)、命令以及客户端Rpc方法。
public class HelloWorldPlayer : NetworkBehaviour
{
public NetworkVariable<Color> ServerColor = new NetworkVariable<Color>();
Material material;
public override void OnNetworkSpawn()
{
material = new Material(Shader.Find("Standard"));
material.color = Color.HSVToRGB(Random.Range(0f, 1f), 1f, 1f);
GetComponent<MeshRenderer>().material = material;
if (IsOwner)
{
ColorServerRpc();
}
}
//统一颜色
[ServerRpc]
public void ColorServerRpc()
{
Debug.Log("来自客户端的请求,server ColorServerRpc:"+ material.color);
if (NetworkManager.Singleton.IsServer)//判断可省略
ColorClientRpc(material.color);
}
[ClientRpc]
public void ColorClientRpc(Color color)
{
Debug.Log("来自服务端的要求,ColorClientRpc:"+ color);
GetComponent<MeshRenderer>().material.color = color;
}
}
5.NetworkTransform
同步物体的Transform是Netcode当今多人游戏中最常见的任务之一 。参考文档
-
Syncing(Synchronizing)
这个是用来指定同步位置,旋转,缩放的,需要同步哪些值就勾选哪些。一般情况下,不需要同步GameObject的所有变换值。例如,如果GameObject的缩放从不改变,可以在面板中的Syncing Scale禁用。禁用同步可以节省CPU成本和网络带宽。
-
Thresholds
可以使用阈值来设置最小阈值。这可以用来通过只同步大于或等于阈值值的变化(低于阈值的变化不会同步)来降低同步更新的频率。
-
Interpolation
默认情况下启用了插值。插值会缓冲传入的状态更新,这可能会在authoritative实例(服务端)和非authoritative实例(客户端)之间引入轻微的延迟。当禁用插值属性时,变换的更改会立即应用到非authoritative实例上,这可能会导致视觉上的"抖动",或者在延迟较高时似乎会"跳跃"到新应用的状态更新。
1. lerp通常用于数值和向量的插值,而slerp主要用于四元数的插值,尤其是在处理旋转时。2. lerp的计算成本较低,因为它是直接的线性运算;与之相比,slerp更为复杂,计算成本较高,但结果在某些情况下更为理想。
三、Demo
1.同步位置及颜色
利用ServerRpc属性及ClientRpc属性、NetworkVariable变量实现位置及颜色的同步。
2.NetworkTransform应用
player上挂载Network Transform组件、Network Object组件及下面函数:
public class NetworkTransformTest : NetworkBehaviour
{
void Update()
{
if (IsServer)
{
float theta = Time.frameCount / 10.0f;
transform.position = new Vector3((float)Math.Cos(theta), 0.0f, (float)Math.Sin(theta));
Debug.Log("Change Position");
}
}
}
记录:在线转换视频文件 (aconvert.com)