Unity3d Unet同步游戏对象列表
Unity3d Unet sync gameObject List
我正在尝试使用 unity3d 的网络引擎 unet 通过网络同步游戏对象列表。该列表在服务器上初始化,并向其中添加对象。我希望这个列表在所有玩家之间同步,这样如果一个玩家添加到它,它会在整个网络上更新,如果一个玩家删除一个项目它会在整个网络上更新。我知道我应该使用 clientRPC 或命令,但我无法弄清楚如何具体使用它们。我找不到像这样同步列表的好例子。如果有人能指出我正确的方向,那就太好了。
希望操纵列表的客户端必须在服务器上执行一条命令,该命令将依次告诉所有客户端如何操纵列表。假设您在所有播放器对象上都有以下 NetworkBehaviour(所有播放器对象在其各自的客户端上都具有本地播放器权限)。
public void ListManipulator : NetworkBehaviour
{
public void AddToList(GameObject obj)
{
if (!isLocalPlayer)
throw new InvalidOperationException("This can only be called for the local player!");
if (obj.GetComponent<NetworkIdentity>() == null)
throw new InvalidOperationException("Network only knows about GameObjects that have a NetworkIdentity!");
CmdAddToList(obj);
}
[Command]
void CmdAddToList(GameObject obj)
{
// this code is only executed on the server
RpcAddToList(obj); // invoke Rpc on all clients
}
[ClientRpc]
void RpcAddToList(GameObject obj)
{
// this code is executed on all clients
localCopyOfList.Add(obj);
}
}
请注意,每个客户端都有自己的本地列表副本:localCopyOfList
。
此外,如果您不能保证目标对象具有 NetworkIdentity 组件,您可以改为给它们命名或 ID 或类似内容,并使用它们来传达要添加或删除的项目。
我正在尝试使用 unity3d 的网络引擎 unet 通过网络同步游戏对象列表。该列表在服务器上初始化,并向其中添加对象。我希望这个列表在所有玩家之间同步,这样如果一个玩家添加到它,它会在整个网络上更新,如果一个玩家删除一个项目它会在整个网络上更新。我知道我应该使用 clientRPC 或命令,但我无法弄清楚如何具体使用它们。我找不到像这样同步列表的好例子。如果有人能指出我正确的方向,那就太好了。
希望操纵列表的客户端必须在服务器上执行一条命令,该命令将依次告诉所有客户端如何操纵列表。假设您在所有播放器对象上都有以下 NetworkBehaviour(所有播放器对象在其各自的客户端上都具有本地播放器权限)。
public void ListManipulator : NetworkBehaviour
{
public void AddToList(GameObject obj)
{
if (!isLocalPlayer)
throw new InvalidOperationException("This can only be called for the local player!");
if (obj.GetComponent<NetworkIdentity>() == null)
throw new InvalidOperationException("Network only knows about GameObjects that have a NetworkIdentity!");
CmdAddToList(obj);
}
[Command]
void CmdAddToList(GameObject obj)
{
// this code is only executed on the server
RpcAddToList(obj); // invoke Rpc on all clients
}
[ClientRpc]
void RpcAddToList(GameObject obj)
{
// this code is executed on all clients
localCopyOfList.Add(obj);
}
}
请注意,每个客户端都有自己的本地列表副本:localCopyOfList
。
此外,如果您不能保证目标对象具有 NetworkIdentity 组件,您可以改为给它们命名或 ID 或类似内容,并使用它们来传达要添加或删除的项目。