Unity3D:改善玩家的动画

时间:2016-06-21 08:34:17

标签: c# animation unity3d

我有一个2d RPG点击移动游戏。我想改进我的代码,以便我的玩家动画看起来不坏,例如这是我的播放器动画的video。正如你所看到的那样,我的播放器的空闲状态动画并不是最好的。该视频还允许您查看我的动画师,以防万一我在混合树或过渡中犯了错误。如何改进我的代码,以便我的播放器的动画不错,我的播放器的空闲状态动画面向它所面对的正确方向。谢谢!

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;

        if (movementDirection.x != 0 || movementDirection.y != 0)
        {
            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);
        }
    }
}
  }

为了更清楚,我想做这样的事情:http://imgur.com/j7gBeDA但是我的代码有问题,我很接近它只是在它进入空闲状态时没有正确面对。我已经检查了“退出时间”是否已开启,但事实并非如此,所以我不确定我做错了什么。我也确保我调试它。它并没有完全给我一个我正在寻找的答案。

2 个答案:

答案 0 :(得分:1)

目前,您正在使用一大堆if-then块来设置mechanim控制器中的各种浮点数,最终控制角色所面对的方向。 movementDirection.xmovementDirection.y都可能(实际上非​​常可能)为非负数。但是,您的动画面板只是四向的,因此您需要将2D矢量转换为在其xy之间仅具有一个非零值的矢量。

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

答案 1 :(得分:0)

在你的空闲动画中,你有一个混合树,在Freeform Cartesian中有四种不同的状态。问题是你只有四个离散的动画可供选择,而不是像3d中的情况那样无限的运动范围。看起来发生的事情是你为LastMoveX和LastMoveY中的每一个获得非零值。因此,结果将动画放在混合树的一个角落 - 正好在两个状态之间。我认为决定最终结果面临哪种方式的唯一因素是浮点不精确。要解决这个问题,您可以将空闲状态的逻辑归结为它的四个组件,单个变量可能会起作用,只需将每个动画分配给一个值。