Jump to content
Unity Insider Forum

SyntaxTalkstoMe

Members
  • Content count

    14
  • Joined

  • Last visited

Community Reputation

0 Neutral

About SyntaxTalkstoMe

  • Rank
    Member

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

  1. SyntaxTalkstoMe

    Verständnis Frage Mouse Position

    Danke für die Antwort. Verstanden. 👍
  2. SyntaxTalkstoMe

    Verständnis Frage Mouse Position

    Salve, In dem Sidescroller den ich grade baue, soll die Spielerfigur Feuerbälle schießen können. Der Ausgangspunkt soll dabei natürlich der Spieler sein. Um die Mouse Position abzufragen, hatte ich Vector2 mousePosi = Input.MousePosition; Diesen Vector Wert, wollte ich dann der Startposition hinzuaddieren. Irgendwie hatte sich dass dann so überhaupt nicht so funktioniert, wie ich es wollte. Dann hatte ich gegoogelt und fand diese Lösung Vector3 worldMousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition); Jetzt frage ich mich, wo jetzt da genau der Unterschied sein soll? Die Szene hat ja ein Koordinatennetz. Und es spielt ja eigentlich keine Rolle wo die Kamera ist, die Koordinaten sind ja unabhängig. Vielleicht hab ich auch eine völlig falsche Vorstellung von der Sache. Evtl kann mir jemand da den Unterschied erklären.
  3. SyntaxTalkstoMe

    2D Sidescroller Movement Problem

    Ich hab es so getan wie du es gesagt hast. Es hat tatsächlich funktioniert. Das mit dem >= 0 z.b, hat das "flackern" gelöst. Was an sich ja auch logisch ist. Weil "0" muss ja auch abgehandelt werden. Dann kam aber ein anderes Problem zum Vorschein. Die Bewegung hat an sich funktioniert. Aber ab und an hat er sich verhaspelt was die Richtung anbelangt. Ausgelöst wird es, wenn ich mal wirklich schnell die taste a und d drücke, also quasi ganz schnell versuche Richtungswechsel zu vollführen. Der Code an sich funktioniert aber. Hast du dafür eine Lösung, oder Idee wie man das vermeiden könnte?
  4. SyntaxTalkstoMe

    2D Sidescroller Movement Problem

    Moin, ich bin noch sehr neu was Unity anbelangt. Mein Wissen beschränkt sich hauptsächlich auf ein Tutorial von Malzbier dass ich mal durchgearbeitet hatte. Jetzt habe ich vor einen Sidescroller zu bauen. Dieser soll auf die Physic Engine verzichten, wobei ich mir gar nicht mehr so sicher bin, ob das eine gute Idee ist. Jedenfalls hat das Problem, nichts damit zu tun. Hier ist erstmal der Code: void Awake() { rb2d = GetComponent<Rigidbody2D>(); anim = GetComponent<Animator>(); renderer = GetComponent<SpriteRenderer>(); } private void Start() { facingLeft = true; } private void FixedUpdate() { moveX = Input.GetAxis("Horizontal") * speed * Time.deltaTime; // Nach rechts laufen if (Input.GetKey("d")) { facingLeft = false; facingRight = true; Flip(); transform.Translate(moveX, 0, 0, Space.World); anim.SetBool("walk", true); } else //anim.SetBool("walk", false); // Nach links laufen if (Input.GetKey("a")) { facingLeft = true; facingRight = false; Flip(); transform.Translate(moveX, 0, 0, Space.World); anim.SetBool("walk", true); } //else anim.SetBool("walk", false); private void Flip() { if (moveX < 0 && facingRight) { Vector3 thescale = transform.localScale; thescale.x *= -1; transform.localScale = thescale; } else if (moveX > 0 && facingLeft) { Vector3 thescale = transform.localScale; thescale.x *= -1; transform.localScale = thescale; } Das ist mittlerweile ein Versuch von vielen, der aber aktuell am vielversprechensten ist. Drücke ich "a" läuft der Charakter wie gewünscht nach links. Drücke ich allerdings "d", läuft er zwar nach rechts, allerdings geschieht kein Flip. Halte ich aber "a" gedrückt und dann "d", dann vollzieht er den Flip und guckt nach rechts. Ich bin mir fast sicher, dass es was mit den bools zu tun hat und dem Tastendrücken und das da irgendwas nicht so läuft wie es soll. Vermutlich ein Logikfehler. Man habe bitte wie gesagt Nachsicht mit mir. Ich muss noch dazu sagen, dass der Charakter, sobald das Spiel beginnt, nach links schauend startet. Danke im Voraus
  5. SyntaxTalkstoMe

    A-Star Algorythmus

    Guten Tag zusammen, ich wollte mal nach eurer Meinung fragen, was diese Codezeilen angeht. Und zwar handelt es sich um einen AStar. Ich und ein Kumpel hatten bereits einen A-Star in Windows Forms programmiert, der auch funktioniert hatte. Nun versuchen wir das ganze aber nach Unity zu übertragen. Ich muss hervor heben, dass uns Bewusst ist, dass es dafür eigene Klassen gibt in Unity um eine Wegfindung einzubauen. Aber ich muss betonen, dass wir es bewusst anders machen wollten, gegen dass ja an sich nichts spricht. Nun ist es so, dass es offenbar an Unity spezifischen Dingen scheitert. Logikfehler kann ich gegenwärtig auch noch nicht ausschließen. Aber vielleicht ist hier jemand bewandert in der Arbeitsweise eines A-Stars und kann uns einen Tipp geben woran es scheitert. 1. Erster Fehler ist, dass er offenbar aus irgendeinen Grund evtl nur wenige Felder um sich überprüft und dann irgendwo stecken bleibt. 2. Der wichtigste Fehler für mich wäre, warum das Monster dass den Spieler sucht, durch Wände durchgehen kann. Die Überprüfung sagt ja aus "Was wäre wenn dort eine Wand steht". Wir hatten verschiedene Dinge getestet. Bounds, Intersect, Contains. Die Wände sind Quads mit einem BoxCollider2D drauf. 3. Der Kollisionsdummy ist nur zu Testzwecken da. Ich wäre euch sehr dankbar, wenn ihr zumindest Fehler 2 aufdecken könntet using System.Collections; using System.Collections.Generic; using System.IO; using System.Linq; using UnityEditor; using UnityEngine; public class AStar : MonoBehaviour { public List<Node> openList = new List<Node>(); public List<Node> closedList = new List<Node>(); public GameObject player; public float speed = 0.5f; public float gridSize = 0.2f; public GameObject gelberPunkt; public GameObject punkt; GameObject[] wandListe; static List<GameObject> walls; Bounds[] bounds; Node aktuelleNode; Vector3 nextTarget; Rigidbody2D festkoerper; GameObject kollisionsDummy; void Start() { kollisionsDummy = new GameObject(); kollisionsDummy.AddComponent<BoxCollider2D>(); kollisionsDummy.GetComponent<BoxCollider2D>().size = gameObject.GetComponent<BoxCollider2D>().size; kollisionsDummy.transform.position = new Vector2(-999999, -999999); nextTarget = gameObject.transform.position; festkoerper = GetComponent<Rigidbody2D>(); //Ermittelt die Bonds der Wandflächen if (wandListe == null) { wandListe = GameObject.FindGameObjectsWithTag("wand"); bounds = new Bounds[wandListe.Length]; for (int i = 0; i < wandListe.Length; i++) { bounds[i] = wandListe[i].GetComponent<Collider2D>().bounds; } } } private void Update() { if (Vector3.Distance(gameObject.transform.position, nextTarget) < 0.001f) { // print("Ich bin ins Pathfinding reingesprungen"); Pathfinding(); } //print("Gameobject posX " + gameObject.transform.position.x + "GameObject posY: " + gameObject.transform.position.y); //print("nextTarget posX " + nextTarget.x + "nextTarget posY: " + nextTarget.y); Vector3 richtung = (nextTarget - gameObject.transform.position); festkoerper.MovePosition(gameObject.transform.position + richtung.normalized * Time.deltaTime * speed); } public void Pathfinding() { openList.Clear(); closedList.Clear(); bool fertig = false; Node startNode = new Node(); // startpunkt startNode.letzteNode = null; startNode.posi = transform.position; startNode.laengeAktuelleNodeZumZiel = Vector3.Distance(player.transform.position, startNode.posi); // Geschätzte Länge Start <-> Ziel startNode.laengeAktuelleNodeZumStartPunkt = 0; startNode.gesamtWegLaenge = startNode.laengeAktuelleNodeZumStartPunkt + startNode.laengeAktuelleNodeZumZiel; closedList.Add(startNode); aktuelleNode = startNode; int end = 10; while (end > 0) // !fertig { List<Vector3> richtungsKoordinaten = new List<Vector3>(); // Erstelle angrenzende Nodes und füge sie zur openList hinzu, falls noch // nicht in der openList enthalten und falls nicht von einem Collider blockiert richtungsKoordinaten.Add(aktuelleNode.posi + Vector3.up * gridSize); // Nord richtungsKoordinaten.Add(aktuelleNode.posi + (Vector3.up + Vector3.right) * gridSize); // Nordost richtungsKoordinaten.Add(aktuelleNode.posi + Vector3.right * gridSize); // Ost richtungsKoordinaten.Add(aktuelleNode.posi + (Vector3.down + Vector3.right) * gridSize); // Suedost richtungsKoordinaten.Add(aktuelleNode.posi + Vector3.down * gridSize); // Sued richtungsKoordinaten.Add(aktuelleNode.posi + (Vector3.down + Vector3.left) * gridSize); // SuedWest richtungsKoordinaten.Add(aktuelleNode.posi + Vector3.left * gridSize); // West richtungsKoordinaten.Add(aktuelleNode.posi + (Vector3.left + Vector3.up) * gridSize); // NordWest //Prüfe, ob sich die Positionen schon in der openList befinden //foreach (Node item in openList) //{ // print("OpenList Eintrag x: " + item.posi.x + " y: " + item.posi.y); //} foreach (Node item in openList) { for (int i = 0; i < richtungsKoordinaten.Count; i++) { if (item.posi == richtungsKoordinaten[i]) { richtungsKoordinaten.RemoveAt(i); i--; } } } foreach (Node item in closedList) { for (int i = 0; i < richtungsKoordinaten.Count; i++) { if (item.posi == richtungsKoordinaten[i]) { richtungsKoordinaten.RemoveAt(i); i--; } } } for (int j = 0; j < richtungsKoordinaten.Count; j++) { for (int i = 0; i < bounds.Length; i++) { kollisionsDummy.transform.position = new Vector2(-0.8f, -1.3f); // richtungsKoordinaten[j]; print("Dummy Position: " + kollisionsDummy.transform.position); print("Dumm Bounds Size: " + kollisionsDummy.GetComponent<BoxCollider2D>().bounds.size); if (bounds[i].Intersects(kollisionsDummy.GetComponent<BoxCollider2D>().bounds)) // kollisionsDummy.GetComponent<BoxCollider2D>().bounds { print("Kollision stattgefunden: " + richtungsKoordinaten[j]); richtungsKoordinaten.RemoveAt(j); j--; break; } } } //openList mit verfügbaren Nodes befüllen for (int i = 0; i < richtungsKoordinaten.Count; i++) { CreateNode(richtungsKoordinaten[i], aktuelleNode); } // Sortiere openList aufsteigend nach der Gesamtweglänge Node speicher; for (int j = openList.Count - 1; j > 0; j--) { for (int i = 0; i < j; i++) { if (openList[i].gesamtWegLaenge > openList[i + 1].gesamtWegLaenge) { speicher = openList[i]; openList[i] = openList[i + 1]; openList[i + 1] = speicher; } } } // Setze Node mit der kleinsten Gesamtweglänge aus der openList in die closedList if(openList.Count > 0) { closedList.Add(openList[0]); aktuelleNode = openList[0]; openList.RemoveAt(0); } //foreach (Node item in openList) //{ // GameObject punktGelb = Instantiate(gelberPunkt); // punktGelb.transform.position = item.posi; //} GameObject roterPunkt = Instantiate(punkt); roterPunkt.transform.position = aktuelleNode.posi; Vector3 playerStandort = player.transform.position; for (int i = 0; i < openList.Count; i++) { if ((Vector3.Distance(playerStandort, openList[i].posi) <= 0.001f)) { fertig = true; Node naechsterWegpunkt = openList[i]; while (true) { if (naechsterWegpunkt.letzteNode == startNode) { break; } naechsterWegpunkt = naechsterWegpunkt.letzteNode; print("naechsterWegpunkt wird befüllt"); } nextTarget = naechsterWegpunkt.posi; } } end--; for (int i = 0; i < closedList.Count; i++) { print("Inhalt closed" + closedList[i]); } } } public void CreateNode(Vector3 pos, Node lastNode) { Node neueNode = new Node(); neueNode.posi = pos; neueNode.letzteNode = lastNode; neueNode.laengeAktuelleNodeZumZiel = Vector3.Distance(player.transform.position, neueNode.posi); neueNode.laengeAktuelleNodeZumStartPunkt = neueNode.letzteNode.laengeAktuelleNodeZumStartPunkt + Vector3.Distance(neueNode.posi, neueNode.letzteNode.posi); neueNode.gesamtWegLaenge = neueNode.laengeAktuelleNodeZumZiel + neueNode.laengeAktuelleNodeZumStartPunkt; openList.Add(neueNode); } public class Node { public float laengeAktuelleNodeZumStartPunkt; public float laengeAktuelleNodeZumZiel; public Vector3 posi; public Node letzteNode; public float gesamtWegLaenge; } }
  6. SyntaxTalkstoMe

    Animator / Variable Verständnisfrage

    Hallihallo, ich bin aktuell fleissig das Tutorial von Malzbie durchzuarbeiten. Jetzt war ich wirklich einige Stunden mit einem Problem beschäftigt. Den Grund, auch wenn er mir nicht schlüssig ist, habe ich nur durch try and Error herausgefunden. Und zwar handelt es sich um diese schmucken Codezeilen: public bool schildAn; private Animator anim; // Use this for initialization void Awake() { anim = GetComponent<Animator>(); } // Update is called once per frame void Update() { if (schildAn) { anim.SetBool("schildAn", true); schildAn = false; StartCoroutine(MachAus()); } } IEnumerator MachAus() { yield return (new WaitForSeconds(0.5f)); anim.SetBool("schildAn", false); } } Wie ihr seht, heißt der bool am oberen Ende des Codes "schildAn". Dieser bekommt einen Zustand über eine Zuweisung. Also z.b "schildAn = false". Also wie in den Codezeilen. Um auf die Transitions im Animator zuzugreifen, nutze ich ja "anim.SetBool("schildAn", false)". Ich hatte im Animator anfangs einen anderen Namen als "schildAn" und da hat nichts geklappt. Jetzt heißt der "bool" im Animator genauso wie die "bool" Variable und nun geht es. Sicherheitshalber hatte ich aus Spaß den Namen der bool Variable geändert. Und siehe da, es ging wieder nicht. Es lag also definitiv daran. Ich verstehe nur nicht warum. Das sind doch zwei verschiedene paar Schuhe. Danke im Voraus und schöne Nacht noch
  7. SyntaxTalkstoMe

    Animation abspielen bei Objektzerstörung

    Danke. Ja die Lebenspunkte werden heruntergezählt nachdem eine Bullet den Meteor trifft. Das mit dem dem zerstörten Gameobject ist mir bewusst. Ich hatte mir diverse andere Tutorials angeschaut und muss sagen, dass dieses von Malzbie sehr gut ist. Ich werde jetzt komplett nochmal neu anfangen. Wenn ich es nachbaue, lerne ich es wie es funktioniert bzw das wie und warum. Aber danke für die Antworten. Gruß
  8. SyntaxTalkstoMe

    Animation abspielen bei Objektzerstörung

    Danke dir. Ich ziehs mir mal rein.
  9. SyntaxTalkstoMe

    Animation abspielen bei Objektzerstörung

    Ob das jetzt ein Gameobject ist, oder eine Animation, ist mir eigentlich egal. Es funktioniert nur nix
  10. SyntaxTalkstoMe

    Animation abspielen bei Objektzerstörung

    Ne geht leider auch nicht. Echt zum kotzen das Thema langsam. Ich werd mir jetzt irgendein Space Shooter von Unity Asset Store lade, und schauen, wie die es gemacht haben.
  11. SyntaxTalkstoMe

    Animation abspielen bei Objektzerstörung

    Hm, funktioniert leider auch nicht. Es wird keine Animation abgespielt. Ich hab den Code noch etwas abgeändert, was aber leider auch nicht zum gewünschten Ergebnis führt. Ich habe aber mittels einer Messagebox herausgefunden, dass er gar nicht in den If-Block reinspringt. Das bedeutet, dass er gar nicht merkt, sobald die Lebenspunkte des Asteroiden unter 1 fällt. Hier ist nochmal der Code: Die Objekte werden jedenfalls Ordnnungsgemäß zerstört. Es wird lediglich die Animation nicht abgespielt. Allerdings muss ich auch dazu sagen, dass ich noch ein anderes Scripts auf meiner Bullet habe. Die zerstört alles, was kein Spielergeschoss, Spieler oder Wand ist. Evtl sollte ich den Code auf die Bullet packen? Fragen über Fragen .... public class EnemyLifePoints : MonoBehaviour { public int lebensPunkte; public EnemyLifePoints lifePoints; public Animation explosion; public Transform shotSpawn; public Collider2D colli; private void Start() { lifePoints.lebensPunkte = 3; OnTriggerEnter2D(colli); } private void OnTriggerEnter2D(Collider2D collision) { if (lifePoints.lebensPunkte < 1) { EditorUtility.DisplayDialog("asdfa", "asdfasdf", "asdfasd"); IsDead(); } } void IsDead() { Instantiate(explosion, shotSpawn.position, shotSpawn.rotation); explosion.Play(); Destroy(gameObject); } }
  12. SyntaxTalkstoMe

    Animation abspielen bei Objektzerstörung

    Danke. Jetzt hat es funktioniert, die Animation in das Feld zu ziehen. Das System ist mir noch nicht so 100% sinnig. Aber es entwickelt sich Unity ist zwar OOP in Reinkultur, aber trotzdem bei den ersten Schritten etwas gewöhnungsbedürftig. So ich habe nun den Code geändert. Die Animation wird aber leider noch nicht abgespielt. public class EnemyLifePoints : MonoBehaviour { public int lebensPunkte; public EnemyLifePoints lifePoints; public Animation explosion; public Transform shotSpawn; private void Start() { lifePoints.lebensPunkte = 3; } private void OnTriggerEnter2D(Collider2D collision) { if(lifePoints.lebensPunkte < 1) { IsDead(); } } void IsDead() { Instantiate(explosion, shotSpawn.position, shotSpawn.rotation); Destroy(gameObject); } }
  13. SyntaxTalkstoMe

    Animation abspielen bei Objektzerstörung

    Hallo nochmal, danke für deine Antwort. Aber das Problem mit der Animation bleibt nach wie vor. Ich hab mal ein Screenshot gemacht. Unten ist auch eine Meldung, die dich aber nicht richtig deuten kann. Ich kann die ExplosionsAnimation nicht in dieses Feld per Drag& Drop reinverschieben. Es ist zum Mäusemelken. Ich hänge jetzt schon sehr lange an diesem Problem. Ich kann alles mögliche in dieses graue Feld schieben. Nur nicht die Animation. Ich muss ihm ja sagen, welche Animation er abspielen soll Vielleicht gehe ich auch die Sache falsch an. Bin wirklich sehr neu in Unity. Hab davor nur etwas in C# gemacht. Ich habe zu Testzwecke ein Asteroid auf die Spielfläche gemacht. Dem habe ich dieses Script, dass du oben gepostet hast, hinzugefügt. Natürlich auch ein Rigidbody und Boxcollider2D. Gruß
  14. Guten Morgen zusammen, ich bin neu im Forum und in Unity und habe eine dringende Frage Ich probiere mich gerade an einem Space Shooter. Jetzt hätte ich gerne, dass, wenn ein Asteroid zerstört wird, eine Feuerexplosion (Animation) abgespielt wird. Ich hatte gegoogelt, allerdings hat nichts wirklich geholfen. Das vielversprechendste war das hier: public Animation ani; // Use this for initialization private void Start() { ani = GetComponent<Animation>(); if (!ani.isPlaying) { ani.Play(); } } Wenn ich das allerdings meinem Asteroiden-Prefab als Skript hinzufüge, ist Slot im Inspektor ausgegraut. Ich habe auch mal dieses Video hier probiert: https://unity3d.com/de/learn/tutorials/projects/space-shooter-tutorial/explosions Nachdem ich mich an den Code aus dem Video gehalten habe, war es mir ebenfalls nicht möglich, etwas in diesen "Slot" im Inspector reinzuschieben. Ich habe auch langsam das Gefühl, dass es evtl an der Animation liegt. Aber ich sehe darin nichts verwerfliches (Das Animationssymbol ist rechteckig mit einem Kreis darin der vorne das "Play"-Zeichen hat). Hat jemand einen nützlichen Tipp oder kann mir sagen, wie ich dies am besten umsetze?
×