Jump to content
Unity Insider Forum

if Quads in Schlucht = Aktion


Gadakar86

Recommended Posts

Hallo liebe gemeinde. Ich habe ein Script geschrieben, was nicht funktioniert, und möchte mal wissen wieso.

Folgendes: Habe 5 Quader, alle mit einem Tag erstellt, und zwar Quader1, Quader2, usw (Und auch demensptrechend so genannt)

Wenn diese 5 Quader sich alle in einer Schlucht befinden, soll wengisten erstmal in der Konsole was erscheinen. Aber da tut sich jar nix. Für die Schlucht hab ich nen neues Gameobjekt erstellt, vergrößert, box collider hinzgefügt und is trigger aktiviert. Und das script natürlich an das Gamebojekt gemacht.

Hier mein Script:

using UnityEngine;
using System.Collections;
using UnityEngine.SceneManagement;

public class NeuesLevel1 : MonoBehaviour {

void OnTriggerEnter2D(Collider2D other2)
{
    if (other2.tag == "Quader1" + "Quader2" + "Quader3" + "Quader4" + "Quader5") {
        Debug.Log ("Nächstes Level");
        
    } else
        Debug.Log ("Es funktioniert nicht");
}
}
      

 

Hat jemand nen Tipp für mich?

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

== führt einen Vergleich durch.

+ zwischen zwei Strings konkateniert die Strings, schreibt sie also hintereinander.

if (other2.tag == "Quader1" + "Quader2" + "Quader3" + "Quader4" + "Quader5")

ist also gleichbedeutend mit

if (other2.tag == "Quader1Quader2Quader3Quader4Quader5")

Leider lässt sich das nicht mal eben innerhalb dieser einen Zeile fixen, weil OnTriggerEnter(2D) nur einmal aufgerufen wird, wenn ein neues Objekt den Trigger berührt. Dieses Objekt wird als Parameter übergeben (heißt bei dir "other2"). Welche Objekte sonst noch in deinem Trigger sind, ist OnTriggerEnter(2D) gänzlich egal. Du versuchst daher abzufragen, ob das eine neue Objekt alle fünf Tags hat, was natürlich nicht geht. Was du ja aber wirklich wissen willst ist, ob alle fünf Tags über Objekte im Trigger vertreten sind. Dafür musst du ein bisschen was dazu bauen.

Erstmal die Frage: Brauchst du überhaupt fünf Tags? Ich lass die Sache mit "niemals überhaupt Tags benutzen" erstmal in der Kiste, aber ich vermute einfach mal, dass du immer nur ein Objekt pro Tag hast. Dass die fünf Objekte unterschiedliche Tags haben, benutzt du hier ja gar nicht, da du einfach nur schaust, ob alle fünf da sind. Du könntest dann einfach einen Tag "Quader" haben und schauen, ob (alle) fünf Objekte mit diesem Tag im Trigger sind.

Um das zu machen, gibt es mehrere Möglichkeiten. Ich denke, eine einfach nachzuvollziehende ist ein Zähler. Dafür brauchst du eine int-Variable, die hochzählt, wenn ein "Quader"-Objekt den Trigger betritt, und wieder herunterzählt, wenn einer davon der Trigger wieder verlässt. Ist der Zähler bei 5 angekommen, wissen wir, dass alle 5 Objekte im Trigger sind.

Das würde dann so aussehen:

private int objectsInTrigger = 0;

private void OnTriggerEnter2D(Collider2D other)
{
  if (other.CompareTag("Quader"))
  {
    // Erhöhe um eins
    objectsInTrigger++;
    
    // Schaue ob es fünf sind
    if (objectsInTrigger == 5)
    {
      Debug.Log("Nächstes Level");
    }
  }
}

private void OnTriggerExit2D(Collider2D other)
{
  if (other.CompareTag("Quader"))
  {
    // Senke um eins
    objectsInTrigger--;
  }
}

Das kann man dann noch aufhübschen, z.B. indem man die 5 nicht hardcoded, sondern als Variable einfügt, die man im Editor setzen kann. Dann kannst du jedes Mal, wenn du dieses Script auf ein GameObject tust, eingeben, wie viele Quader benötigt werden. So kannst du mit demselben Script, ohne den Code abändern zu müssen, mehrere Level bauen, in denen verschieden viele Quader gebraucht werden.

Sonst noch so:

  • CompareTag ist besser als == "meinTag", da es dir eine Fehlermeldung wirft, wenn der Tag gar nicht existiert, z.B. weil du dich vertippt hast.
  • Auch mit CompareTag sind Tags immer eine potentielle Fehlerquelle. Ich empfehle dringend, auf lange Sicht Tags komplett sein zu lassen. Wenn du mal Lust hast, kann ich erzählen, wieso... aber im Moment führt's einfach zu weit.
Link zu diesem Kommentar
Auf anderen Seiten teilen

Da fehlen doch die Klammern?
 

 using UnityEngine;
using System.Collections;
using UnityEngine.SceneManagement;

public class NeuesLevel1 : MonoBehaviour {

void OnTriggerEnter2D(Collider2D other2)
{
    if (other2.tag == "Quader1" + "Quader2" + "Quader3" + "Quader4" + "Quader5") 
    {
        Debug.Log ("Nächstes Level");
        
    } 
  else
  {
    Debug.Log ("Es funktioniert nicht");
  }
  
}
}

Ausserdem würde ich nicht für jeden Quader ein Tag machen, sondern einfach einen Tag und eine int Variable hochzählen lassen.  Irgendwie so:

 

 using UnityEngine;
using System.Collections;
using UnityEngine.SceneManagement;


public class NeuesLevel1 : MonoBehaviour {
  
private int _count;
public int maxQuads = 5;
  
void OnTriggerEnter2D(Collider2D other2)
	{
    	if (other2.tag == "Quader") 
    	{   
		_count++;  
    	} 
  		if(_count >= maxQuads)
  		{
    		Debug.Log ("Nächstes Level");
  		}
  		else
  		{
    		Debug.Log ("BlaBla");
  		}
	}
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Uff.

  1. Wenn du Hilfe im Internet kriegst, nicht einfach den Code blind übernehmen. Verstehe, was er tut, und setze ihn in deinem Projekt um.
  2. Wenn du eine Fehlermeldung hast, dann kannst du nur Hilfe kriegen, wenn du die Fehlermeldung auch postest. Sonst müssen wir raten, und das ist albern.
Link zu diesem Kommentar
Auf anderen Seiten teilen

@Gadakar86 Ich nehme stark an, dass du einfach den Code 1:1 in eine Scriptdatei kopiert hast. Wenn das der Fall ist: Da gehört natürlich noch die Klassendefinition dazu, die ich weglasse, weil sie für das, was ich schreiben will, irrelevant ist.

using UnityEngine;

public class WieAuchImmerDeinScriptHeisst : MonoBehaviour
{
  // DER CODE
}

@Jomnitech Bei dir sind die Felddeklarationen außerhalb der Klasse, und OnTriggerExit2D fehlt.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich versuche ja die Codes zu verstehen, jedoch hab ich weder Studium noch Arbeitserfahrungen mit Coding... als Laie ist das durchaus viel schwerer. Der Fehlercode ist das:

"Cant add script component "Schlucht" because the script class cannot be found. Make sure that there are no compile errors and the file name and class name match.

Mich wunderst dass es da keine Klasse in deinem Sript gibt, Sascha?

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das funktioniert immer noch nicht ich krieg die Krise. Keine Kritik jetzt an dich, sondern jetzt hab ich alles gemacht und geht trotzdem nicht:

using UnityEngine;
using System.Collections;
using UnityEngine.SceneManagement;

public class Schlucht : MonoBehaviour {


private int objectsInTrigger = 0;

private void OnTriggerEnter2D(Collider2D other)
{
  if (other.CompareTag("Quader"))
  {
    // Erhöhe um eins
    objectsInTrigger++;
    
    // Schaue ob es fünf sind
    if (objectsInTrigger == 5)
    {
      Debug.Log("Nächstes Level");
    }
  }
}

private void OnTriggerExit2D(Collider2D other)
{
  if (other.CompareTag("Quader"))
  {
    // Senke um eins
    objectsInTrigger--;
  }
}
}

Wieder die gleiche Fehlermeldung - warum? Der Klassenname stimmt doch mit dem Scriptnamen überein. Oder muss ich noch die Quader alle vom Namen, nicht vom Tag her, in Quader umbennen? Das würde ja nicht gehen, weil zwei Objekte können nicht den exakt gleichen Namen haben. Oder?

Link zu diesem Kommentar
Auf anderen Seiten teilen

  1. Sicher, die Datei heißt "Schlucht" (bzw. "Schlucht.cs")?
  2. Hast du evtl. noch andere Fehlermeldungen? Doppelklick auf die Fehlermeldung ganz unten öffnet die Konsole mit allen Meldungen.
  3. Was manchmal noch passieren kann ist, dass man versehentlich eine zweite Scriptdatei anlegt - z.B. durch Verschieben/Umbenennen des Scripts, und dann drückt man aber "Speichern" im Script-/Text-Editor. Plötzlich hat man zwei Scripts, und eins davon produziert den Fehler, obwohl man am anderen arbeitet.
Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...