【Unity】CharacterController の Move と SimpleMove メソッド 技術資料

UnityのCharacterControllerコンポーネントは、キャラクターの移動を効率的に制御するための主要なツールです。本資料では、CharacterControllerにおけるMoveメソッドとSimpleMoveメソッドの違い、特徴、使用例について詳しく解説します。


概要

CharacterControllerは、Unityにおいて物理ベースではないキャラクターの移動を管理するためのコンポーネントです。このコンポーネントには、キャラクターの移動を制御するための主要なメソッドとしてMoveSimpleMoveが用意されています。本資料では、これら2つのメソッドの違いと適切な使用シーンについて説明します。


Move メソッド

Move メソッドの概要

Moveメソッドは、キャラクターの移動ベクトルをフレームごとに明示的に指定し、キャラクターを移動させるためのメソッドです。このメソッドは、移動量(ベクトル)を直接制御でき、物理的な衝突や地形の勾配などを考慮した細かな移動ロジックの実装が可能です。

Move メソッドの特徴

  • 移動量の明示的な指定: 開発者が移動ベクトルを直接設定するため、移動の挙動を詳細に制御できます。
  • 物理計算の柔軟性: 重力やその他の力を自分で計算し、移動ベクトルに反映させる必要があります。
  • コライダーとの相互作用: 他のオブジェクトとの衝突時の反応を詳細に制御可能です。
  • 時間管理の自由度: Time.deltaTimeを用いて移動量を調整する必要があります。

Move メソッドの使用例

以下は、Moveメソッドを使用してキャラクターを移動させる基本的なスクリプト例です。

using UnityEngine;

public class CharacterMove : MonoBehaviour
{
    public float speed = 6.0f;
    private CharacterController controller;
    private Vector3 moveDirection = Vector3.zero;
    public float gravity = 9.81f;

    void Start()
    {
        controller = GetComponent<CharacterController>();
    }

    void Update()
    {
        if (controller.isGrounded)
        {
            // 入力に基づいて移動方向を設定
            float moveHorizontal = Input.GetAxis("Horizontal");
            float moveVertical = Input.GetAxis("Vertical");
            moveDirection = new Vector3(moveHorizontal, 0.0f, moveVertical);
            moveDirection = transform.TransformDirection(moveDirection);
            moveDirection *= speed;
        }

        // 重力を適用
        moveDirection.y -= gravity * Time.deltaTime;

        // Moveメソッドで移動
        controller.Move(moveDirection * Time.deltaTime);
    }
}

SimpleMove メソッド

SimpleMove メソッドの概要

SimpleMoveメソッドは、移動速度(速度ベクトル)を指定してキャラクターを移動させるためのメソッドです。このメソッドは内部的に重力を自動的に適用し、Time.deltaTimeを自動で考慮するため、移動処理を簡略化できます。

SimpleMove メソッドの特徴

  • 簡易な使用方法: 移動速度を設定するだけで、重力や時間管理を自動で処理します。
  • 内部的な時間管理: Time.deltaTimeを内部で使用するため、開発者が明示的に時間を掛ける必要がありません。
  • 制限された制御: Moveに比べて移動ロジックの細かな制御が難しいです。
  • 自動的な重力適用: 重力の計算と適用が内部で行われます。

SimpleMove メソッドの使用例

以下は、SimpleMoveメソッドを使用してキャラクターを移動させる基本的なスクリプト例です。

using UnityEngine;

public class SimpleCharacterMove : MonoBehaviour
{
    public float speed = 6.0f;
    private CharacterController controller;

    void Start()
    {
        controller = GetComponent<CharacterController>();
    }

    void Update()
    {
        // 入力に基づいて移動速度を設定
        float moveHorizontal = Input.GetAxis("Horizontal");
        float moveVertical = Input.GetAxis("Vertical");
        Vector3 move = new Vector3(moveHorizontal, 0.0f, moveVertical);
        move = transform.TransformDirection(move);
        move *= speed;

        // SimpleMoveメソッドで移動
        controller.SimpleMove(move);
    }
}

MoveSimpleMove の比較

以下の表は、MoveメソッドとSimpleMoveメソッドの主な違いをまとめたものです。

項目Move メソッドSimpleMove メソッド
移動の指定方法移動量(ベクトル)をフレームごとに計算して指定移動速度(速度ベクトル)を指定
重力の適用開発者が明示的に重力を計算して適用する必要がある自動的に重力が適用される
時間管理Time.deltaTimeを自分で掛ける必要がある内部で自動的に時間が考慮される
柔軟性高い。詳細な移動ロジックの制御が可能低い。簡易的な移動処理に適している
衝突処理の制御詳細に制御可能制限される
使用の容易さやや複雑。移動ロジックを細かく設定する必要がある簡単。基本的な移動を迅速に実装可能

使用する際の選択基準

MoveメソッドとSimpleMoveメソッドは、それぞれ異なる用途と柔軟性を持っています。以下の基準に基づいて、適切なメソッドを選択してください。

Move を選ぶべき場合

  • 詳細な移動制御が必要な場合: 移動ロジックを細かくカスタマイズしたい場合。
  • 独自の物理力を適用したい場合: 重力や他の力を独自に計算・適用する必要がある場合。
  • 高度な衝突処理が必要な場合: 他のオブジェクトとの衝突時の挙動を詳細に制御したい場合。

SimpleMove を選ぶべき場合

  • 基本的な移動処理を迅速に実装したい場合: 簡単な移動機能を素早く実装したい場合。
  • 自動的な重力適用で十分な場合: 重力の詳細な制御が不要で、標準的な重力適用で問題ない場合。
  • 細かな物理制御が不要な場合: 複雑な物理挙動を必要としないシンプルなキャラクター移動を実現したい場合。

まとめ

UnityのCharacterControllerコンポーネントには、キャラクターの移動を制御するためのMoveメソッドとSimpleMoveメソッドが提供されています。

  • Moveメソッドは、移動ベクトルを詳細に制御でき、物理的な挙動や衝突処理を細かく設定する必要がある場合に適しています。
  • SimpleMoveメソッドは、移動速度を簡単に設定でき、重力や時間管理を自動で処理するため、迅速かつシンプルな移動実装に向いています。

プロジェクトの要件やキャラクターの挙動に応じて、適切なメソッドを選択することで、効率的なキャラクター制御を実現できます。