"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

JavaScript / Unity Frage (Anfänger-Level!)

Garrett 01.09.2014 - 13:12 2326 6
Posts

Garrett

Here to stay
Avatar
Registered: May 2003
Location: Wien
Posts: 1077
Hi Leute,

ich möchte, dass sich in Unity mein Objekt namens "CubeRight" selbstständig nach links bewegt bis er EXAKT die X-Position von 5 erreicht hat. Das funktioniert mit dem untenstehenden Code jedoch nur mittelmäßig. Das Problem ist nur, dass der Cube nicht exakt bei der X-Position 5 stehen bleibt, sondern - je nachdem wie hoch ich die Variable "speed" definiere - bisschen davor bzw. bisschen danach. Bei Speed 1 bleibt er meistens bei 4,8 - 5 stehen. Bei Speed 400 stoppt er meistens irgendwo zwischen 1,5 und 5. Hat jemand eine Ahnung wie ich das Problem lösen kann? Vielen Dank!

Code: JS
if(GameObject.Find("CubeRight").transform.position.x > 5){
			GameObject.Find("CubeRight").transform.Translate (Vector3(-1,0,0) * Time.deltaTime*speed);}
Bearbeitet von Garrett am 01.09.2014, 13:16

InfiX

she/her
Avatar
Registered: Mar 2002
Location: Graz
Posts: 13637
nachdem x>5 ist x automatisch auf 5 setzen?

also quasi
if(x>5) x=5
Bearbeitet von InfiX am 01.09.2014, 13:17

Garrett

Here to stay
Avatar
Registered: May 2003
Location: Wien
Posts: 1077
Ich hätt wohl weiter ausholen sollen. Der Würfel soll sich zusätzlich, wenn er im negativen Koordinatenbereich ist, wieder zur Mitte (auf Position 5) zurückgezogen werden. Das ist mein aktueller Lösungsansatz.

Code: JS
if(GameObject.Find("CubeRight").transform.position.x < 5){
			GameObject.Find("CubeRight").transform.Translate (Vector3(1,0,0) * Time.deltaTime*speed);
			} else if(GameObject.Find("CubeRight").transform.position.x > 4 && GameObject.Find("CubeRight").transform.position.x < 5)
				{
				GameObject.Find("CubeRight").transform.position.x = 5;
				}								
							
		 if(GameObject.Find("CubeRight").transform.position.x > 5){
			GameObject.Find("CubeRight").transform.Translate (Vector3(-1,0,0) * Time.deltaTime*speed);
			} else if(GameObject.Find("CubeRight").transform.position.x > 5 && GameObject.Find("CubeRight").transform.position.x < 6)
				{
				GameObject.Find("CubeRight").transform.position.x = 5;
				}	
'

Edit: Falls es interessiert, das Verhalten dieser beiden Würfel versuche ich nachzubauen:
https://www.youtube.com/watch?v=ozilwW-DQT4
Bearbeitet von Garrett am 01.09.2014, 13:27

Rektal

Here to stay
Registered: Dec 2002
Location: Inside
Posts: 4420
Sorry ich hab keine Loesung aber mir ist was anderes aufgefallen; btw hoffe ich dass man den Code nicht so schreiben muss, bisserl abkuerzen tut gut fuer die Uebersicht, ist ja eine furchtbare Formatierung. Wird das nochmal kompiliert auf optimierteres JS? Die ganzen Object Traversals koennen schon Performance kosten. Anyway:
Code: JS
var tr = GameObject.Find("CubeRight").transform;
if (tr.position.x < 5) {
    tr.Translate( Vector3(1,0,0) * Time.deltaTime * speed);
} else if (tr.position.x > 4 && tr.position.x < 5) {
    tr.position.x = 5;
}								
    
if (tr.position.x > 5) {
    tr.Translate( Vector3(-1,0,0) * Time.deltaTime * speed);
} else if (tr.position.x > 5 && tr.position.x < 6) {
    tr.position.x = 5;
}
Bei der Abfrage "< 5" und das elseif "x > 4 && x < 5" wird der elseif Zweig nie true sein.

Das selbe auch unten: "x > 5" und im elseif "x > 5 && x < 6" kann nicht gehen.

Du hast vermutlich sowas gemeint:
Code: JS
if (x < 5) {
  if (x < 4) {
    tr.Translate( Vector3(1,0,0) * Time.deltaTime * speed);
  } else {
    x = 5
}
Das selbe Spiel unten auch.

Ob das was mit deinem Problem zu tun hat kann ich nicht sagen -> Brain schon zu muede heute.

Garrett

Here to stay
Avatar
Registered: May 2003
Location: Wien
Posts: 1077
Hahaha Rektal, du hast es schon richtig erkannt, ich bin wirklich absoluter Anfänger... ;-) Danke jedoch für deinen Input.

Habs jetzt mit nem anderen Lösungsansatz versucht... ich versteh einfach nicht, warum das so nicht funktioniert. Ich hab jetzt als Ausgangswert "0" genommen, damits ein bisschen einfacher zu lesen ist.

Code: JS
if(GameObject.Find("CubeLeft").transform.position.x < 0){ //wenn Würfel sich Links von Ausgangsposition befindet
GameObject.Find("CubeLeft").transform.Translate (Vector3(1,0,0) * Time.deltaTime*speed); //dann bewege Würfel nach rechts}

if(GameObject.Find("CubeLeft").transform.position.x > 0){ //wenn Würfel sich Rechts von Ausgangsposition befindet
GameObject.Find("CubeLeft").transform.Translate (Vector3(-1,0,0) * Time.deltaTime*speed); //dann bewege Würfel nach links}

InfiX

she/her
Avatar
Registered: Mar 2002
Location: Graz
Posts: 13637
also ich würd das folgendermaßen machen (einfach geschrieben weil ich den befehlen ned ganz folgen kann, auch weiss ich jetzt nicht wie genau man den vector abfrägt :D):

Code: JS
if(cube.x > 0) {
  vector = links*speed;
}

if(cube.x < 0 && vector = links) {
  cube.x = 0; 
}

if (cube.x < 0 ) {
  vector = rechts*speed;
}

if(cube.x > 0 && vector = rechts) {
  cube.x = 0;
}

e: moment da ist noch ein fehler drin :D
e2: so jetzt sollts passen
nachdem ich nicht weiss wie der vektor im restlichen code einfluss nimmt kann ich ned sagen ob das so funktioniert, aber ich hoffe du verstehst das prinzip?
Bearbeitet von InfiX am 02.09.2014, 00:32

Rogaahl

Super Moderator
interrupt
Avatar
Registered: Feb 2014
Location: K
Posts: 2040
Du kannst auch GameObjects oder Transforms direkt im Editor reinziehen, zb:

public Transform(oder GameObject) cubeRight;

Glaube in js wäre das
public var cubeRight : Transform;
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz