我在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|||||
因此,你的角色永远被锁定在这个循环中,总是在目标附近的两个位置之间变化,这会产生你看到的闪烁效果。
建议:
改变你计算角色移动的方式,比如不使用平移,添加刚体和使用物理(尽管我知道你不想选择这个)
写一个if语句,检查角色是否非常接近你的目标。如果是,就把它移到那个位置,就像一样
transform.position=目标;
只需降低角色的速度。这是最不推荐的选择,因为它现在可能会解决问题,但以后可能会再次出现。
第1版:一开始我的回答更清楚了。
编辑2:更正了我的类比的错误