Unity3D Entfernung zwischen zwei Objekten messen?

3 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

sollte so klappen, bin aber da nichtmehr so fit xD

float dist = Vector3.Distance(other.position, transform.position);

PWolff  27.03.2017, 18:43

Hab wenig Erfahrung mit Geometrie in C#, aber sieht mir auch richtig aus (other und transform sind die beiden Objekte)

0
Hmr123 
Fragesteller
 28.03.2017, 18:02

Und wie soll das Script wissen welche Objekte es finden und messen soll? Wie soll ich die Objekte "erkennbar" machen?

0
p0werpixel  28.03.2017, 18:17
@Hmr123

durch die ObjectID bzw. den Namen der zwei Objekte.

Im obigen Beispiel heißt das erste Objekt [other] und das zweite [transform].

Von beiden wird die Property [position] für die Berechnung verwendet. 

1
Hmr123 
Fragesteller
 29.03.2017, 17:38
@p0werpixel

Ich bekomme dauernd Errors raus: 

Code1:

void Update (){ 
 var Stein = GameObject.Find("Stein"); 
var Stock = GameObject.Find("Stock");
float dist = Vector3.Distance(Stein.position, Stock.position);

Error:  Type `UnityEngine.GameObject[]' does not contain a definition for `position' and no extension method `position' of type `UnityEngine.GameObject[]' could be found. Are you missing an assembly reference?   

Code2 (Habe ich selbst "entwickelt"):

void Update() {
if(Vector3.Distance(GameObject.Find("Stein").transform.position, GameObject.Find("Stock").transform.position){
//weiterer Code hier
}

                                     

Error: Cannot implicitly convert type `float' to `bool'

Das komische ist, dass mein Code bei anderen Messungen eigentlich Funktioniert und ich ihn schon öfters eingesetzt habe.

Kannst du mir verraten, was für Anfängerfehler ich gemacht habe?:)

1
p0werpixel  29.03.2017, 17:41
@Hmr123

jap deine Method 

 var Stein = GameObject.Find("Stein"); 


gibt ein Object ARRAY zurück also Stein[1-n] 

Es kann ja mehrere hundert "Stöcke" und "Steine" in deiner World geben.


quick and dirty probier mal 

float dist = Vector3.Distance(Stein[0].position, Stock[0].position);

du solltest für eine Produktiv-Lösung aber irgendwie einen anderen Weg finden genau DIESEN Stein und DIESEN Stock zu finden.
1
p0werpixel  29.03.2017, 18:27
@Hmr123

ach verdammt, wie gesagt ist schon lange her... vergiss das ARRAY Ding <-- kompletter Blödsinn.

also deine eigene Entwicklung ist absolut KORREKT
sollte es eher so aussehen:

void Update() {

float Distance = Vector3.Distance(GameObject.Find("Stein").transform.position, GameObject.Find("Stock").transform.position);

if (Distance <= ){
//mach etwas cooles ;)
}
}

du hattest in deinem Beispiel im If() keinen Vergleich.

1

Oder der manuelle weg ;)
Vector3 A;
Vector3 B;
Vector3 C = A-B;
float distance = C.x^2+C.y^2+C.z^2;
float distance = ✓distance;
Ps: Der Code zeigt nur die Logic ist aber nicht copy/paste bar

if(Vector3.Distance(stein.position, stock.position) <= 0,3f)
{
//baue axt
//entfern stein und stock

}

Problem dabei ist aber, es ist nich dynamisch.

Woher ich das weiß:Berufserfahrung – Ich lehre auf Youtube und auf Udemy Spiele-Erstellung.