修改
好的,所以我通过在胶囊上添加一个刚体部件来解决这个问题。我在某个地方读过,显然你必须有一个才能在服务器上移动。
问题2
我的下一个问题是我现在可以移动一个由客户端产生的胶囊,并且主机可以随意移动它多次。我现在遇到的问题是,当主机产生一个胶囊时,客户端根本无法移动它,我在客户端获得了一种故障效应,并且胶囊仍然没有在主机端移动。有没有理由说它只能单向工作而不是相反?我一开始认为它可能与Spawn vs 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很新,这感觉就像一个菜鸟错误。