tanaka's Programming Memo

プログラミングについてのメモ。

キャラクタコントローラ(CharacterController)

歩き回るキャラクタを作る時に便利。
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平面での移動でも、加速度運動ならば、加速時に経過時間を掛けておく必要がある。一定速度で動かす場合は、速度を直接代入でよい。