我在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);
}
}
答案 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 | | | | | | |
所以你的角色永远被锁定在这个循环中,总是在目标附近的两个位置之间切换,这会产生你看到的闪烁效果。
建议:的
更改计算角色动作的方式,而不是使用翻译,添加刚体和使用物理(虽然我知道你不想选择这个)
写一个if语句,检查字符是否与目标非常接近。如果是,只需将其移动到该位置,如
transform.position = target;
简单地降低角色的速度。这是最不值得推荐的选项,因为它现在可以解决问题,但可能会在以后再次发生。
EDIT1:在开始时我的回答更加清晰。
EDIT2:纠正了我的类比错误