歩き回るキャラクタを作る時に便利。
Update()やFixedUpdate()内で、GetComponent("CharacterController")でインスタンスを呼び出して、SimpleMove()やMove()で移動。
SimpleMove()はx,z平面の移動のみでよい場合に使う。重力落下はしてくれるが、yの入力を無視するので、ジャンプのような動きは出来ない。
ジャンプをしたい時はMove()を使う。
Move()で重力落下をさせる例。
using UnityEngine; using System.Collections; public class scrChrTest : MonoBehaviour { private Vector3 vel = Vector3.zero; private CharacterController col; // Use this for initialization void Start () { col = (CharacterController)GetComponent("CharacterController"); } void FixedUpdate() { // 落下 vel.y += Physics.gravity.y*Time.fixedDeltaTime; col.Move(vel*Time.fixedDeltaTime); // 着地していたら速度を0にする if (col.isGrounded) { vel.y = 0; } } }
ハマったのは、重力加速時のDeltaTimeの掛け忘れ。
velをMoveに渡す際に、移動距離を経過時間単位になるようにfixedDeltaTimeを掛けているが、加速度であるgravityを速度に加える際にも経過時間を掛ける必要があった。
x,z平面での移動でも、加速度運動ならば、加速時に経過時間を掛けておく必要がある。一定速度で動かす場合は、速度を直接代入でよい。