Задать вопрос

Почему не работает перемещение в Unity3d?

Доброе время суток. Следующая проблема: нужно перемещать объект между 3 точками Х1(-1.0, -1.5, 0.5), Х2(0.0, -1.5, 0.5) и Х3(1.0, -1.5, 0.5) . И делать это плавно, не просто задавать новую position, а с интерполяцией между двумя точками. Но при использовании Vectror3.Lerp() нужная координата не достигает максимума. Т.е. если мы перемещаем с Х2 в Х1, то координата х = -0.9999. Я так понимаю это из-за использования float. Но поэтому не срабатывают условия. Что нужно сделать? Округлять. Но как если используем Vector3.Lerp(), или сам подход в плавном перемещении не верен и мой код - говнокод. Тогда как по другому это осуществить?
using UnityEngine;
using System.Collections;

public class pController : MonoBehaviour {

	public float speed;
	private Vector3 left;
	private Vector3 right;
	private bool leftOn = false;
	private bool rightOn = false;
	private Vector3 target;
	// Use this for initialization]
	void Start () {
	}
	// Update is called once per frame
	void Update () {
		if (transform.position.x == 0.0f) {
						left = new Vector3 (-1.0f, -1.5f, 0.5f);
						right = new Vector3 (1.0f, -1.5f, 0.5f);
				}
		if (transform.position.x == -0.1f) {
						right = new Vector3 (0.0f, -1.5f, 0.5f);
				}
		if (transform.position.x == 1.0f) {
			left = new Vector3(0.0f, -1.5f, 0.5f);
				}
		if(Input.GetKeyDown(KeyCode.A) && transform.position.x!=-1.0f && !leftOn && !rightOn){
			leftOn = true;
		} else if(Input.GetKeyDown(KeyCode.S) && transform.position.x!=1.0f && !rightOn && !leftOn){
			rightOn = true;
		}
		if(leftOn){
			target = transform.position;
			transform.position = Vector3.Lerp(target, left, Time.deltaTime*speed);
		}
		if(rightOn){
			target = transform.position;
			transform.position = Vector3.Lerp(target, right, Time.deltaTime*speed);
		}
		if ((transform.position.x == 0.0f) || (transform.position.x == -1.0f)) {
						leftOn = false;
				}
		if ((transform.position.x == 0.0f) || (transform.position.x == 1.0f)) {
						rightOn = false;
				}
	}
}
  • Вопрос задан
  • 6017 просмотров
Подписаться 2 Оценить Комментировать
Решения вопроса 1
BasmanovDaniil
@BasmanovDaniil
Геймдизайнер-телепат
Не сравнивайте так float'ы, если вам нужна точность. Правильно так:
if (Mathf.Abs(transform.position.x - сравниваемое_значение) < порог_точности)

Порог точности может быть любым, надо подбирать под конкретную ситуацию, например 0.001
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
ping_rulezzz
@ping_rulezzz
Вы неправильно поняли работу функции. Коротко из справки:
static Vector3 Lerp(Vector3 from, Vector3 to, float t);
t = 0 returns "from", t = 1 returns "to", when t = 0.5 returns the point midway between from and to.

А в вашем коде вы всегда только приближаетесь к нужному значению.
Посмотрите пример использования: docs.unity3d.com/ScriptReference/Vector3.Lerp.html
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы