Unity3D:如何阻止角色停止移动时发生的闪烁?

时间:2016-04-17 10:10:53

标签: c# unity3d youtube

我在youtube上关注了本教程。我花了一段时间,但我几乎从箭头的移动转换为鼠标触摸。但现在我遇到了这个问题,当角色停止移动时会出现闪烁现象。我查看了他发给我的链接,但它不起作用。请观看此视频,向您展示我在说什么about。有谁知道如何阻止角色停止移动时发生的闪烁?这是我的代码:

private Animator anim;
public float speed = 15f;
private Vector3 target;
private bool touched;


void Start () {
    target = transform.position;
    anim = GetComponent<Animator> ();
}

void Update () {
    touched = true;
    if (Input.GetMouseButtonDown (0)) {
        Vector3 mousePosition = Input.mousePosition;
        mousePosition.z = 10; // distance from the camera
        target = Camera.main.ScreenToWorldPoint(mousePosition);
        target.z = transform.position.z;
    }



        var movementDirection = (target - transform.position).normalized;

        if (movementDirection.x != 0 || movementDirection.y != 0) {
            anim.SetBool("walking" , true);
            anim.SetFloat("SpeedX" , movementDirection.x);
            anim.SetFloat("SpeedY" , movementDirection.y);

            Vector2 movement = new Vector2(
                speed * movementDirection.x ,
                speed * movementDirection.y);
            movement *= Time.deltaTime;
            transform.Translate(movement);

            if (movementDirection.x < 0) {
                anim.SetFloat("LastMoveX" , -1f);
            }
            else if (movementDirection.x > 0) {
                anim.SetFloat("LastMoveX" , 1f);
            }
            else {
                anim.SetFloat("LastMoveX" , 0f);
            }
            if (movementDirection.y > 0) {
                anim.SetFloat("LastMoveY" , 1f);
            }
            else if (movementDirection.y < 0) {
                anim.SetFloat("LastMoveY" , -1f);
            }
            else {
                anim.SetFloat("LastMoveY" , 0f);
            }
        } else {
        touched = false;
        anim.SetBool("walking" , false);
    }
}

1 个答案:

答案 0 :(得分:1)

我会说这是因为你的角色永远不会停留在目标位置。

根据我从您的代码中获得的内容,每个帧更新您的角色都会验证变量&#34; target&#34;改变了它的立场,通过评估&#34; movementDirection&#34;在x和y轴上有任何大小。

当它使用变量&#34;运动&#34;计算朝向预定目的地的位置增量,对吧?但是,当您的角色对象非常靠近目的地时,增量计算在&#34;运动&#34;在行之后

movement *= Time.deltaTime;

对于离开的距离来说太大了,所以你的角色超出了目标位置。另一种方式是:

想象一下你角色的速度是3(为了这个论点)。然后你有:

(C是你的角色,T是目标)

| C | | | | | | | | T | | | | | | |

然后,

| | | | C | | | | T | | | | | | |

然后,

| | | | | | | C | T | | | | | | |

然后,

| | | | | | | | T | | C | | | | |

如您所见,它的超速使其通过目标位置。你的脚本接下来会做什么?它将反转移动方向,因此您将拥有:

| | | | | | C | T | | | | | | |再次

然后,

| | | | | | | T | | C | | | | |

然后,

| | | | | | C | T | | | | | | |

所以你的角色永远被锁定在这个循环中,总是在目标附近的两个位置之间切换,这会产生你看到的闪烁效果。

建议:

  1. 更改计算角色动作的方式,而不是使用翻译,添加刚体和使用物理(虽然我知道你不想选择这个)

  2. 写一个if语句,检查字符是否与目标非常接近。如果是,只需将其移动到该位置,如

    transform.position = target;

  3. 简单地降低角色的速度。这是最不值得推荐的选项,因为它现在可以解决问题,但可能会在以后再次发生。

  4. EDIT1:在开始时我的回答更加清晰。

    EDIT2:纠正了我的类比错误