我无法理解如何正确使用这些 Rpc。有时它们有效,有时则无效。 示例:我有一个位于场景中的游戏对象(未在连接时实例化),称为“Book”,它有一个脚本(“SpellManager”),因此当两个玩家连接时,他们的场景中都有这个对象。 现在在该 SpellManager 脚本中,我希望我的主机/服务器在碰撞时更改法术变量。假设我有一个“string newSpell”变量,如何在服务器端更改此变量,然后将信息发送到客户端?我尝试过这样的事情(简化):
private string newSpell;
private void OnTriggerEnter(Collider other)
{
if (NetworkManager.Singleton.IsServer)
{
newSpell = "Earth";
testClientRpc(Time.frameCount, newSpell);
}
else
{
print("OnClient ");
}
}
[ClientRpc]
public void testClientRpc(int somenumber, string _newSpell)
{
newSpell = _newSpell;
}
但这会在服务器上引发错误:NullReferenceException: Object reference not set to an instance of an object Unity.Netcode.NetworkBehaviour.get_NetworkManager () (at Library/PackageCache/<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="c5a6aaa8ebb0abacb1bcebaba0b1a6aaa1a0eba2a4a8a0aaa7afa0a6b1b685f4ebf5ebf5e8b5b7a0ebf1" rel="noreferrer noopener nofollow">[email protected]</a>/Runtime/Core/NetworkBehaviour.cs:219)
它来自 _newSpell
显然为空的变量?我什至尝试在 ClientRpc 中硬编码 newspell =“Earth”,同样的错误。示例/视频将不胜感激,我找不到类似的内容
最佳答案
- 具有从
NetworkBehaviour
派生的脚本的对象(因为您正在使用RPC
)必须附加一个NetworkObject
组件。 - 如果您从非所有者对象调用
RPC
,则必须在属性选项中将requireOwnership
选项设置为 false,即[ServerRpc(requireOwnership = false)]
关于unity-game-engine - 如何在unity Netcode中为GameObject使用ClientRpc(或ServerRpc)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71366351/