统一平滑2D水平变换

时间:2018-11-20 20:46:35

标签: c# unity3d

当前,我有一个用于手机的脚本,该脚本仅在屏幕上有一个球,当您触摸该球的左侧时,它向左移动,而当您触摸其右侧时,它向右移动。但是,当它移动时,除非我降低浮子移动的幅度(这会使其过慢),否则它是不平滑的。如何在运动平稳的同时保持快速的翻译速度?

if (Input.touchCount > 0)
    {
        Touch touch = Input.GetTouch(0);

        var point = Camera.main.ScreenToWorldPoint(new Vector3(touch.position.x, touch.position.y,
            transform.position.z - Camera.main.transform.position.z));

        float dx = point.x - transform.position.x;
        if (point.x < transform.position.x)
        {
            //transform.Translate(-15f * Time.deltaTime, 0, 0);

            transform.Translate (dx * (1 - Mathf.Pow (0.5f, Time.deltaTime / halfWayTime)), 0, 0);


        }
        else if (point.x >= transform.position.x + 0.5f)
        {
            //transform.Translate(15f * Time.deltaTime, 0, 0);
            transform.Translate (dx * (1 - Mathf.Pow (0.5f, Time.deltaTime / halfWayTime)), 0, 0);
        }
    }

1 个答案:

答案 0 :(得分:1)

float targetX;
const float halfWayTime = 0.1f;

void Update () {
    float dx = targetX - transform.position.x;
    transform.Translate (dx * (1 - Mathf.Pow (0.5f, Time.deltaTime / halfWayTime), 0, 0);
}

这将创建运动模式,该运动模式一开始会很快,但最终会变慢,并且可以随时编辑targetX。 halfWayTime是对象完成目标路径一半的时间,如果为0.1,则在0.1s内它将移动初始距离的50%,持续0.2s-75%,持续0.3s- 87.5%等等。

顺便说一句,您可以修改此代码以使其适用于所有坐标:

void Update () {
    transform.position = Vector3.Lerp (
        target,
        transform.position,
        Mathf.Pow (0.5f, Time.deltaTime / halfWayTime)
    );
}