Unity3D:如何改进我的空闲动画(Y轴)

时间:2016-07-04 20:08:12

标签: animation unity3d

好吧,我差不多完成了我的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);
        }
    }
}

}

1 个答案:

答案 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)一旦您知道原因,请返回您的代码/混合树并重写/修复它以按预期工作。