好吧,我差不多完成了我的2d rpg点击移动游戏。如果你看一下这个video,当我点击我的播放器时,一旦它到达它的位置,就会看到错误的方向,而不是直接朝向玩家。为了让自己更清晰,这是我目前正在使用的精灵表的image,因为你可以看到它有8个方向。当您点击here(在游戏中)时,我的播放器会向下走,面对direction或此direction,而不是面对direction(正常/首选位置) )。当我点击here(在游戏中)我的播放器会向前走,面对此direction或面对此direction,而不是面对此direction时,也会发生这种情况。一旦到达目的地,我怎样才能确保我的玩家面向正确的方向。同样这只发生在Y轴内,因此沿X轴行走是很好的。
private Animator anim;
public float speed = 15f;
private Vector3 target;
private bool touched;
private bool playerMovementRef;
void Start () {
target = transform.position;
anim = GetComponent<Animator> ();
}
void Update () {
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;
Vector3 animDirection = Vector3.zero;
if (movementDirection.sqrMagnitude > 0)
{
// Use >= to default to horizontal on both being equal
if (movementDirection.x > movementDirection.y)
animDirection.x = 1;
else
animDirection.y = 1;
anim.SetBool ("walking", true);
anim.SetFloat ("SpeedX", movementDirection.x);
anim.SetFloat ("SpeedY", movementDirection.y);
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 {
if (Mathf.Approximately (transform.position.x, target.x) && Mathf.Approximately (transform.position.y, target.y)) {
touched = false;
anim.SetBool ("walking", false);
} else {
transform.position = Vector3.MoveTowards (transform.position, target, speed * Time.deltaTime);
}
}
}
}
答案 0 :(得分:2)
我刚刚开始使用Unity,但希望我能提供帮助。
从您发布的视频中我注意到,当x部分中的oldPosition和newPosition点击不同时,精灵只是'错误',例如当您单击直接时,它将显示所需的行为和精灵。
您是否尝试打印出代码所用的x和y值来计算它设置的精灵?
起初我想也许是因为你在混合树中设置的值是-1,1等,并且由于规范化,你有时会以0.9为特定值。
您是否可以尝试使用动画窗口打开调试它,就像您最后一样?写下这些值并在Desired和Undesired行为之间进行比较可能会告诉你更多信息。
抱歉,我没有针对您的问题的具体解决方案,但我希望这会有所帮助。
编辑澄清:
基本上,我建议的是:
1)打印出行为发生时获得的值,如何打印这些内容的示例是使用LogFormat,例如:
Debug.LogFormat("X: {0}, Y: {1}", xPosition, yPosition);
现在,您将在完成移动时获得打印出的值。
2)使用'错误的'精灵记下移动完成时的值,并一直点击移动直到' Right '精灵出现了。再次记下这些值。
3)比较每个值,找出差异。现在推断为什么差异是这样的,将这些值与混合树结合使用。
4)一旦您知道原因,请返回您的代码/混合树并重写/修复它以按预期工作。