2017-09-12 4 views
0

Im Moment habe ich ein Multiplayer-Spiel, bei dem der Spieler Projektile auf andere Spieler abfeuert, die eine bestimmte Menge an Blasen haben. Sobald ein Spieler alle seine Blasen verloren hat, verlieren sie.Wie kann man ein Kindobjekt eines anderen Spielers in UNET zerstören?

Das Problem, das ich vorher hatte, war, dass ein erster Spieler auf einem Bildschirm die Blasen eines zweiten Spielers erschießen konnte, aber nicht alle Blasen auf dem Bildschirm des zweiten Spielers platzten, also versuche ich es über den zu synchronisieren Netzwerk irgendwie.

Das Problem, das ich sehe, ist, dass NetworkServer.Destroy das Finden des GameObject, das Sie durch seine NetworkIdentity zerstören wollen, aber nur das root Player GameObject erlaubt, die NetworkIdentity-Komponente darauf zu haben. Wie kann ich die Zerstörung eines Child-Objekts eines Players am besten synchronisieren?

+0

Ich bin nicht gut mit Vernetzung vertraut, aber hier ist ein Vorschlag für eine mögliche Lösung. https://docs.unity3d.com/Manual/UNetActions.html Sie könnten jedem untergeordneten Objekt eine eindeutige Nicht-Netzwerk-ID geben und einen Remote-Aktionsanruf tätigen (siehe den Link), der dann jedem Client mitteilen würde/Server to Zerstöre das Objekt, sorge dafür, dass du deinen eigenen NetworkServer.Destroy-Aufruf in gewisser Weise machst. – Doh09

Antwort

0

Der Kurs https://unity3d.com/fr/learn/tutorials/topics/multiplayer-networking/ ist dem beschriebenen Spiel sehr ähnlich. An die abgefeuerten Kugeln ist ein Bullet-Skript angehängt. Wenn die Kugeln etwas berühren, prüfen sie, ob es sich um einen Spieler handelt, und wenden Schaden an (das Player-Prefab enthält ein Health Skript).

using UnityEngine; 
using System.Collections; 

public class Bullet : MonoBehaviour { 

    void OnCollisionEnter(Collision collision) 
    { 
     var hit = collision.gameObject; 

     /* Code below is from the original example 
     var health = hit.GetComponent<Health>(); 
     if (health != null) 
     { 
      health.TakeDamage(10); 
     }*/ 

     var bubble = hit.GetComponent<BubbleBehavior>(); 
     if (bubble != null) 
     { 
      bubble.Popped(); // Implement a Popped function doing the magic 
     } 

     Destroy(gameObject); 
    } 
} 

In Ihrem Fall können Sie das gleiche tun, aber anstatt zu überprüfen, ob das berührte Objekt ein Spieler ist, einfach zu überprüfen, ob es eine Blase ist, und tun, was Sie von der berührten Blase wollen.

Im ursprünglichen Beispiel synchronisieren sie die Gesundheit (es ist eine "SyncVar"), in Ihrem Fall können Sie die Anzahl der verbleibenden Bläschen synchronisieren.

+0

In diesem Fall würden Sie den Blasen ein Netzwerkverhalten hinzufügen? Müssen nicht alle Netzwerkverhalten einzeln generiert werden? – zavtra

+0

Die Blasen sind Kind eines Spielers GameObject, das bereits ein Netzwerkverhalten hat, also würde ich sagen, dass ein "einfaches" MonoBehavior in Ordnung sein sollte, dann, weil Bubble Popping synchronisiert werden muss, kann die berührte Blase einen Befehl seines übergeordneten Netzwerkverhaltens aufrufen . Ich denke, das würde funktionieren. Wenn Sie es noch nicht gelesen haben, rate ich Ihnen wirklich, den Tuto zu betrachten, den ich verlinkt habe, speziell die Teile 10, 11, 12 und 13. –

Verwandte Themen