Unity平稳,精确的摄像机惯性移动

时间:2019-02-17 22:40:23

标签: c# unity3d vector camera human-computer-interface

我正在尝试编写相机脚本,但无法正常工作。

void LateUpdate(){
        if (Input.GetMouseButtonDown(0)
        {
            _lastPosition = Input.mousePosition;
        }

        if (Input.GetMouseButton(0))
        {
            var delta = _lastPosition - Input.mousePosition;
            var deltaxz = new Vector3(delta.x, 0f, delta.y);
            transform.Translate(deltaxz * Time.deltaTime, Space.World);
            _lastPosition = Input.mousePosition;
        }
}

我编写了这段代码来移动相机,但是鼠标却奇怪地移动了相机。如果我将鼠标移动得太快,它也会移动得很快。如果速度较慢,则相机的移动速度将比鼠标慢。

我认为ScreenToWorldPoint可以提供帮助,但是摄像机是RTS样式,我想像移动地面“拖放”一样移动它\

2 个答案:

答案 0 :(得分:0)

您应该尝试使用         Vector3.Lerp(_lastPosition, deltaxz, someValue * Time.deltaTime)

这是我用来使运动更平滑的方法,它非常好,只需根据所需速度调整一些值

答案 1 :(得分:0)

那是因为deltaTime(总是约0.01f-0.02f =多次迭代的精度差) 您可以使用Lerp变通办法来像Jichael一样平滑移动,但要稍作更改(直接与transform.positon一起使用),完整代码:

//new:
public float Sensitivity;

private Vector3 _lastPosition;

private void LateUpdate()
{
    if (Input.GetMouseButtonDown(0))
    {
        _lastPosition = Input.mousePosition;
    }

    if (Input.GetMouseButton(0))
    {
        var delta = (_lastPosition - Input.mousePosition);
        var deltaxz = new Vector3(delta.x, 0f, delta.y);
        //new:
        transform.position = Vector3.Lerp(transform.position, transform.position + deltaxz, Sensitivity * Time.deltaTime);
        _lastPosition = Input.mousePosition;
    }
}

P.S。为什么要使用LateUpdate?