我在 Unity 中使用 Unet,我试图基本上拾起一个对象并在场景中移动它并将其展示给服务器上的每个人。我可以成功地使用主机生成对象,并且客户端和主机都可以看到该对象。
但是,作为客户端,我可以生成对象,但是它不会显示给主机。就移动对象而言,主机能够移动对象并且客户端看到主机正在移动对象。我使用分配和删除权限方法来做到这一点。但是,当客户端尝试移动主机的对象时,它也不会出现在服务器上。但是,当主机在客户端“移动”对象后再次尝试移动对象时,对象基本上会在主机也移动它的位置和客户端最后放置它的位置之间反复来回跳跃。
我真的希望这是有道理的,有人可以帮助我。我列出了播放器控制器脚本中的一些代码。
[Command]
public void CmdSpawnCapsule()
{
RpcSpawnCapsule();
}
[ClientRpc]
public void RpcSpawnCapsule()
{
if (isLocalPlayer)
{
//Debug.Log("You are in the cmd");
Vector3 capDir = transform.forward;
Vector3 capPos = transform.position + capDir * 1.5f;
GameObject capsuleToSpawn = (GameObject)Instantiate(capsule, sharedWorldAnchorTransform.InverseTransformPoint(capPos), Quaternion.Euler(capDir));
//capsuleToSpawn.GetComponentInChildren<Rigidbody>().velocity = capDir;
NetworkServer.SpawnWithClientAuthority(capsuleToSpawn, connectionToClient);
//Debug.Log("Exiting cmd");
}
}
public void OnInputClicked(InputClickedEventData eventData)
{
if (isLocalPlayer)
{
if (Physics.Raycast(transform.position, direction: transform.forward, hitInfo: out hit, maxDistance: range))
{
objectID = GameObject.Find(hit.transform.name);
CmdAssignAuthority(objectID);
}
}
}
public void OnSpeechKeywordRecognized(SpeechKeywordRecognizedEventData eventData)
{
if (isLocalPlayer)
{
String keyword = eventData.RecognizedText;
//Debug.Log(keyword);
switch (keyword)
{
case "Spawn":
CmdSpawnCapsule();
break;
}
}
}
[Command]
void CmdAssignAuthority(GameObject obj)
{
if (control == 0)
{
objNetId = obj.GetComponent<NetworkIdentity>();
objNetId.AssignClientAuthority(connectionToClient);
control = 1;
}
else
{
objNetId.RemoveClientAuthority(connectionToClient);
control = 0;
}
}