我在Unity中使用Unet,我正在尝试基本上拾取一个对象并将其移动到场景中并将其显示给服务器上的每个人。 我可以使用主机成功生成对象,客户端和主机都可以看到对象。
但是,作为客户端,我可以生成对象但是,它不会显示给主机。就移动对象而言,主机能够移动对象,并且客户端看到主机正在移动对象。我使用Assign和Remove Authority方法执行此操作。但是,当客户端尝试移动主机的对象时,它也不会出现在服务器上。 但是当主机尝试在客户端“移动”之后再次移动对象时,对象基本上在主机移动它的位置和客户端最后放置的位置之间来回反复跳转。 / p>
我真的希望这是有道理的,有人可以帮助我。我列出了播放器控制器脚本中的一些代码。
[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;
}
}
答案 0 :(得分:0)
解决:问题出在我的GameObject.Find函数中,我正在寻找对象名称。我为每个对象指定了一个唯一的名称,它解决了我遇到的问题。