提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
一、OwnerShip权限获取
//消息体
public struct ClientInfo : INetworkSerializable
{
public ulong m_ClientId;
public void NetworkSerialize<T>(BufferSerializer<T> serializer) where T : IReaderWriter
{
serializer.SerializeValue(ref m_ClientId);
}
}
//权限获取只能在服务段调用,客户端调用会报错
[ServerRpc(RequireOwnership = false)]
private void GetOwnerShipServerRpc(ClientInfo clientInfo)
{
NetworkObject networkObject = GetComponent<NetworkObject>();
//m_ClientId 为需要获取权限的客户端的ClientId
//切记不用要OwnerClientId,OwnerClientId为当前权限拥有者的ClientId
networkObject .ChangeOwnership(clientInfo.m_ClientId);
Debug.Log("<color=green>获取权限</color>");
}
二、客户端同步
2.1 NetworkTransform 客户端同步
[DisallowMultipleComponent]
public class ClientNetworkTransform : NetworkTransform
{
/// <summary>
正常情况下,NetworkTransform.OnIsServerAuthoritative的所有者权限由NetworkTransform
组件首次初始化时的方法决定,如果返回True只能事服务器端更新位置到客户端, 通过继承的重写将返回值
值为False,可以根据开启客户端向其他客户端同步的权限
/// </summary>
protected override bool OnIsServerAuthoritative()
{
//return true 为允许服务端向其它客户端同步
return false; //false允许用户权限的客户端向其它客户端同步
}
}
2.2 NetworkAnimator 客户端同步
[DisallowMultipleComponent]
public class ClientNetworkAnimator : NetworkAnimator
{
/// <summary>
正常情况下,NetworkTransform.OnIsServerAuthoritative的所有者权限由NetworkAnimator
组件首次初始化时的方法决定,如果返回True只能事服务器端更新位置到客户端, 通过继承的重写将返回值
值为False,可以根据开启客户端向其他客户端同步的权限
/// </summary>
protected override bool OnIsServerAuthoritative()
{
//return true 为允许服务端向其它客户端同步
return false; //false允许用户权限的客户端向其它客户端同步
}
}