使用统一网络服务(和高级API)我试图让2个客户在地图上各有一个建筑物,点击建筑物产生一个单位并将其移向目标。但是我遇到的问题是如何控制谁可以点击建筑物。例如,“玩家1”应该只能点击“建筑物1”来产生单位,“玩家2”应该只能点击“建筑物2”来产生单位。
点击后,我设置了两个预制件(房屋)来生成我的单元。
public class ClickDetection : NetworkBehaviour {
public GameObject _spawnUnit;
public Transform _spawnPoint;
void OnMouseDown()
{
CmdSpawnUnit();
}
[Command]
private void CmdSpawnUnit()
{
var spawnUnit = Instantiate(_spawnUnit, _spawnPoint.position, Quaternion.identity);
NetworkServer.Spawn(spawnUnit);
}
}
然而,当我运行它时,只有主机可以单击这两个建筑物来产生单位。我真的不知道如何让一个人由客户控制,另一个由主人控制。
有没有简单的方法来确定谁应该做什么?
我不希望这些是玩家预制件,我想最终一个玩家能够控制几个建筑物(想想RTS)
答案 0 :(得分:1)
免责声明:我对网络编程没有经验,但这些观察和建议可能会让您更接近解决方案。
命令从客户端上的播放器对象发送到服务器上的播放器对象。为了安全起见,命令只能从您的玩家对象发送,因此您无法控制其他玩家的对象。
来源:https://docs.unity3d.com/Manual/UNetActions.html
由于您告诉主持人可以控制两个建筑物,因此看起来主机对它们都具有本地玩家权限。至少如果我正确阅读文档。
根据此链接:
https://forum.unity.com/threads/network-spawning-of-game-objects-not-working.391315/
"命令必须从播放器对象或本地播放器权限设置为true的对象运行。"
您是否已将其设置为由网络标识中的本地播放器控制?
如果您可以显示相关对象的检查员图片,将会很有帮助。
现在,我还没有做过策略游戏,但我怀疑你还需要分配客户端权限:
https://docs.unity3d.com/ScriptReference/Networking.NetworkServer.SpawnWithClientAuthority.html
这意味着另一种产卵方法。
请确保在建筑物的网络标识中分配本地播放器作者,如果没有解决,请显示完整的检查窗口。