UNET- 非玩家对象在从前一个位置移动到当前位置后来回出现故障
UNET- non-player object glitches back and forth after moving from previous spot to current
我在 Unity 中使用 Unet,我试图基本上拾取一个对象并将其在场景中移动并向服务器上的每个人展示。 我可以使用主机成功生成对象,并且客户端和主机都可以看到该对象。
但是,作为客户端,我可以生成该对象,但它不会显示给宿主。就移动对象而言,宿主能够移动对象并且客户端看到宿主正在移动对象。我使用 Assign and Remove Authority 方法执行此操作。然而,当客户端试图移动主机的对象时,它也不会出现在服务器上。 但是 当宿主在客户端拥有 "moved" 之后再次尝试移动对象时,对象基本上会在宿主移动它的位置和客户端移动的位置之间反复来回跳跃放在最后。
我真的希望这是有道理的,请有人能帮助我。我列出了播放器控制器脚本中的一些代码。
[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;
}
}
已解决:问题出在我的 GameObject.Find 函数中,我在其中查找对象名称。我给每个对象一个唯一的名字,它解决了我遇到的问题。
我在 Unity 中使用 Unet,我试图基本上拾取一个对象并将其在场景中移动并向服务器上的每个人展示。 我可以使用主机成功生成对象,并且客户端和主机都可以看到该对象。
但是,作为客户端,我可以生成该对象,但它不会显示给宿主。就移动对象而言,宿主能够移动对象并且客户端看到宿主正在移动对象。我使用 Assign and Remove Authority 方法执行此操作。然而,当客户端试图移动主机的对象时,它也不会出现在服务器上。 但是 当宿主在客户端拥有 "moved" 之后再次尝试移动对象时,对象基本上会在宿主移动它的位置和客户端移动的位置之间反复来回跳跃放在最后。
我真的希望这是有道理的,请有人能帮助我。我列出了播放器控制器脚本中的一些代码。
[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;
}
}
已解决:问题出在我的 GameObject.Find 函数中,我在其中查找对象名称。我给每个对象一个唯一的名字,它解决了我遇到的问题。