Jump to content
Unity Insider Forum

Abfrage ob Position sich in einem Collider befindet


deciphers

Recommended Posts

Hallo liebe Leute,

 

Ich habe einen 2D Sprite als Spieler und dieser bewegt sich nun aus Top-Down Perspektive per Tastatur eingabe. Ich möchte nun das der Spieler nur auf "untergrund" mit dem Tag "walkable ground" gehen kann.

 

foreach (GameObject walkable_ground in GameObject.FindGameObjectsWithTag("walkable_ground"))
{
if (!(walkable_ground.GetComponent<BoxCollider2D> ().bounds.Contains (transform.position)))
 transform.position = walkable_ground.GetComponent<BoxCollider2D> ().bounds.ClosestPoint (transform.position);
}

 

Ich prüfe für jedes Tile ob der Spieler sich darauf befindet und wenn nicht dann soll er an der nächsten Position im Box Collider stehen bleiben.

klappt soweit auch ganz gut wenn ich nur ein einziges Tile verwende.

Sobald ich ein weiteres hinzufüge mit dem enstprechenden Tag, hängt der Spieler an einer Ecke des colliders und man kann sich nicht mehr bewegen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Du prüfst halt echt jeden Frame alle Tiles durch und suchst sie dafür mit einer aufwändigen Funktion heraus. Das wird ziemlich schnell ziemlich hässlich werden.

 

Nimm doch einfach Collider und setze Wände neben die begehbaren Tiles. Unity hat Box2D als 2D-Physikengine eingebaut; die solltest du nutzen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

danke habe mich ein bisschen mit Collidern und Rigidbody befasst und jetzt klappt alles wunderbar! :) habs mir wohl zu kompliziert gemacht.

 

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class Create_Colliders_Edges : MonoBehaviour {
public List<Vector2> newVerticies = new List<Vector2>();
private EdgeCollider2D col;
Vector2 down_left,down_right,up_left,up_right;
public bool left,right,up,down;
void Start () {
 down_left = new Vector2 (-GetComponent<SpriteRenderer> ().bounds.extents.x, -GetComponent<SpriteRenderer> ().bounds.extents.y);
 down_right = new Vector2 (GetComponent<SpriteRenderer> ().bounds.extents.x, -GetComponent<SpriteRenderer> ().bounds.extents.y);
 up_left = new Vector2 (-GetComponent<SpriteRenderer> ().bounds.extents.x, GetComponent<SpriteRenderer> ().bounds.extents.y);
 up_right = new Vector2 (GetComponent<SpriteRenderer> ().bounds.extents.x, GetComponent<SpriteRenderer> ().bounds.extents.y);
 if (down) {
  /*down*/
  newVerticies.Add (down_left);
  newVerticies.Add (down_right);
 }
 if (left) {
  /*left*/
  newVerticies.Add (down_left);
  newVerticies.Add (up_left);
 }
 if (up) {
  /*up*/
  newVerticies.Add (up_left);
  newVerticies.Add (up_right);
 }
 if (right) {
  /*right*/
  newVerticies.Add (down_right);
  newVerticies.Add (up_right);
 }
 gameObject.AddComponent<EdgeCollider2D> ();
 col = GetComponent<EdgeCollider2D>();
}

// Update is called once per frame
void Update () {
 col.points = newVerticies.ToArray();
}
}

 

 

der Code erstellt mir nun Edge Collider an jeder Seite des Tiles.

(funktioniert nur leider nicht ganz korrekt wenn ich die Skalierung des Transforms verändere)

freue mich über Feedback und Verbesserungsvorschläge :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...