加速和减速到手指位置

时间:2014-06-02 20:08:41

标签: c# unity3d physics

我在Unity上有一个3D对象,我想要的只是在用户按下屏幕时移动该对象。问题是它需要首先加速,然后当它到达按下位置时,它开始减速直到它完全停止在该点上。

我需要这个工作方式,如果用户移动他的手指,如果需要根据当前状况加速/减速,对象将重新计算。

我试过this示例但是,它只适用于加速,它似乎有点令人困惑。所以,我在想是否有其他人有更好,更简单的想法来解决这个问题。物理学可以帮助吗?如果是这样,怎么样?

我的代码在C#中。

1 个答案:

答案 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);
    }
}