Jump to content
Unity Insider Forum
Gadakar86

if Quads in Schlucht = Aktion

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?

 

Share this post


Link to post
Share on other sites

== 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.
  • Like 1

Share this post


Link to post
Share on other sites

Danke dir. Ich werds mal versuchen. Auch wenn ich die letzten Zeieln ehrlich gesagt nicht verstanden habe. Aber bin ja auch ein totaler Noob ^^

Share this post


Link to post
Share on other sites

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");
  		}
	}
}

 

Share this post


Link to post
Share on other sites

beide von euch genannten Scripte funktionieren leider nicht. Schade -,- Das untere fügt er zwar ohne Probleme ein, aber wenn alle Quads in der Schlucht sind kommt nix in der Konsole. Das erstgenannte von Sascha zeigt er Fehler an.

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites
vor 5 Minuten schrieb Gadakar86:

aber wenn alle Quads in der Schlucht sind kommt nix in der Konsole

Hast du die Tags der Quader auch auf "Quader" geändert?

Share this post


Link to post
Share on other sites

@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.

Share this post


Link to post
Share on other sites

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?

 

Share this post


Link to post
Share on other sites
vor 5 Minuten schrieb Sascha:

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

Ups, danke.

Share this post


Link to post
Share on other sites

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?

Share this post


Link to post
Share on other sites
  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.

Share this post


Link to post
Share on other sites

Top! Am wichtigsten ist aber, dass du auch vollständig verstehst, was da passiert. Frag also gerne nach, wenn etwas unklar ist.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

×
×
  • Create New...