私は Unity で Unet を使用しており、基本的にオブジェクトをピックアップしてシーン内を移動し、サーバー上の全員に表示しようとしています。ホストでオブジェクトを正常に生成でき、クライアントとホストの両方がオブジェクトを見ることができます。
ただし、クライアントとしてオブジェクトを生成できますが、ホストには表示されません。オブジェクトを移動する限り、ホストはオブジェクトを移動でき、クライアントはホストがオブジェクトを移動していることを認識します。これは、Assign and Remove Authority メソッドを使用して行います。ただし、クライアントがホストのオブジェクトを移動しようとすると、サーバーにも表示されません。ただし、クライアントがオブジェクトを「移動」した後にホストがオブジェクトを再度移動しようとすると、オブジェクトは基本的に、ホストも移動している場所とクライアントが最後に配置した場所の間を繰り返しジャンプします。
それが理にかなっており、誰かが私を助けてくれることを本当に望んでいました. プレーヤー コントローラー スクリプトのコードをいくつかリストしました。
[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;
}
}