Jump to content
Unity Insider Forum

Problem mit Vector3.MoveTowards und X,Y-Achsen


Vaapad

Recommended Posts

Hallo zusammen,

 

mein Lehrer hat mir die Aufgabe gestellt, eine Kugel von einer zweiten Kugel verfolgen zu lassen. Soweit kein Problem, jedoch möchte er, dass der Abstand der Verfolgung auf der X- und Y-Achse frei einstellbar ist.

 

Bislang haben wir uns nur mit Vector3.Lerp beschäftigt, ich bin aber zu MoveTowards gewechselt, da mir das simpler erscheint.

 

Die Verfolgung und den einstellbaren Abstand habe ich alles soweit fertig, solange ich die beiden Achsen nicht beachte.

 

Ich habe mich im Unity Manual belesen und finde dort keine Hilfe bezüglich etwas wie:

 

Vector3.Distance.X

 

YouTube Tutorials zu Vector3.MoveTowards und Lerp haben mir da keine Antworten liefern können. Google und die Forensuche ebenso.

 

Ich habe versucht, die aktuellen X- und Y-Werte der Kugeln als float-Variablen bestimmen zu lassen und wollte diese dann mit dem Vector3.Distance der beiden Kugeln vergleichen. Wenn der Abstand >= dem festgelegten Wert ist, folgt die Kugel.

 

Vermutlich verwirrt meine Erklärung, daher hier einfach mal mein aktueller Stand in JS:

 

#pragma strict
//Member Variablen, die im Inspector verändert werden können
var zielObjekt : Transform;
var startObjekt : Transform;
var DistanceX : float;
var DistanceY : float;
function Update () {
var currentStartObjektPositionX : float;
var currentStartObjektPositionY : float;
var currentZielObjektPositionX : float;
var currentZielObjektPositionY : float;
currentStartObjektPositionX = startObjekt.transform.position.x;
currentStartObjektPositionY = startObjekt.transform.position.y;
currentZielObjektPositionX = zielObjekt.transform.position.x;
currentZielObjektPositionY = zielObjekt.transform.position.y;
Follow ();
}
function Follow () {
var localDistance : float = Vector3.Distance(zielObjekt.position,startObjekt.position);

if(localDistance >= currentStartObjektPositionX && localDistance >= currentStartObjektPositionY)

startObjekt.transform.position = Vector3.MoveTowards(startObjekt.position,zielObjekt.position,Time.deltaTime * 0.5);

}

 

Ein Denkanstoß ist alles was ich brauche, mein Hirn befindet sich in einer Sackgasse.

 

Die if-Abfrage zu splitten in X und Y Abstände kam mir in den Sinn, oder ist das Quatsch?

 

 

Vielen Dank schonmal für alle Beiträge, ich hol mir erstmal Kaffee...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke für eure Hilfen.

 

Mit folgendem Code funktioniert es soweit ganz gut:

 

#pragma strict
//Member Variablen, die im Inspector verändert werden können
var zielObjekt : Transform;
var startObjekt : Transform;
var minAbstandX : float;
var minAbstandY : float;
function Start () {
}
function Update () {
var AbstandX : float;
var AbstandY : float;
AbstandX = (zielObjekt.position.x - startObjekt.position.x);
AbstandY = (zielObjekt.position.y - startObjekt.position.y);
if (AbstandX >= minAbstandX && AbstandY >= minAbstandY)
{
startObjekt.transform.position = Vector3.MoveTowards(startObjekt.position,zielObjekt.position,Time.deltaTime * 0.5);
}

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das ist aber nur eine ungefähre Lösung, weil du damit einen rechteckigen Bereich um das Zielobjekt definierst, der als Minimaldistanz eingehalten wird. Mag sein, dass das im Spiel nicht auffällt. Wahrscheinlich Korinthe hier. Wenn der Minimalbereich einfach "Radius X" vom Zielobjekt sein soll, wäre die Distance-Lösung geeignet, oder du fängst mit Trigonometrie an...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das ist aber nur eine ungefähre Lösung, weil du damit einen rechteckigen Bereich um das Zielobjekt definierst, der als Minimaldistanz eingehalten wird. Mag sein, dass das im Spiel nicht auffällt. Wahrscheinlich Korinthe hier. Wenn der Minimalbereich einfach "Radius X" vom Zielobjekt sein soll, wäre die Distance-Lösung geeignet, oder du fängst mit Trigonometrie an...

 

Ja es ist nicht die optimale Lösung, es tut aber im Grunde was es soll. Math Funktionen oder Radius berechnen wie Mark es erwähnt, habe ich bisher im Lehrgang noch nichts gesehen, ergo halte ich das nicht für das Ziel dieser Aufgabe..

 

Ausserdem nutzt du UnityScript was ansich schon ein Fehler ist :P

 

Ich dachte mir schon, dass so ein Kommentar kommt. Ich absolviere einen Lehrgang mit festem Ablauf. Dieser nimmt UnityScript, also nehme ich es auch.

 

Ebenso wird im Lehrgang Unity 4.0.0 verwendet, was mir persönlich stinkt, aber lässt sich halt nicht ändern. Ich hab separat Unity 5 installiert und spiele damit hin und wieder herum. Für Projekte, die ich vorzeigen muss, nutze ich dann Unity 4.

 

Mir wäre auch C# lieber, da das offensichtlich viel verbreiteter ist.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ja es ist nicht die optimale Lösung, es tut aber im Grunde was es soll. Math Funktionen oder Radius berechnen wie Mark es erwähnt, habe ich bisher im Lehrgang noch nichts gesehen, ergo halte ich das nicht für das Ziel dieser Aufgabe..

Naja Ziel sollte doch eigentlich sein das du dich mit sachen auseinandersetzt und lernst. Nicht stupide aufgaben lösen. Der weg ist das Ziel.

 

Mir wäre auch C# lieber, da das offensichtlich viel verbreiteter ist.

C# wäre nur weniger ein Fehler gegenüber UnityScript, wenn richtig dann F#.

Wobei F# wäre nur weniger ein Fehler gegenüber Haskell da F# keine Type Classen kennt.

Wobei wenn wir schon die mächtigste Programmiersprache wollen dann gleich richtig und Lisp.

 

Was sagt uns das also?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Was sagt uns das also?

Hipsters gonna hipster? :D

 

Ich vertrete ja ganz gerne den Standpunkt, dass Mächtigkeit und Featuremengen nicht das einzige sind, was eine Sprache gut macht. Diese ganzen funktionalen Programmiersprachen sind meist syntaktisch und auch vom Paradigma so weit ab von normalem menschlichen Denken, da wird einem schlecht.

Ich finde, die Informatik muss sich dem Menschen anpassen, nicht umgekehrt. Stinknormale Objektorientierung gibt es, weil normale Menschen ungefähr so denken. Funktional macht Matheliebhaber glücklich, aber die Sprachen deshalb als uneingeschränkt besser zu promoten? Ich weiß ja nicht.

Ich bin auch kein großer Fan von Visual Scripting, aber trotzdem bin ich sehr dafür, dass es das gibt. Weil es Programmieren für mehr Menschen zugänglich macht. Und dieser Hipstertrend zu Haskell und Konsorten geht in die entgegengesetzte Richtung...

 

@Vaapad: Ich weiß nicht, wie die Leute bei dir so drauf sind, aber ich habe öfter mal die Gelegenheit gehabt, Einfluss auf die Lehre hier zu nehmen. Wenn deine Lehrer/Dozenten/Wasauchimmer nicht die allergrößten Starrköpfe sind, kannst du ja mal probieren, ob sich nicht hier und da was verbessern lässt ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

@Vaapad: Ich weiß nicht, wie die Leute bei dir so drauf sind, aber ich habe öfter mal die Gelegenheit gehabt, Einfluss auf die Lehre hier zu nehmen. Wenn deine Lehrer/Dozenten/Wasauchimmer nicht die allergrößten Starrköpfe sind, kannst du ja mal probieren, ob sich nicht hier und da was verbessern lässt ;)

 

Es handelt sich um einen reinen Fernlehrgang, ich bekomme Unterlagen mit Lerninhalten zugesendet, am Ende gibt es ein paar Einsendeaufgaben und diese werden bewertet.

 

Ich habe in einer anderen Aufgabe ebenfalls einen eher eigenen Lösungsweg genutzt, werde nun abwarten, wie meine Lösungen ankommen. Einfluss nehmen wird da wohl nicht möglich sein, außer vielleicht an meiner Bewertung zu feilschen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Sprachdiskussionen hin oder her, aber Sascha hat Recht.

 

Wenn dein zielObjekt die Koordinaten (3,5) hat und dein startObjekt auf (6,9) steht, bekommst du als Abstand jeweils negative Werte raus. Das heißt, sobald sich der Verfolger rechts oder oberhalb des Verfolgten befindet, wird der Mindestabstand nicht mehr eingehalten.

 

Mathf.Abs() heißt die Methode, die du da brauchst.

 

AbstandX = Mathf.Abs((zielObjekt.position.x - startObjekt.position.x));
AbstandY = Mathf.Abs((zielObjekt.position.y - startObjekt.position.y));

Link zu diesem Kommentar
Auf anderen Seiten teilen

Sprachdiskussionen hin oder her, aber Sascha hat Recht.

 

Wenn dein zielObjekt die Koordinaten (3,5) hat und dein startObjekt auf (6,9) steht, bekommst du als Abstand jeweils negative Werte raus. Das heißt, sobald sich der Verfolger rechts oder oberhalb des Verfolgten befindet, wird der Mindestabstand nicht mehr eingehalten.

 

Mathf.Abs() heißt die Methode, die du da brauchst.

 

AbstandX = Mathf.Abs((zielObjekt.position.x - startObjekt.position.x));
AbstandY = Mathf.Abs((zielObjekt.position.y - startObjekt.position.y));

 

Danke für die Aufklärung zu Mathf.Abs!

 

Ich hab das Projekt leider bereits abgeschickt und muss nun abwarten. Nichtsdestotrotz weiß ich ja nun, wie es tatsächlich geht.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich vertrete ja ganz gerne den Standpunkt, dass Mächtigkeit und Featuremengen nicht das einzige sind, was eine Sprache gut macht.

Und was macht eine Sprache gut?

 

Diese ganzen funktionalen Programmiersprachen sind meist syntaktisch und auch vom Paradigma so weit ab von normalem menschlichen Denken, da wird einem schlecht.

Hast du überhaupt irgendeine Funktionale Sprache schonmal gelernt?

 

Ich finde, die Informatik muss sich dem Menschen anpassen, nicht umgekehrt.

Sehe ich auch so, und Funktionale Sprachen kommen dem sehr viel näher.

 

Stinknormale Objektorientierung gibt es, weil normale Menschen ungefähr so denken.

Kein Mensch denkt Objektorientiert.

 

Funktional macht Matheliebhaber glücklich, aber die Sprachen deshalb als uneingeschränkt besser zu promoten? Ich weiß ja nicht.

Mit Mathe hat es wenig zu tun. Sie sind natürlich näher an der Mathematik angeordnet, was sie aber nicht automatisch schlechter macht. Den dir ist auch klar das der Grund Sinn hinter Mathe überhaupt derjenige ist Sachen für uns Menschen überhaupt begreifbar zu machen?

 

Sie als besser zu promoten hängt ganz von der Mächtigkeit ab. Je mächtiger die Sprache, umso leichter ist es dinge und konzepte umzusetzen.Und nur nebenbei gesagt. Der unterschied zwischen OO und Assembler ist das OO mächtiger ist. Deswegen empfinden wir OO auch als leichter als Assembler. Vorallem wenn man komplexere Sachen umsetzen möchte.

 

Genau deswegen ist LISP auch für AI so weit verebreitet gewesen. Weil die Sprache mächtig genug ist solche Konzepte umzusetzen. Keiner setzt sich dran und versucht komplexe AI in Assembler umzusetzen.

 

Ich bin auch kein großer Fan von Visual Scripting, aber trotzdem bin ich sehr dafür, dass es das gibt. Weil es Programmieren für mehr Menschen zugänglich macht. Und dieser Hipstertrend zu Haskell und Konsorten geht in die entgegengesetzte Richtung...

Es geht eigentlich genau in dem Trend. Es geht nämlich darum sachen einfacher zu machen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...