2016-11-23 16 views
1

Ich möchte, dass alle Spieler in der Lage sein, Gameobjects zu bewegen und werfen in der Szene mit diesem Skript:Wie funktioniert das Skript für alle Player Unity Photon?

[RequireComponent(typeof(PhotonView))] 
public class PickupObjectNetwork : Photon.MonoBehaviour { 
public GameObject mainCamera;  
public bool carrying; 
GameObject carriedObject; 
public float distance; 
public float smooth; 
public float throwPower = 10f; 
private float chargeTime = 0f;  
// Use this for initialization 
void Start() { 
    mainCamera = GameObject.FindWithTag("MainCamera");    
} 
// Update is called once per frame 
void Update() { 
    if(photonView.isMine) 
    {    
     if(carriedObject == null) 
     { 
      carrying = false; 
     } 
     if(gameObject == null) 
      return; 

     if(carrying) { 
      photonView.RPC("carry", PhotonTargets.AllBuffered); 
      photonView.RPC("checkDrop", PhotonTargets.AllBuffered); 

      if (Input.GetMouseButtonUp (0)) { 
       float pushForce = chargeTime * 10; 
       pushForce = Mathf.Clamp (pushForce, 1, 20); 
       photonView.RPC("throwObject", PhotonTargets.AllBuffered, pushForce); 
       chargeTime = 0; 
      }     
     } else { 
      if(Input.GetKeyDown (KeyCode.E)) {      
       photonView.RPC("pickup", PhotonTargets.AllBuffered); 
      } 
     } 
     if(Input.GetMouseButton(0)){ 
      chargeTime += Time.deltaTime; 
     } 
    } 
} 
[PunRPC] 
void carry() {    
    if (carriedObject == null) 
    { 
     return; 
    }   
    Debug.Log("picked up object with id: " + carriedObject.GetComponent<PhotonView>().viewID); 
    carriedObject.transform.position = Vector3.Lerp (carriedObject.transform.position, mainCamera.transform.position + mainCamera.transform.forward * distance, Time.deltaTime * smooth); 
    carriedObject.transform.rotation = Quaternion.identity; 
} 
[PunRPC] 
void pickup() {     
     int x = Screen.width/2; 
     int y = Screen.height/2; 
     Ray ray = mainCamera.GetComponent<Camera>().ScreenPointToRay(new Vector3(x,y)); 
     RaycastHit hit; 
     if(Physics.Raycast(ray, out hit)) { 
      Pickupable p = hit.collider.GetComponent<Pickupable>(); 
      if(p != null && hit.distance < 5) { 
       carrying = true; 
       carriedObject = p.gameObject;         
       p.gameObject.GetComponent<Rigidbody>().velocity = Vector3.zero; 
       p.gameObject.GetComponent<Rigidbody>().useGravity = false;        
      } 
     }   
} 
[PunRPC] 
void checkDrop() {    
    if(Input.GetKeyDown (KeyCode.E)) { 
     dropObject(); 
    } 
} 
[PunRPC] 
void dropObject() {   
    carrying = false;   
    carriedObject.gameObject.GetComponent<Rigidbody>().useGravity = true; 
    carriedObject = null; 
} 
[PunRPC] 
void throwObject(float pushForce){    
    carrying = false; 
    if(carriedObject.tag != "BoxMultiplayer") 
     carriedObject.tag = "Projectile"; 
    carriedObject.GetComponent<Rigidbody>().AddForce(Camera.main.transform.forward * pushForce * 200); 
    carriedObject.gameObject.GetComponent<Rigidbody>().useGravity = true;    
    carriedObject = null; 
}  
} 

I instanziiert Szenenobjekte mit PhotonNetwork.InstantiateSceneObject(); Dieses Skript funktioniert nur für Master-Client, Nicht-Master-Clients können keine Objekte verschieben.

Ich habe auch versucht, dieses Skript (zufällig): http://pastebin.com/7DgjZ9U7 Ich weiß nicht wirklich, wie man mit AllocateViewId() arbeitet. Wenn ich dieses Skript verwende, können beide Spieler sceneObjects verschieben, aber die Objektbewegung ist nicht synchronisiert (Objektpositionen werden nicht für andere Spieler aktualisiert). Auch wenn einer der Spieler gameObject in die Wand wirft, die neue Kollisionen mit PhotonNetwork.Destroy(), zerstört, friert dieser Spieler für andere ein. Hoffe, dass meine Frage nicht super unordentlich ist. Danke im Voraus!

Antwort

0

Wenn ein Spieler ohne Autorität über das Objekt damit klarkommt, werden die Änderungen nicht mit den anderen Spielern synchronisiert. Um dies zu tun, muss jeder Spieler die Eigentumsrechte für dieses Objekt mit der Methode photonView.RequestOwnership() vor Abholung/Wurf/Mitnahme anfordern.

Es gibt auch ein vollständiges Beispiel, wie Sie die Eigentumsrechte am Photon Unity-Paket anfordern können (DemoChangeOwner-Scene.unity).

+0

Vielen Dank für Ihre Antwort, ich habe versucht, mit PhotonView.RequestOwnership() vor, aber nicht gelingen, ich habe auch DemoChangeOwner-Szene überprüft, und photonView.RequestOwnership() in pickup() -Funktion gesetzt, aber es nicht t arbeiten. Kannst du mir bitte sagen, in welcher Funktion soll ich es schreiben? –

+0

Sie sollten jedes Mal anrufen, wenn ein Spieler die Transformation eines Objekts ändern muss, dass er nicht der Eigentümer ist. Denken Sie daran, dass die OwnershipOption auf Request or Takeover gesetzt sein muss, um den Eigentümer eines Objekts zu ändern. – Jansen

+0

Mein GameObject PhotonView ist auf Anforderung eingestellt, ich legte auch photonView.RequestOwnership() in carry() -Funktion => in Update() -Funktion, die schlecht ist, aber ich wollte es testen. Und trotzdem funktioniert es nicht. Beide Spieler frieren füreinander ein, nachdem sie versucht haben, das Objekt zu greifen. ................ Debug.Log: Ev OwnershipRequest: {245 = System.Int32 [], 254 = 1} ViewID: 1001 von: 1 Zeit: 709 ..... ............. Ev OwnershipRequest PhotonView.ownershipTransfer: Übernahme. OwnerId: 1 isOwnerActive: True. Der Spieler dieses Kunden: # 01 '' {} –

Verwandte Themen