Unity3D:如何停止角色停止移动时出现的闪烁



我在youtube上学习了本教程。这花了我一段时间,但我几乎已经从箭头移动转变为鼠标触摸。但现在我遇到了这个问题,当角色停止移动时会出现闪烁。我看了看他发给我的链接,但不起作用。请看这个视频,告诉你我在说什么。有人知道当角色停止移动时如何停止闪烁吗?这是我的代码:

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

我想说这是因为你的角色从未真正停在目标位置上。

根据我从你的代码中得到的信息,每一帧更新你的角色都会通过评估"movementDirection"在x和y轴上是否有任何大小来验证变量"target"是否改变了它的位置。

当它这样做时,它使用变量"移动"来计算朝向预期目的地的位置增量,对吗?然而,当你的角色对象非常接近目的地时,在线后的"移动"处计算的增量

movement *= Time.deltaTime;

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

假设你的角色的速度是3(为了这个论点)。然后你有:

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

|C

然后,

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

然后,

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

然后,

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

正如你所看到的,它过快的速度使它通过目标位置。你的剧本接下来会做什么?它将反转移动方向,因此您将拥有:

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

然后,

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

然后,

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

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

建议:

  1. 改变你计算角色移动的方式,比如不使用平移,添加刚体和使用物理(尽管我知道你不想选择这个)

  2. 写一个if语句,检查角色是否非常接近你的目标。如果是,就把它移到那个位置,就像一样

    transform.position=目标;

  3. 只需降低角色的速度。这是最不推荐的选择,因为它现在可能会解决问题,但以后可能会再次出现。

第1版:一开始我的回答更清楚了。

编辑2:更正了我的类比的错误

最新更新