2017-09-15 3 views
0

Ich benutze Unet in Unity und versuche grundsätzlich ein Objekt aufzunehmen und es um die Szene zu bewegen und es jedem auf dem Server zu zeigen . Ich kann das Objekt erfolgreich mit dem Host spawnen und sowohl der Client als auch der Host können das Objekt sehen.UNET- Non-Player-Objekt gleitet hin und her, nachdem ich vom vorherigen Punkt zum aktuellen verschoben habe

Allerdings kann ich als Client das Objekt spawnen, aber es erscheint nicht für den Host. Was das Verschieben des Objekts betrifft, kann der Host das Objekt bewegen, und der Client sieht, dass der Host das Objekt bewegt. Ich tue dies mit der Methode Assign and Remove Authority. Wenn der Client jedoch versucht, das Objekt des Hosts zu verschieben, wird es auch nicht auf dem Server angezeigt. Aber wenn der Host versucht, das Objekt erneut zu verschieben, nachdem der Client "verschoben" wurde, springt das Objekt grundsätzlich immer wieder hin und her zwischen dem Host, der es ebenfalls verschiebt und wo der Client es zuletzt platziert hat.

Ich hoffte wirklich, dass das Sinn ergab und jemand kann mir bitte helfen. Ich habe einen Code aus dem Player-Controller-Skript aufgelistet.

[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; 
     } 

    } 

Antwort

0

Gelöst: Das Problem in meiner GameObject.Find Funktion war, wo ich für einen Objektnamen suchen. Ich gab jedem Gegenstand einen eindeutigen Namen und löste das Problem, das ich hatte.

Verwandte Themen