hankey Geschrieben 12. Oktober 2015 Melden Share Geschrieben 12. Oktober 2015 Guten Abend Leute, habe das Problem, dass ich es nicht hinkriege, einen 2D Shooter zu erstellen, der ein Projektil in Richtung der Maus schießt. Habe sämtliche Foren abgeklappert aber die bringen mir irgendwie nicht viel, da ich nicht weiß, wo mein Fehler ist. Das Projektil-Prefab sollte ja eigentlich nur Destroy() aufrufen. Der Controller, der sich um das schießen kümmert, speichert die Mausposition in einem Vector3 und erstellt dann mit Instantiate das Prefab, so sollte es eigentlich in der Theorie sein. Als Transform Komponente habe ich den Helden (Das sollte ja der Output für das Projektil sein). public GameObject bullet. public Transform output; Instantiate(bullet, output.position, Quaternion.identity); bullet.GetComponent<Rigidbody2D>().velocity = output.TransformDirection(Vector3.forward * 75 ); Hoffe ihr könnt mir bei meinem kleinen Problem weiterhelfen. Grüße hankey Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Hrungdak Geschrieben 13. Oktober 2015 Melden Share Geschrieben 13. Oktober 2015 Instantiate erzeugt ein neues Gameobjekt und nimmt bullet als Vorlage dafür her. Du musst jetzt das NEUE Gameobjekt, also die Kopie, weiter manipulieren. Dazu musst du dir die Kopie erst mal merken: GameObject newBullet = Instantiate(bullet, output.position, Quaternion.identity); Jetzt kannst du die Kopie bearbeiten: newBullet.GetComponent<RigidBody2D>().velocity = ... Ich nehme an, "output" ist das Gameobject, das die Richtung vorgibt? Dann musst du die Ausrichtung von Output nehmen, um die newBullet zu steuern. Dazu benutzt du output.transform.forward: newBullet.GetComponent<RigidBody2D>().velocity = output.transform.forward * 75; Ich habs nicht probiert, aber das sollte dich zumindest in die richtige Richtung lenken. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Tiwaz Geschrieben 13. Oktober 2015 Melden Share Geschrieben 13. Oktober 2015 Eine Kleinigkeit noch: Du willst ja die Kugel vom Held aus verschießen und zwar in Richtung des Mauszeigers.. Also dürftest du denke ich nicht output.transform.forward nehmen, sondern (Pseudocode) newBullet.RigibodyVelocity = (MauszeigerPosition - HeldPosition) * Speed; @edit: Denn ich denke nicht, dass sich dein Held immer zur Mausposition dreht, sondern stehen bleibt ^^ Es sei denn "output" ist der Arm deines Helds, der sich dann tatsächlich zur Maus hindreht (aber selbst wenn kannst du das so machen) Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
hankey Geschrieben 13. Oktober 2015 Autor Melden Share Geschrieben 13. Oktober 2015 Alles klar, habe jetzt die Mausposition vorerst gespeichert. public Vector2 mousePos; mousePos = Camera.main.ScreenToWorldPoint (Input.mousePosition); Das mit dem "output" habe ich jetzt an eine Child-Komponente gepackt. Dabei ist es ja egal ob es sich dreht. bulletshoot.GetComponent<Rigidbody2D>().velocity = (mousePos - output.position) * 75; Natürlich tut sich etwas, nur kann ich das Prefab weder erkennen (Was vielleicht am Prefab selbst liegen könnte), noch schießt es zur Maus, so wie ich es mitbekomme. @edit: Denke es ist echt ein Prefab Fehler. Gibt es etwas besonders vielleicht, was ich dabei beachten sollte? Grüße hankey Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
malzbie Geschrieben 13. Oktober 2015 Melden Share Geschrieben 13. Oktober 2015 Das Prefab wird instanziert, aber du siehst es nicht? Kann es sein, dass es verdreht instanziert wird, du also evtl. von hinten drauf guckst? Schieß mal, drück danach Pause und such es mal in der Szene. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Tiwaz Geschrieben 13. Oktober 2015 Melden Share Geschrieben 13. Oktober 2015 Wird es denn überhaupt instanziert? Kannst ja mal in der Hierarchy schauen ob da wirklich ein neues (Clone) Objekt erstellt wird Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
hankey Geschrieben 13. Oktober 2015 Autor Melden Share Geschrieben 13. Oktober 2015 Ja, das Clone Objekt wird erstellt und der trifft ja auch den Gegner, dieser wird ja dann auch zerstört. BIn etwas rumgelaufen ingame und auch mal in andere Richtungen geschossen, der Gegner verschwindet doch das Projektil bleibt unsichtbar. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Hrungdak Geschrieben 13. Oktober 2015 Melden Share Geschrieben 13. Oktober 2015 Wenn du das Prefab direkt in die Szene ziehst, siehst du es dann? Zeig mal deinen Hierarchiebaum. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
hankey Geschrieben 13. Oktober 2015 Autor Melden Share Geschrieben 13. Oktober 2015 Guter Tipp! Habe es mal in die Szene gelegt und es scheint, dass das Objekt unsichtbar ist. Layer habe ich überprüft und Textur auch erneut draufgepackt, ich versuch' mal etwas rumzubasteln. @edit: Ok, der Sprite Renderer war aus irgendwelchen Gründen deaktiviert, sehr doof von mir @edit2: Soweit sogut. Der Held schießt jetzt und die Projektile sind nun sichtbar. Er schießt auch manchmal in Richtung der Maus, aber halt nicht immer. Habe die Positionsererkennung der Maus jetzt in die FIxedUpdate Methode gepackt. Benutzt habe ich auch mal: bulletshoot.GetComponent<Rigidbody2D>().AddForce((mousePos - output.position)*250); Ob ich das obere benutze oder dies: bulletshoot.GetComponent<Rigidbody2D>().velocity = (mousePos - output.position) * 10; es wird immer ein projektil neben den helden erscheinen der sich kaum bewegt. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Hrungdak Geschrieben 14. Oktober 2015 Melden Share Geschrieben 14. Oktober 2015 es wird immer ein projektil neben den helden erscheinen der sich kaum bewegt. Verstehe ich nicht ganz. Soll sich der Held denn bewegen? Kannst du das mal in einem Bild zeigen? Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
hankey Geschrieben 14. Oktober 2015 Autor Melden Share Geschrieben 14. Oktober 2015 Habe mal ne Gif gemacht, die das ganze besser erklären sollte http://gph.is/1K884lz Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Hrungdak Geschrieben 14. Oktober 2015 Melden Share Geschrieben 14. Oktober 2015 Als erstes würde ich den Richtungs-Vector normalisieren. Also etwa so: Vector3 targetVector = (mousePos - output.position).Normalize(); bulletshoot.GetComponent<Rigidbody2D>().AddForce(targetVector*250); Damit erreichst du, dass das Bullet immer gleich schnell ist. Das Verhalten erfordert ein wenig Fehlersuche. Du könntest z.B. einen Ray ausgeben lassen, der vom Spieler zur Mausposition zeigt: Debug.DrawRay(output.position, targetVector); Der targetVector ist der von dem Code darüber. Das zeichnet eine Linie vom Spieler in Richtung Mauszeiger. Einfach mal als Test in die Update-Methode rein. Wenn das alles funktioniert und das Verhalten trotzdem so bleibt, müsstest du mal etwas mehr Code zeigen. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
hankey Geschrieben 14. Oktober 2015 Autor Melden Share Geschrieben 14. Oktober 2015 Das mit dem ray klappt ganz gut, er schießt einen Strahl in Richtung Maus. Das Problem was noch ist: Wenn der in den -y bereich geht, also links vom charakter, dann schießt er nicht mehr vernünftig. Außerdem bewegt sich der Charakter zu dem Punkt wo sich die Maus befindet, das sollte eigentlich ja auch nicht sein. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Hrungdak Geschrieben 14. Oktober 2015 Melden Share Geschrieben 14. Oktober 2015 Das mit dem ray klappt ganz gut, er schießt einen Strahl in Richtung Maus. Das Problem was noch ist: Wenn der in den -y bereich geht, also links vom charakter, dann schießt er nicht mehr vernünftig. Außerdem bewegt sich der Charakter zu dem Punkt wo sich die Maus befindet, das sollte eigentlich ja auch nicht sein. Na ja, der charakter macht nur das, was du ihm sagst. Wenn er sich also bewegt, muss irgendwo eine Codezeile sein, die das veranlasst. Wenn du mal mehr von deinem Code zeigst, kann ich dir vielleicht besser helfen. Wenn der Debug-Ray funktioniert, dann stimmt zumindest schon mal die Richtung, in die die Kugel geschubst wird. Ich denke, dass der Fehler wo anders liegt. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
hankey Geschrieben 14. Oktober 2015 Autor Melden Share Geschrieben 14. Oktober 2015 Ich zeige dir mal meinen Code. void FixedUpdate(){ //Position der Maus ermitteln mousePos = Camera.main.ScreenToWorldPoint (Input.mousePosition); mousePos.z = 0; } void Update () { //Armbrust ausgerüstet? if(Input.GetKeyDown (KeyCode.Alpha2)) bow = !bow; //Wenn ja, schießen if(Input.GetMouseButtonDown(0) && bow == true){ //Spiel den Sound des Bolzenschusses AudioSource.PlayClipAtPoint(boltshot,transform.position, volume); //Erstellen des Gameobjects, dass die Prefabs speichert, merke also die kopie ... GameObject bulletshoot = (GameObject) Instantiate(bullet, output.position, Quaternion.identity); //output.position targetVector = (mousePos - output.position); targetVector.Normalize(); //Zeigt den Strahl an Debug.DrawRay(output.position, targetVector); bulletshoot.GetComponent<Rigidbody2D>().AddForce(targetVector*250); //Debuggen Debug.Log("Es wird anscheinend geschossen"); } } @Edit: Problem behoben! Lag an den Layern. Das Projektil kam nich durch den Spieler und hat ihn nur durch die gegend bewegt dadurch, jetzt wo alles auf anderen layern liegt und nicht mehr kollidiert, funktioniert alles. Ich bedanke mich mal an alle fleißigen Helfer hier Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Recommended Posts
Archiviert
Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.