加速和减速到手指位置
本文关键字:手指 位置 加速 | 更新日期: 2023-09-27 18:06:22
我在Unity上有一个3D对象,我想要的是在用户按压屏幕时移动这个对象。问题是,它需要先加速,然后,当它到达按下的位置,它开始减速,直到它完全停止在那一点。
我需要它的工作方式,如果用户移动他的手指,对象将重新计算是否需要根据他的当前情况加速/减速。
我试过这个例子,但是,它只适用于加速,它也似乎有点混乱。所以,我在想是否有人有更好更简单的方法来解决这个问题。物理学能帮上忙吗?如果有,怎么做?
我的代码是c#。
采用统一刚体系统,计算简便。这是使用鼠标位置,你可以改变它的触摸。
public class MyDragMove : MonoBehaviour {
public float speedDelta = 1.0f;
public float decelerate = 1.0f;
private bool startDrag;
private Vector3 prePos;
void Update () {
this.rigidbody.drag = decelerate; //Rigidbody system can set drag also. You can use it and remove this line.
if (Input.GetKeyDown (KeyCode.Mouse0)) {
prePos = Input.mousePosition;
startDrag = true;
}
if(Input.GetKeyUp(KeyCode.Mouse0))
startDrag = false;
if(startDrag)
ForceCalculate();
}
void ForceCalculate()
{
Vector3 curPos = Input.mousePosition;
Vector3 dir = curPos - prePos;
float dist = dir.magnitude;
float v = dist / Time.deltaTime;
this.rigidbody.AddForce (dir.normalized * v * Time.deltaTime * speedDelta);
prePos = curPos;
}
}
或仅使用SmoothDamp在最后位置。
public class MyDragMove : MonoBehaviour {
public float speedDelta = 1.0f;
public float maxSpeed = 5.0f;
public Vector3 v;
private Vector3 prePos;
void Update () {
if(Input.GetKey(KeyCode.Mouse0))
prePos = Input.mousePosition;
TowardTarget ();
}
void TowardTarget()
{
Vector3 targetPos = Camera.main.ScreenToWorldPoint (new Vector3(prePos.x, prePos.y, 10f)); //Assume your camera's z is -10 and cube's z is 0
transform.position = Vector3.SmoothDamp (transform.position, targetPos, ref v, speedDelta, maxSpeed);
}
}