Jump to content
Unity Insider Forum

Trigger Collider Probleme und Multiplayer Frage


vlk1989

Recommended Posts

Hallo Liebe Community,

 

ich hoffe ich bin richtig hier in diesem Bereich was meine Frage angeht.

Ich bin neu hier im Forum und beschäftige mich seit knapp 3 Wochen täglich mit Unity und C#.

Arbeite an einem 2.5D Sidescroller und bis jetzt komme ich eigentlich ganz gut klar, hatte vorher auch ein bisschen Javascript und HTML Kenntnisse. Aber dennoch stoße ich auf einige Probleme, die ich selbst nach tagelangem Recherche nicht im Griff kriege.

 

Mein Problem ist....

 

Ich habe in meinem Level mehrere Collider Objekte als Trigger platziert die verschiedene Funktionen ausführen sollen,

wie z.B. die Geschwindigkeit des Player zu beeinträchtigen oder sonst was das Verhalten des Players angeht zu ändern bzw. zu beeinflussen.

 

Die Kollisionen mit dem Trigger Objekten überprüfe ich immer im Player Skript, was auch ganz gut funktioniert. Außerdem haben alle Trigger Objekte einen eigenen Tag.

 

Also im Player Skript gebe ich z.B. an

 

void OnTriggerEnter(Collider other)

{

if (other.tag == "Turbo")

collision = true;

speed = 200F;

}

 

void OnTriggerExit(Collider other)

{

if (other.tag == "Turbo")

collision = false;

speed = 10F;

}

 

 

so weit so gut, nun habe ich aber einen Empty-Game Objekt "Game Manager" und dazu eigenes Skript das die Aktivitäten verwaltet, was nicht nur den Player sondern das gesamte Level betrifft.

 

Das Game Manager Objekt hat einen eigenen Trigger und soll eine Coroutine Starten und das Spiel beenden und zurück zum Hauptmenü zurückkehren sobald der Spieler damit collidiert. Es funktioniert auch Super nur das Problem ist, dass die Trigger Events die im Player Skript definiert sind auch ausgeführt werden. Also wenn ich mit dem Trigger Collider des Game-Managers collidiere, bekommt der Spieler auf einmal einen Speed Schub und das Spiel wird auch beendet wie im Game-Manager Skript definiert ist.

 

Die Collisionen frage ich im Game-Manager Skript folgendermaßen....

 

void OnTriggerEnter(Collider other)

{

if (other.tag == "Player")

StartCoroutine("GameEnd");

}

 

IEnumerator GameEnd()

{

GUItextMessageText.text = "blabla"

yield return new WaitForSeconds(3);

SceneManager.LoadScene("Start Menu");

}

 

Wo mache ich denn etwas falsch bzw. wie würdet ihr Vorgehen?

Ist die Vorgehensweise richtig so oder soll ich ein eigenes Skript für die Collisions Abfragen erstellen welche dort Zentral verwaltet werden.

 

Eine zweite Frage hätte ich auch noch,

 

und zwar habe ich vor Später mein Projekt auch in Multi-Player umzusetzen und für IOS und Android zu veröffentlichen, wird aber noch dauern, erstmal möchte ich das komplette Spiel fertig haben. Ich habe mir ein Ziel gesetzt ende des Jahres damit Fertig zu werden.

Nun Wie sollte ich denn vorgehen wenn es später ein Multiplayer Spiel werden soll, also kann ich später das Spiel wenn es fertig ist einfach so als Multiplayer Spiel mit Server-Client Verfahren veröffentlichen oder muss ich vom Anfang an beachten, dass es ein Multiplayer Spiel sein wird und ich anders Vorgehen muss als bei einem Singleplayer Spiel.

 

Ich bedanke mich Vorab für die Antworten und wünsche euch einen schönen Tag.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wenn du den Code so hast wie hier angegeben funktionieren die Ifs im Playerscript nicht richtig:

void OnTriggerEnter(Collider other)
{
if (other.tag == "Turbo")
 collision = true;
speed = 200F; //Wird so immer ausgeführt,
					  unabhängig von dem Ergebniss des Ifs
}
Richtig wäre:
void OnTriggerEnter(Collider other)
{
if (other.tag == "Turbo")
{
 collision = true;
 speed = 200F;
}
}

 

Ich vermute mal das dein Zielobjekt keinen Tag "Turbo" hat und es dann gehen sollte.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Grundsätzlich sieht das gut aus nur bin mir gerade nicht sicher wie er die IF schleife ausliest die du benutzt um herauszufinden ob es sich um den SpielerTag handelt oder Dem Turbo...

 

Ich würde das so schreiben

 

void OnTriggerEnter(Collider other)
{
if (other.tag == "Turbo"){
collision = true;
speed = 200F;}
}
void OnTriggerExit(Collider other)
{
if (other.tag == "Turbo"){
collision = false;
speed = 10F;}
}

und

void OnTriggerEnter(Collider other)
{
if (other.tag == "Player"){
StartCoroutine("GameEnd"); }
}
IEnumerator GameEnd()
{
GUItextMessageText.text = "blabla"
yield return new WaitForSeconds(3);
SceneManager.LoadScene("Start Menu");
}

Mit den zeichen <> im Schreibfenster kannst du das übrigens besser den Code einfügen

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi, danke an euch beiden und danke für den Hinweis mit <> :-), es tut mir Leid habe vergessen die geschweiften Klammern nach dem IF-Zweigen zu schreiben also ich meine hier im Forum, ansonsten habe ich die Code genauso wie ihr gepostet habt und die Trigger Colliders sind alle natürlich mit Tags versehen...Aber trotzdem werden alle Ereignisse ausgeführt wenn ich irgendeinem Trigger hineintrete.

 

Hier nochmal die Code 1:1 aus meinem Skript

 

Playerscript:
void OnTriggerEnter(Collider other)
{ 
	if (other.tag == "Turn")
	{
		collision = true;
		gameObject.transform.Rotate(0, 90, 0);
	}
	if (other.tag == "Turbo")
	{

		collision = true;
		speed = 200F;
	}
	if (other.tag == "Slow")
	{
		collision = true;
		speed = 5F;
	}

}
void OnTriggerExit(Collider other)
{
	if (other.tag == "Turbo" || other.tag == "Slow" || other.tag == "Turn")
	{
		collision = false;
		speed = 10F;
	}
}

Game-Manager Script
void OnTriggerEnter(Collider other)
{
	if (other.tag == "Player")
	{  
		StartCoroutine("GameEnd");
	}
}
IEnumerator GameEnd()
{

	GUItextMessageText.text = "";
	yield return new WaitForSeconds(3);
	SceneManager.LoadScene("Start Menu");
}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Als erstes würde ich überprüfen, ob wirklich alle Collider mit dem richtigen Namen versehen sind. Dann, ob das Script nicht an mehrere Objekte gehängt wurde. Anschließend würde ich im OnTriggerEnter entweder mit Debug.Log so viele Ausgaben reinmachen, bis klar ist, welcher Weg durch das Programm genommen wird.

 

Wenn dich das nicht auf die Spur bringt, würde ich eine neue Szene bauen und den Fehler so einfach wie möglich nachstellen (also möglichst nur die beteiligten Objekte reinziehen).

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hat das GameMaster Objekt vllt den Tag "Turbo"? ^^

Oder hast du da noch irgendwo ein Objekt in der Nähe das kollidieren kann (Child Objekt?) das den Tag hat?

 

Und ja, debuggen ist nie verkehrt..

Mit Visual Studio (weiß nich ob's bei Mono auch geht) könntest du ja mal VS an den Unity Prozess anhängen und dort debuggen.. Dann hast du vollen Überblick über alles was grade passiert und was welche Zustände hat.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hey danke an euch, jetzt funktioniert alles wie es sein sollte:-)

Das Problem ist wenn ich im Game Manager Skript bei OnTriggerEnter nach dem IF-Zweig collision auf true setze werden auch die Ereignisse vom Player Skript ausgeführt aber wenn ich da einfach nur abfrage ob mit Player collidiert wurde funktioniert alles wie es sein soll und es werden keine Trigger Ereignisse vom Player Skript dazugemischt. Aber wie kann das denn sein, dass wenn ich im Game Manager Skript das eigene Collider auf true setze auch die Ereignisse vom Player Skript auf true gesetzt werden?

 

Ich hätte noch eine Frage....Wie könnte ich denn mit Character Controller das Rutschen auf einer 45 grad nach unten geneigter Ebene realisieren....mit Rigidbody war es einfach gewesen man musste die Physik-Material Eigenschaften verändern dann hat es auch funktioniert, aber mit Character Controller kriege ich es irgendwie nicht hin.

 

Liebe Grüße

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hm warum dein Game Manager Skript sachen macht die im Player Skript stehen kann ich mir gerade auch nicht erklären. ich würde das ganze debuggen in dem man überall wo man Kollidiert und etwas ausgewertet haben möchte ein print("Kollider XY");

hinpacken damit ich sehe wann welche routine/Funktion abgerufen wird. Frage mich sowieso warum du die collision auf true setzt da es sonst in dem Code nicht weiter erwähnt wird. Ist ja auch nicht dein ganzer Code. ist die Variable Collision auf public und static oder dergleichen da ansonsten das eine Skript gar nicht darauf zu greifen darf... Musste wohl oder übel selber schauen woran es liegt.

Das Rutschen an einer 45° Fläche wüsste ich auch erstmal nicht was ich machen müsste da ich sowas noch nicht gebraucht habe^^

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hm warum dein Game Manager Skript sachen macht die im Player Skript stehen kann ich mir gerade auch nicht erklären. ich würde das ganze debuggen in dem man überall wo man Kollidiert und etwas ausgewertet haben möchte ein print("Kollider XY");

hinpacken damit ich sehe wann welche routine/Funktion abgerufen wird. Frage mich sowieso warum du die collision auf true setzt da es sonst in dem Code nicht weiter erwähnt wird. Ist ja auch nicht dein ganzer Code. ist die Variable Collision auf public und static oder dergleichen da ansonsten das eine Skript gar nicht darauf zu greifen darf... Musste wohl oder übel selber schauen woran es liegt.

Das Rutschen an einer 45° Fläche wüsste ich auch erstmal nicht was ich machen müsste da ich sowas noch nicht gebraucht habe^^

 

Das Problem wurde gelöst danke nochmals an alle...Ich habe die ganze Zeit, aus versehen vom Game-Manager Skript aus auf das Player Kontroller Skript zugegriffen und dort auch die Werte auf True gesetzt.

 

Es währe noch sehr nett falls jemand sich schon mal damit auseinander gesetzt hat und mir helfen würde wie man das Rutschen bei geneigtem Ebenen realisiert sowie wenn der Player sich auf einem Transportmittel befindet "z.B. Minenwagen" auch davon mitgenommen wird, weil es ist immer so, dass der Player das andere Objekt mit Rigidbody entweder verhindert sich zu bewegen wenn es mit Collidern umrandet ist damit der Player nicht abstürzen soll oder wenn der Player sich auf einem Plattform befindet die sich bewegt, wird er nicht vom Plattform mitgenommen sondern die Plattform bewegt sich weiter und der Player fällt auf dem Boden. Bisher habe ich das immer mit der Transport Komponente des Players gelöst aber ich denke mal da gibt es bestimmt elegantere Methoden anstatt die Transport Komponente des Player an das bewegendes Objekt anzupassen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...