编辑
好的,所以我通过在胶囊中添加刚体组件来部分解决了这个问题。我在某处读到,显然您必须拥有一个才能在服务器上移动。
问题 2
我遇到的下一个问题是我现在可以移动由客户端生成的胶囊,并且主机可以随意移动它多次。我现在遇到的问题是,当主机生成胶囊时,客户端根本无法移动它,并且我在客户端得到了一种故障效果,而胶囊仍然没有在主机端移动。有没有理由为什么它只能以一种方式工作而不是另一种方式?起初我认为这可能与 Spawn 与 SpawnWithClientAuthority 有关,但这似乎没有什么区别。
项目总结
我有一个非常简单的多人游戏项目,我想做的就是让一个玩家主持,另一个作为客户端加入。一旦他们连接在一起,两个玩家就可以生成一个胶囊,然后当用户点击胶囊时。他们应该能够捡起它并在场景中移动它,并且其他玩家应该能够看到这个动作。我可以让两个玩家都连接到服务器并生成他们自己的胶囊,两个玩家都可以看到这一点。移动脚本也完成了。但是,它仅在主机端传输。当客户端拾取对象时,它不会在服务器上更新。
问题
我做了一些调试,发现当我在客户端调用命令时,它根本没有通过换行符和简单的调试语句执行。
代码
public void OnInputClicked(InputClickedEventData eventData)
{
Debug.Log("clicked");
if (isLocalPlayer)
{
if (Physics.Raycast(transform.position, direction: transform.forward, hitInfo: out hit, maxDistance: range))
{
Debug.Log("Hit capsule");
objectID = GameObject.Find(hit.transform.name);
objNetId = objectID.GetComponent<NetworkIdentity>();
CmdAssignAuthority(objNetId);
Debug.Log("Cmd done");
}
else
{
//else if the player is releasing the object we want to release authority
if (objNetId != null)
{
CmdAssignAuthority(objNetId);
}
}
}
[Command]
void CmdAssignAuthority(NetworkIdentity target)
{
Debug.Log("inside cmd");
NetworkConnection current = target.clientAuthorityOwner;
if (current != null && current != connectionToClient)
{
target.RemoveClientAuthority(current);
target.AssignClientAuthority(connectionToClient);
}
else
{
if (current != null)
{
target.RemoveClientAuthority(current);
}
if (current == null)
{
target.AssignClientAuthority(connectionToClient);
}
}
}
问题
我正确地调用了这个命令吗?该脚本附加到播放器预制件,胶囊预制件包含网络 ID 和网络转换。我对 Unet 很陌生,这感觉像是一个菜鸟错误。