Jump to content
Unity Insider Forum

Variable aus einem bestimmten Gameobject?


checkalord3

Recommended Posts

Heyho,

Ich möchte, mit zwei collidierenden Gameobjects, einen Kampf starten lassen. Dazu benutze ich OnCollisionEnter (Collision collision){}. Ich möchte jetzt, dass wenn sie aufeinandertreffen sich angreifen, also Schaden abgezogen bekommen. Jedoch gibt es unterschiedliche Klassen, also kann ich nicht genau im Skript festlegen wie viel Schaden die Figuren bekommen.

Nehmen wir an: Figur_1 macht 5 Schaden und hat 15 Leben, Figur_2 macht 3 Schaden hat 30 Leben

Die beiden collidieren:

void OnCollisionEnter (Collision collision){ 

if ((collision.gameObject.tag == "enemy" && this.gameObject.tag == "friendly") || (collision.gameObject.tag == "friendly" && this.gameObject.tag == "enemy")){
            //Hier findet der Kampf statt

            // Irgendwie müssen die Variablen von dem berührenden Gegner jetzt hier herausgefunden werden. Nur wie?

        }
    }

Link zu diesem Kommentar
Auf anderen Seiten teilen

Du gibst deinem Script entsprechende Variablen:

public int lives = 20;
public int damage = 5;
public int team;

Die Werte, die da stehen, sind nur Defaultwerte. Sobald das Script kompiliert und auf ein GameObject gezogen ist, kannst du die Werte für dieses GameObject frei einstellen. Man beachte auch die team-Variable, die die Tags für dich ersetzt. Trage da einfach auf den GameObjects 0 für friendly ein und 1 für enemy. Wenn du irgendwann ein drittes Team hast, einfach eine 2 einsetzen.

Dann brauchst du in deinem Code nur noch

var otherFighter = collision.gameObject.GetComponent<NameDesScripts>();
if(otherFighter) // Nur wenn wir auch einen Kämpfer gefunden haben, also ein GO mit diesem Script
{
  if(otherFighter.team != team)
  {
    lives -= otherFighter.damage;
    if(lives <= 0)
    {
      Die();
    }
  }
}

Bemerke, wie viel kompakter und weniger fehleranfällig die if-Abfrage jetzt ist.

Man kann das mit dem Team auch über ein enum regeln, dann trägt man das nicht über so eine abstrakte Zahl ein. Wenn das hier erstmal sitzt, sag bescheid, wenn dich das interessiert.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Alles klar! Ich konnte nicht so ganz einschätzen, wie viel auf einmal ich dir entgegen schmeißen kann. :)

Du definierst erst dein enum direkt in der Klasse:

{ // Öffnende Klammer der Klasse
  public enum Team
  {
    Friendly, Enemy
  }
  
  public Team team; // Anstatt "public int team;"
  // Dann die ganzen anderen Variablen und die Methoden

Jetzt hast du im Editor eine Auswahlbox zwischen den beiden Begriffen im enum-Block. Der Rest des Codes kann so bleiben, da ja nur mit != geprüft wird, und Team.Friendly ist ungleich Team.Enemy.

Erweitern geht sehr einfach, indem du mehr Begriffe in die Liste packst:

public enum Team
{
  GDI, Nod, Scrin
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...