[英]How do I move an object to a destination that is stored on mouse click?
我正在努力实现最简单的事情。 我有用于平滑移动 object 的代码,我希望它停止在与单击按钮时 object 所在位置相关的特定距离处。 所以我不能将 position 存储在任何更新每一帧的 function 中。 目前 object 只是开始移动并且不会停止。
void Update()
{
Vector3 targetPosition = new Vector3(transform.position.x - 1, transform.position.y, transform.position.z);
if (movement == true)
{
float step = speed * Time.deltaTime;
transform.position = Vector3.MoveTowards(transform.position, targetPosition, step);
}
}
public void coroutineStarter()
{
float targetPosition = transform.position.x - 1;
StartCoroutine(OnClick(targetPosition));
}
IEnumerator OnClick(float targetPosition)
{
if (transform.position.x != targetPosition)
{
movement = true;
}
else
{
movement = false;
yield return null;
}
}
}
我应该指定按下按钮启动coroutineStarter
。 我尝试在OnClick
中使用 while 循环而不是 if 语句,但显然在任何地方使用 while 循环都会冻结统一,如果它是无限的,如果不是,它会在循环期间冻结统一。
我不会将 Coroutine 与Update
中运行的代码混为一谈。 协程已经像一个临时的Update
方法,所以你可以简单地做
public void coroutineStarter()
{
var targetPosition = transform.position + Vector3.left;
StartCoroutine(OnClick(targetPosition));
}
IEnumerator OnClick(Vector3 targetPosition)
{
while (transform.position.x != targetPosition)
{
float step = speed * Time.deltaTime;
transform.position = Vector3.MoveTowards(transform.position, targetPosition, step);
// Important! Tells Unity to pause here, render this frame
// and continue from here in the next frame
yield return null;
}
// When done set the position fixed once
// since == has a precision of 0.00001 so it never reaches an exact position
transform.position = targetPosition;
}
这会将 object 以恒定速度移动到目标 position。
稍微不同的方法是在一定时间内移动 object,但允许使用Vector3.Lerp
和SmoothStep
在移动开始和结束时添加缓入和缓出
IEnumerator OnClick(Vector3 targetPosition)
{
var startPosition = transform.position;
var distance = Vector3.Distance(startPosition, targetPosition);
if(distance <= 0) yield break;
var duration = distance / speed;
var timePassed = 0f;
while (timePassed < duration)
{
var factor = timePassed / duration;
// Optionally add easing
factor = Mathf.SmoothStep(0,1,factor);
transform.position = Vector3.Lerp(startPosition, targetPosition, factor);
// increase by time since last frame avoiding overshooting
timePassed += Mathf.Min(Time.deltaTime, duration - timePassed);
// Important! Tells Unity to pause here, render this frame
// and continue from here in the next frame
yield return null;
}
// When done set the position fixed once
// this time just in case you never know ;)
transform.position = targetPosition;
}
您只需简单地保存,目标点的 position 变量,外部,方法。 然后在更新中,您应该检查 object 是否在右侧 position 中,如果是 - 将变量设置为 false。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.