Jump to content
Unity Insider Forum

bräuchte mal etwas hilfe bei einem collisions script


kruemel

Recommended Posts

Hi Leute.

 

Ich bräuchte mal etwas Hilfe bei einem Collisions script mit javascript.

 

ich habe da nun schon einiges probiert aber nichts klappt wie es soll.

 

zu meinem vorhaben:

 

ich würde gerne eine art Tetris version machen (keine ahnung wie diese game art genau heist ^^°) wo sich bei berÜhrung von minimum drei gleichen farben die jeweiligen steine auflösen.

 

Allerdings soll diese abfrage in jedem stein selber ablaufen und auch somit selber prüfen ob sich die benachbarten steine trefen und welche farbe diese haben.

 

deshalb habe ich in den würfeln eine art + (kreuz) als colider gebaut welche etwas größer als der würfel ist um die anderen bei berührung zu überprüfen etc.

 

nur leider klappt das maximal mit 2 steinen und bei 3 nur wenn diese sich direkt zur gleichen zeit treffen.

 

Daher bräuchte ich etwas hilfe bei der umsetzung von euch profis :-)

 

leider bekomme ich das nicht direkt in ein javascript gebaut das der würfel selber mit zählt und auch versteht wenn er schon 2 berührungen hat das eine dritte irgendwann hinzukommt.

 

bisher sieht das grund gerüst in etwa so aus:

 

function OnCollisionEnter(collision : Collision) {
if (collision.gameObject.name == "wuerfelblau")
{
collblau = true;
}

if (collblau == true)
{
zaehlen = zaehlen + 1;
collblau = false;
}

if (zaehlen > 2)
{
Destroy(gameObject);
}
}

function OnCollisionExit(collision : Collision) {
if (collision.gameObject.name == "wuerfelblau")
{
zaehlen = 1;
}
}

 

 

ist es eigentlich überhaupt möglich die ganzen abfragen jeweils IN den würfeln einzeln mit collider zu verwirklichen?

 

habe natürlich rigidbody etc alles soweit eingestellt.

wenn ich "if (zaehlen > 1)" einstelle klappt es immerhin schonmal mit 2 würfeln

 

hoffe wirklich ihr könnt mir da weiterhelfen.

 

liebe grüße kruemel :-)

 

 

p.s. könnte bitte ein admin den tippfehler in der überschrift bei "holfe" in "hilfe" ändern ^^° danke :-)

Link zu diesem Kommentar
Auf anderen Seiten teilen

ich würde gerne eine art Tetris version machen (keine ahnung wie diese game art genau heist ^^°) wo sich bei berÜhrung von minimum drei gleichen farben die jeweiligen steine auflösen.

Puzzle? :)

 

p.s. könnte bitte ein admin den tippfehler in der überschrift bei "holfe" in "hilfe" ändern ^^° danke :-)

Hab ich gemacht. Nur so als Tipp: Du kannst den Titel bearbeiten indem du auf Bearbeiten klickst, und danach auf "Zum vollwertigen Editor wechseln".

 

Aber mal zum Thema: Ich würde das auf keinen Fall über OnCollisionEnter lösen. Dein Spiel enthält Blöcke, die genau Fläche auf Fläche stoßen und dabei mit einem Abstand von 0 aneinander vorbei gehen. OnCollisionEnter ist für sowas unheimlich inkonsistent und zuverlässig.

Es gibt zwei Möglichkeiten für solche Spiele.

Die eine ist, dass du die Physik-Engine kompleet raus nimmst. Keine Collider, nix. Dann baust du das Spiel quasi so, wie die Leute das damals auf dem NES oder GameBoy gemacht haben - die hatten nämlich auch keine Physik-Engine dafür zur Hand :)

Die andere Möglichkeit ist vermutlich etwas einsteigerfreundlicher. Du lässt die Collider drin, aber benutzt Raycasts statt OnCollisionEnter. In Abhängigkeit davon, wie du die Steine bewegst, detektierst du, wenn ein Stein abgesetzt wurde (geht auch mit Raycasts). Anschließend schickst du vom Mittelpunkt oder der Außenkante deines Steins einen Raycast für jede Richtung und schaust wo der landet. Damit kriegst du sehr viel zuverlässigere Ergebnisse.

Link zu diesem Kommentar
Auf anderen Seiten teilen

aaarg genau puzzle game ^^°°°

 

ah ok danke das mit dem Raycast leuchtet ein besser diese zu verwenden.

Ich habe mir gerade auch das tutorial von dir durch gelesen um meine errinerungen etwas aufzufrischen.

 

soweit habe ich nun im kopf wie es in etwa klappt aber da sehe ich so denke ich genau das gleiche problem wie vorher.

 

wenn ich zum beispiel 3 blöcke nebeneinander habe ( ooo ) und es mit den Raycast mache prüft dieser ja dann auch anhand vom objekt namen ob es die gleiche farbe ist oder nicht.

 

somit würde der erste block links merken das noch einer rechts daneben liegt und somit 2 zählen.

Das gleiche würde auch beim ganz rechten block sein und auch 2 zählen.

Der mittlere allerdings kann ja logisch so auch in beide richtungen prüfen und bekommt links und rechts jeweils ein true zurück und zählt somit dann mit sich selber 3 und würde sich dann ordentlich auflösen da ja 3 blöcke zusammen sind.

Die beiden äusseren allerdings bleiben dabei bei 2 im zähler da diese ja jeweils nur einen würfel auf einmal ertasten würden.

 

genau das ist mein problem welches ich nicht ganz hin bekomme das diese sich somit auch mit auflösen :-(

Das ganze hätte ich am liebsten auch nur in dem einem script in den würfeln wenn es überhaupt geht.

verstehe nur leider nicht ganz wie ich das hin bekomme.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Geh die Sache doch mal anders an.

Es ist wahrscheinlich so, dass die Blöcke imm an definierbaren Positionen oder Bereichen sein werden.

Also könntest du das Spielfeld doch in ein 2D Array abbilden, wo sich jeder Block, wenn er denn liegt, rein schreibt.

So könnte der ein Block auf Y=1 und X= 4 liegen und rot sein. Ein Anderer wäre auf Y=1 und X = 5 und ein Weiterer auf Y =1 und X = 6.

In deinem Array würde jetzt an den Positionen [1,4] [1,5] und [1,6] jetzt ein Wert der die Farbe Rot wiederspiegelt. Oder vielleicht auch ein String mit dem Wort Rot.

Ein Berechnungsscript fragt jetzt das ganze Array Stelle für Stelle ab, nachdem z.B. ein Zug gemacht wurde, schaut sich die erste Position an und guckt gleich ob die 2te Position die gleiche Farbe hat. Wenn ja, dann schaut er auch nach der dritten Position. Ist die Position auch mit dieser Farbe belegt, dann hättest du ein 3er und würdest diese 3 Positionen in ein anderes Array, eine Liste oder ein Dictionary schreiben.

Wäre es nicht so, dann schaut das Script in eine andere Richtung (vorher war horizontal, jetzt ist vertikal) und prüft wieder die Nachbarn.

So wird das ganze Array durchlaufen und alle zusammenhängende Klötze werden ermittelt. Die ermittelten Positionen werden nach dem Durchlauf von den Klötzen abgefragt und mit der eigenen Position verglichen. Ja und wenn da die eigene Position mit bei ist, dann zerstört sich der Klotz und löscht sich auch aus dem Array raus.

Das wäre also eine Möglichkeit mit einem zentralen Script soetwas zu machen. Ohne Collider und ohne Raycast.

 

Du kannst natürlich auch den Würfeln selbst eine Überwachung einbauen, wo jeder Würfel nach seinen Nachbarn schaut. Das wäre dann fast wie A* Pathfinding, wo jede Position sich selbst eine Wertigkeit gibt, weil er seine Nachbarn und auch deren Werte überprüft.

Gehen tut das auch, aber ich finde das sehr abstrakt, denn wenn es nicht nur 3er geben soll, sondern auch T-Formen oder 4er und 5er. Dann wird es unübersichtlich. Und vorallem ist es ja nicht mit dem Destroy getan, sondern du musst ja auch Punkte zählen. Welcher Würfel soll das aber übermitteln?

Aus diesem Grund ist meiner Meinung nach ein zentrales Berechnungsscript besser dafür. Und wohl auch performanter.

Link zu diesem Kommentar
Auf anderen Seiten teilen

ahhh ok das wäre auch eine idee...

...allerding bekomme ich das denke ich mal nicht wirklich so umgesetzt leider :-(

 

vorallem habe ich mit den blöcken etc noch mehr vor als nur 2D.

Es soll später noch weiter in andere ebenen in 3D ausgebaut werden weshalb ich es lieber mit raycasts oder collider mache.

 

hm...

bzw kann ich eigentlich auch raycasts und OnColliderEnter etc miteinander in einem skript einbauen?

 

dann hätte ich ja somit 2 abfragen erst die eine raycasts abfrage und wenn ein block also der mittlere 3 zählt dann den collider in diesem würfel aktivieren und das würden dann die restlichen blöcke messen und auch auf 3 springen und so wäre das doch eine ketten reaktion und alle sollten sich auflösen von der gleichen farbe oder irre ich mich da?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Da du das später noch erweitern möchtest, spricht das Ganze erst recht für Malzbie´s Vorschlag. In der Spieleentwicklung geht es halt auch oft darum, Probleme zu lösen, indem man etwas Neues lernt. Nur weil man es nicht kann, auf eine schlechte Variante zu wechseln, wird dir auf lange Sicht nur schaden. Ich kann dir nur als weiterer User davon abraten, OnTriggerEnter zu nutzen. Nutze Raycasts! Die sind leicht zu benutzen und richtig eingesetzt, sehr verlässlich. Ein Array anzulegen wäre auch aus meiner Sicht die sauberste Lösung. Es ginge wenn es sein muss, auch ohne. Ob das aber unterm Strich einfacher wird....ich weiss nicht.

Link zu diesem Kommentar
Auf anderen Seiten teilen

klar möchte ich auch gerne etwas neues erlernen :-)

das problem ist nur nun nach den ganzen vorschlägen weis ich nicht mehr wie ich es am besten angehen soll :-(

 

mir persöhnlich wäre es mit Raycasts ,Collidern und Triggern etc schon um einiges lieber da ich dort gerade bei bin die richtigen erfahrungen zu sammeln.

 

Das mit dem umgang der Raycasts und deren abfrage finde ich schon sehr originel.

nur wie bekomme ich die abfragen in die jeweiligen richtungen genau hin.

Also links, rechts, vorne, hinten etc ?

 

Glaube das mit dem scripten im Array bereich da bin ich leider noch nicht so weit wobei es auch ziemlich interessant aus sieht das irgendwann mal ausgiebig umzusetzen.

 

Hoffe ihr könnt mir dennoch etwas zur hand gehen :-)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich finde Raycasts für das Vorhaben auch gar nicht schlecht. Da kann man viel einfacher den Überblick behalten, was man da macht.

Ich nehme stark an, du benutzt 2D-Physik, also Collider2D. Dann brauchst du auch die Methoden aus der Physics2D-Klasse:

var hit = Physics2D.Raycast(transform.position, Vector2.down, blockSize);
if(hit.collider)
{
 //Unter uns ist etwas
}

Die Parameter sind, in dieser Reihenfolge: Der Startpunkt, die Richtung und die Länge des Raycasts.

 

Alternativ zum Raycast kannst du auch OverlapBox benutzen. Diese Methode geht nicht von A nach B, sondern überprüft einmalig beim Ausführen, ob sich die gegebene Box mit Collidern überschneidet.

var hitCollider = Physics2D.OverlapBox(transform.position + Vector2.down, blockSize / 2, 0);
if(hitCollider)
{
 //Unter uns ist etwas
}

Man beachte die anderen Parameter.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hm 2D Phisik... nuja es ist und soll ja alles in 3D werden ^^°

bin mit den Raycasts gerade am üben und am experimentieren und verstehe daher deine befehle noch nicht so ganz.

 

kannst du das evtl etwas erläutern?

das wäre sehr hilfreich.

 

 

bzw noch eine andere frage:

Ist es eigentlich möglich ein OnCollisionEnter mit einem bestimmten objekt namen auch wieder mit einem OnCollisionExit und einem bestimmten Objektnamen zu lösen?

wenn ja wie?

 

function OnCollisionExit(collision : Collision) {

if (collision.gameObject.name == "Cubetest")
...etc...

 

...klappt leider nicht so ganz :-/

Link zu diesem Kommentar
Auf anderen Seiten teilen

Klar habe ich das alles mit genommen und versuche das auch gerade umzusetzen :)

Aber ich versuche auch meine erste version umzusetzen und möchte dann vergleichen für mich selber was nachher wirklich besser und einfacher ist ^_^

Ich teste immer auch gerne mehrere wege zum ziel ;)

 

Also die grafik soll natürlich 3D sein.

Das gameplay hat natürlich später auch kamera fahrten/zoom`s mit dabei etc.

Deshalb denke ich wohl doch eher das der aufbau zweidimensional ist aber die würfel müssen am besten auch vorne und hinten abtasten können.

deshalb wohl doch eher 3D oder? :blink:

 

Aber auch nochmal kurz zu meiner frage wegen dem OnCollisionExit.

Ist das auch so möglich wie oben erwähnt?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Solange das Gameplay, und da gehören Kamerafahrten und andere grafische Elemente nicht dazu, zweidimensional ist, ersparst du dir eine Menge Ärger, wenn du auch 2D-Physik nimmst. Wenn du wirklich hast, dass Würfel nicht nur nach links, rechts, oben und unten gehen, sondern sich wirklich auch nach vorne und hinten bewegen und das einen Einfluss auf das Spielgeschehen hat, nur dann solltest du 3D-Physik benutzen.

 

Meine vorheriger Post bezog sich übrigens darauf, dass du direkt davor wieder ein OnCollision-Event genommen hast, wovon wir dir ja durchweg abgeraten haben ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ah ok.

 

also die würfel bewegen sich natürlich nur in der 2D Ebene und nicht nach vorne oder hinten.

nur die abfrage sollte dort natürlich erfolgen.

 

Bin da auch gerade am rum experimentieren aber es will dann doch nicht so ganz wie es soll.

Aber denke bin auf nem guten wege.

 

Gibt es eigentlich auch die möglichkeit zu überprüfen ob sich ein objekt bewegt in der y achse oder nicht...?

bzw das habe ich schon gefunden mit:

Position = target.transform.position.y;

kann man das ja auslesen wohin es sich bewegt etc.

 

aber ich würde gerne eine abfrage einbauen das etwas passiert sobald der würfel z.b. 1 sek stillsteht.

 

ich finde da nur nicht die passende abfrage dafür :unsure:

und langsam gehen mir die ideen aus :blink:

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...