3Dキャラクターのコントロール方法について

 Unity において、使用する3DモデルのAnimationの違いにより、キャラクターをコントロールする実装方法が変わる。

1.モデルのAnimationの中にRotation情報が含まれている場合
コードにおいて、Rotationに関する制御必要がない。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(Rigidbody))]
public class UNITYCHANController : MonoBehaviour {
public float MovePower=20f;
public float TurnPower=50f;

private Animator anim;
private float inputH;
private float inputV;
private Rigidbody m_Rigidbody;
// Use this for initialization
void Start () {
anim = GetComponent<Animator>();
m_Rigidbody = GetComponent<Rigidbody>();
}

// Update is called once per frame
void Update () {

inputH = Input.GetAxis("Horizontal");
inputV = Input.GetAxis("Vertical");

anim.SetFloat("inputH", inputH);
anim.SetFloat("inputV", inputV);

float moveZ = inputV * MovePower * Time.deltaTime;
float moveX = inputH * TurnPower * Time.deltaTime;
m_Rigidbody.velocity = new Vector3(moveX, 0, moveZ);
Debug.Log(m_Rigidbody.velocity);

if (Input.GetKeyDown(KeyCode.LeftShift))
{
anim.SetBool("run", true);
MovePower *= 2f;
}else if (Input.GetKeyUp(KeyCode.LeftShift))
{
anim.SetBool("run", false);
}

if (Input.GetKeyDown(KeyCode.Space))
{
anim.SetBool("jump", true);
}else if (Input.GetKeyUp(KeyCode.Space))
{
anim.SetBool("jump", false);
}
}
}

2.モデルのAnimationの中にRotation情報が含まれていない場合、
コードでキャラクターのRotation情報を変える必要がある。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(Rigidbody))]
public class PlayerController : MonoBehaviour {
    public float RunSpeed = 100.0f;
    public float TurnSmoothTime = 0.2f;

    private Rigidbody m_Rigidbody;
    private Animator m_Anim;
    private float m_TurnSmoothVelocity;
  // Use this for initialization
  void Start () {
        m_Rigidbody = GetComponent<Rigidbody>();
        m_Anim = GetComponent<Animator>();
    }

    // Update is called once per frame
    void Update()
    {
        float inputX = 0f;
        float inputZ = 0f;

        inputX = Input.GetAxis("Horizontal");
        inputZ = Input.GetAxis("Vertical");

        Vector2 inputDir = new Vector2(inputX,inputZ).normalized;
        if (inputDir != Vector2.zero)
        {
            //z方向とx方向のtanを求め、その角度をrotationに代入する。
            //Mathf.Rad2Degはradianから度に変換する。これは ” 360/(PI * 2) " に等しいです。
            float rotation = Mathf.Atan2(inputDir.x, inputDir.y) * Mathf.Rad2Deg;
            //キャラクターのRotationを指定する。
            transform.eulerAngles = Vector3.up * Mathf.SmoothDampAngle(transform.eulerAngles.y, rotation, ref m_TurnSmoothVelocity,TurnSmoothTime);
        }

        m_Rigidbody.velocity=new Vector3(inputX, 0, inputZ)*RunSpeed*Time.deltaTime;
        m_Anim.SetFloat("inputX", inputX);
        m_Anim.SetFloat("inputZ", inputZ);

    }