我在Unity上有一个3D对象,我想要的只是在用户按下屏幕时移动该对象。问题是它需要首先加速,然后当它到达按下位置时,它开始减速直到它完全停止在该点上。
我需要这个工作方式,如果用户移动他的手指,如果需要根据当前状况加速/减速,对象将重新计算。
我试过this示例但是,它只适用于加速,它似乎有点令人困惑。所以,我在想是否有其他人有更好,更简单的想法来解决这个问题。物理学可以帮助吗?如果是这样,怎么样?
我的代码在C#中。
答案 0 :(得分:2)
使用统一刚体系统和简单计算。这是使用鼠标位置,您可以将其更改为触摸。
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);
}
}