Jump to content
Unity Insider Forum

respawn Objekte tauchen an veriedenen Stellen auf


STU

Recommended Posts

Hi zusammen,

ich habe mir in meinem 2D Spiel eine Höhle gebaut in der Sprinnen alle x Sekunden auftauchen sollen. Diese haben alle eine unterschiedliche Geschindigkeit und eine unterschiedliche Reichweite. Eigentlich sollten alle vor der Höhle loslaufen. Sie tauchen aber auch einfalch mal ein ganzen stück daneben auf. Ich vermute dass sie schon loslaufen, bevor sie überhaupt sichtbar sind. Wie kann ich dass ändern.

grafik.png

grafik.png

Link zu diesem Kommentar
Auf anderen Seiten teilen

Magst du in Zukunft deinen Code als Code und nicht als Screenshot hochladen? Dafür einfach über dem Textfeld den <>-Knopf benutzen, danke :)

Zum Thema: Ohne, dass du das so angibst, ist ein Objekt nicht unsichtbar, obwohl es schon existiert. Normalerweise würde ich am ehesten auf einen Rigidbody auf der Spinne tippen, und dass dieser nach dem Spawnen erstmal eine Kollision feststellt und sich aus dem anderen Collider herausteleportiert. In deinem Fall aber nehme ich an, dass der erste Scriptausschnitt aus dem Objekt kommt, das du im zweiten Code wiederum als "Spawnpoint" festgelegt hast? Dein Spawnpunkt wandert also die ganze Zeit von links nach rechts und wieder zurück. Ist doch klar, dass die Spinnen dann an unterschiedlichen Punkten spawnen?

Link zu diesem Kommentar
Auf anderen Seiten teilen

ok, mach ich. Danke für die Info!

unsichtbar meinte ich nicht direkt. Eher dass das Objekt schon geladen wurde aber bis es graphisch auch sichtbar ist hat sich das Objekt schon bewegt.

Warum bewegt sich der Spawnpoint? Das erste ist das Objekt hier die Spinne die sich auch bewegt. Das zweite Skript ist die Höhle, die wiederum eine feste Position hat. Dort liegt auch der SpawnPoint.

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 58 Minuten schrieb STU:

Eher dass das Objekt schon geladen wurde aber bis es graphisch auch sichtbar ist hat sich das Objekt schon bewegt.

Das passiert nicht, sofern du nicht mit AssetBundles arbeitest oder dir dafür explizit ein System schreibst.

vor 59 Minuten schrieb STU:

Das erste ist das Objekt hier die Spinne die sich auch bewegt.

Ach sooo, verstehe. Okay. Das Problem ist, dass Time.time nicht für jedes Objekt einzeln von 0 anfängt zu zählen, sondern seit Start des Spiels. Wenn eine Spinne innerhalb von, sagen wir, 10 Sekunden eine volle "Runde" läuft, und deine Höhle spawnt 5 Sekunden nach Spielbeginn, dann spawnt die Spinne zwar ganz normal, wird aber gleich da hinbewegt, wo sie nach der Formel nach 5 Sekunden halt wäre.

Ich würde, alleine schon für die Nachvollziehbarkeit des Codes, zu Coroutinen raten statt zu einer zeitabhängigen Formel in Update. Könnte z.B. so aussehen:

private void OnEnable()
{
  StartCoroutine(Patrol());
}

private IEnumerator Patrol()
{
  var left = transform.position + Vector3.left * radius;
  var right = transform.position + Vector3.right * radius;
  
  while(enabled)
  {
    yield return MoveTo(left);
    yield return MoveTo(right);
  }
}

private IEnumerator MoveTo(Vector3 target)
{
  do
  {
    transform.position = Vector3.MoveTowards(transform.position, target, speed * Time.deltaTime);
    yield return null;
  }
  while (transform.position != target);
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi Sascha,

jetzt habe ich doch noch eine Frage zu dem Skript. Es funktioniert alles soweit. Die Spinne läuft von rechts nach links und umgekehrt. Dies funktioniert aber nur ohne Rigidbody 2D. Wenn ich dieses aktiviere, läuft sie nur noch eine Stecke entlang, dreht aber nicht mehr um. Sie bleibt einfach an der stelle hängen (dort ist kein Hindernis)

Woran liegt das?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wenn du Kräfte haben willst, gilt weitestgehend™: Ganz oder gar nicht. Wenn du einen Rigidbody benutzen willst, dann solltest du diesen auch vollständig für die Bewegung nutzen. Aktuell teleportierst du ja deine Spinne in jedem Frame ein kleines Stück. Du setzt dabei ganz manuell in jedem Frame die Zielposition. Wenn du jetzt Gravitation haben willst, hätte das Einfluss darauf, wo die Zielposition liegt. Sonst würdest du ein Stück nach unten fallen, aber dann sofort wieder auf die Ursprungshöhe zurückkommen, weil deine Teleport-Zielposition die neue Höhe nicht automatisch mit einbezieht. Wenn du aber einfach auf das, was der Rigidbody macht, deine Patrouille obendraufrechnest, dann kann das zu unerwünschten Ergebnissen kommen, weil der Rigidbody sich schon ohne dein Script horizontal bewegen kann.

Du kannst also entweder komplett auf Rigidbody-Bewegung umsteigen - Ich würde dann dazu raten, in FixedUpdate den velocity-Vektor zu nehmen, die X-Komponente auf "links" oder "rechts" zu setzen, die Y-Komponente sein zu lassen und das dann wieder in den RB zu füttern - oder halt komplett beim eigenen Script bleiben. Dann müsstest du den "bin ich auf dem Boden"-Check und die Gravitation selber bauen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ok, danke für die Tipps

Ich habe mich gestern etwas eingelesen und versuche es jetzt mit Rigidbody. Um es ersmal zu testen wollte ich die Figur mit der Tastatur bewegen. Das funktioniert, aber nicht ganz richtig.

Wenn ich jetzt nach rechts laufe ist alles ok. Wenn ich nach links laufe , funktioniert das auch. Nur danach lässt die Schwerkraft nach und ich hebe ab. Wie gesagt aber nur wenn ich nach links laufe. Woher kommt das?

    public float speed = 100f;
    Rigidbody2D rb;

    private void Awake()
    {
    rb = GetComponent<Rigidbody2D>();
    }

    
    private void Update()
    {
        float xMove = Input.GetAxisRaw("Horizontal");

        rb.velocity = new Vector2(xMove , rb.velocity.y).normalized * speed * Time.deltaTime;
    }
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

das Thema oben hat sich erledigt.

Dafür ein neues ;)

ich möchte dass die Collider der einzelnen spinnen keinen Einfluss aufeinander haben. Das heißt, dass sie sich "überholen" können. Ich habe das wie folgt versucht. Funktioniert leider nicht

  public Transform ignorierenPrefab;


  

  void Start()
  {

    var igno = Instantiate(ignorierenPrefab) as Transform;
    Physics2D.IgnoreCollision(igno.GetComponent<Collider2D>(), GetComponent<Collider2D>());
  }

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...