Единство. Как повернуть игрока по ходу движения - PullRequest
0 голосов
/ 09 июля 2020

Как вы можете видеть на этом видео, объект движется в любом направлении, но его модель не вращается в направлении движения. Как исправить ??

Ссылка на видео

https://youtu.be/n4FDFDlsXK4

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MoveController : MonoBehaviour
{
    private CharacterController controller = null;
    private Animator animator = null;
    private float speed = 5f;


    void Start()
    {
        controller = gameObject.GetComponent<CharacterController>();
        animator = gameObject.GetComponent<Animator>();
    }

    void Update()
    {
        float x = Input.GetAxis("Horizontal");
        float z = Input.GetAxis("Vertical");

        Vector3 move = (transform.right * x) + (transform.forward * z);
        controller.Move(move * speed * Time.deltaTime);

        var angle = Mathf.Atan2(move.z, move.x) * Mathf.Rad2Deg;

        if (x != 0 || z != 0) animator.SetTrigger("run");
        if (x == 0 && z == 0) animator.SetTrigger("idle");
    }
}

1 Ответ

2 голосов
/ 09 июля 2020

Не используйте transform.forward и transform.right для создания вектора движения, просто сделайте его в мировом пространстве. Затем вы можете установить transform.forward в качестве направления движения.

Также, как derHu go, упомянутый ниже в комментарии, вы должны

  1. избегайте использования точного равенства для сравнения чисел с плавающей запятой. Вместо этого используйте Mathf.Approximately или используйте свой собственный порог, как показано ниже

  2. , избегайте установки триггеров каждый кадр. вместо этого вы можете использовать флаг, чтобы определить, находитесь ли вы уже в режиме ожидания или уже работаете, и устанавливать триггер только в том случае, если вы еще не сделали этого.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MoveController : MonoBehaviour
{
    private CharacterController controller = null;
    private Animator animator = null;
    private float speed = 5f;
    bool isIdle;

    void Start()
    {
        controller = gameObject.GetComponent<CharacterController>();
        animator = gameObject.GetComponent<Animator>();
        isIdle = true;
    }

    void Update()
    {
        float x = Input.GetAxis("Horizontal");
        float z = Input.GetAxis("Vertical");

        Vector3 move = new Vector3(x, 0f, z);
        controller.Move(move * speed * Time.deltaTime);

        var angle = Mathf.Atan2(move.z, move.x) * Mathf.Rad2Deg;

        if (move.magnitude > idleThreshold)
        {
            transform.forward = move;
            if (isIdle) 
            {
                animator.SetTrigger("run");
                isIdle = false;
            }
        } 
        else if (!isIdle)
        {
            animator.SetTrigger("idle");
            isIdle = true;
        }
    }
}
...