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