2016-06-21 4 views
0

У меня есть 2d RPG нажмите, чтобы переместить игру. Я хочу улучшить свой код, чтобы анимация моих игроков не выглядела плохо, например, это video того, как выглядит анимация моего игрока. Как вы видите, анимация состояния бездействия игрока не самая лучшая. Видео также позволяет увидеть мой аниматор, на случай, если я допустил ошибку в моем дереве смешивания или переходах. Как я могу улучшить свой код, чтобы анимация моего плеера не была плоха, а анимация состояния бездействия моего игрока обращена к правильному направлению, с которым, как предполагается, сталкивается. Спасибо!Unity3D: Улучшение анимации игрока

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 Но у меня возникли проблемы с моим кодом, я близко это просто не смотрит правильно, когда он идет к его простаиванию. Я проверяю, включен ли «время выхода», чего не было, поэтому я не уверен, что я делаю неправильно. Я также удостоверился, что я отлаживаю его, и он точно не дал мне ответа на то, что я искал.

ответ

0

В вашей простой анимации у вас есть дерево смешивания с четырьмя различными состояниями в декартовой форме Freeform. Проблема в том, что у вас есть только четыре дискретных анимации на выбор, а не бесконечный диапазон движения, как это было бы в 3d. Похоже, что происходит то, что вы получаете ненулевые значения для каждого из LastMoveX и LastMoveY. Из-за этого результат помещает вашу анимацию в один угол дерева смешивания - прямо между двумя состояниями. Я думаю, что единственная вещь, определяющая, к какому пути относится конечный результат, - это неточность с плавающей запятой. Чтобы решить эту проблему, вы можете свести логику состояния бездействия к ее четырем компонентам, возможно, будет работать одна переменная, и каждая анимация будет присвоена значению.

1

В настоящее время вы используете грубую связку блоков if-then для установки различных поплавков в механическом контроллере, который в конце контролирует направление, с которым сталкивается персонаж. Возможно (на самом деле весьма вероятно) для иmovementDirection.x и movementDirection.y неотрицательны. Однако ваши панели анимации имеют только четыре направления, поэтому вам необходимо преобразовать 2D-вектор в один, который имеет только один ненулевое значение между его x и y.

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

Спасибо за ваш ответ, мне просто интересно, где бы я это реализовать в своем коде ??? Прости, что я больше нуб. У меня был кто-то, кто помог мне с этим раньше, но он или она не отвечал, и я ждал 4 месяца. Еще раз благодарю вас за ответ так быстро, я очень благодарен. –

+0

Это не «подключаемо» к вашей нынешней реализации, подход неправильный, а не синтаксис/логика. Если вы не уверены, как действовать дальше, я бы предложил сначала изучить некоторые учебники Unity, а не заниматься сложными 2D-анимациями. – sloth

+0

Благодарим вас за предложение, но было бы очень полезно, если вы сможете объяснить это более подробно. Я искал учебное пособие по единству, касающееся 2d rpg, чтобы двигаться, но я не смог найти его. спасибо –

Смежные вопросы