UnityUnityメモ

Unity開発:CharacterControllerでスムーズな階段移動を実現する

Unity

はじめに

こんにちは!今日は、UnityでCharacterControllerのSimpleMoveを使って、オブジェクトが階段をかけ上がれるようにする方法を解説します。初心者の方でも分かりやすいように説明するので、一緒に進めてみましょう。

Unityを触ったことがないという方はコチラの記事から見てみてください!



地面と階段を作成

まずは、地面と階段を作りましょう。

地面の作成

  1. ヒエラルキー(Hierarchy)ウィンドウを右クリックします。
  2. 「3D Object」→「Plane」を選びます。これが地面になります。
  3. Planeを「Ground」とリネームしましょう。

階段の作成

  1. ヒエラルキー(Hierarchy)ウィンドウを右クリックします。
  2. 「3D Object」→「Cube」を選びます。これが階段の1段目になります。
  3. Cubeを適切なサイズに変更して、「Step1」とリネームします。
  4. 「Step1」を複製して階段の各段を作ります。複製は「Ctrl + D」キーを使うと便利です。各段を適切な位置に移動させて、階段の形にしましょう。



プレイヤーオブジェクトの作成

次に、CharacterControllerを使うためのプレイヤーオブジェクトを作成します。

  1. ヒエラルキー(Hierarchy)ウィンドウを右クリックします。
  2. 「3D Object」→「Capsule」を選びます。これがプレイヤーオブジェクトになります。
  3. Capsuleを「Player」とリネームしましょう。
  4. 向いている方向をわかりやすくするために、Sphereを取り付けます。Sphereを作成してから、サイズを調整してCapsuleの子オブジェクトにしましょう。

CharacterControllerを追加

プレイヤーオブジェクトにCharacterControllerコンポーネントを追加します。

  1. Playerオブジェクトを選択します。
  2. インスペクター(Inspector)ウィンドウで「Add Component」ボタンをクリックします。
  3. 「CharacterController」と検索して、選択します。



スクリプトの作成

次に、プレイヤーの動きを制御するスクリプトを作成します。

  1. ヒエラルキー(Hierarchy)ウィンドウを右クリックします。
  2. 「Create」→「C# Script」を選びます。
  3. スクリプト名を「PlayerMove」としましょう。

スクリプトを以下のように編集します。

コード全体の説明

プレイヤーキャラクターが前後に移動し、左右に回転できるようにするスクリプトです。

各部分の説明

  1. using UnityEngine;
    • Unityの機能を使うために必要な命令です。
  2. public class PlayerMove : MonoBehaviour
    • PlayerMoveというクラスを定義します。これはMonoBehaviourというUnityの基本クラスを継承しています。
  3. public float speed = 3.0f;
    • プレイヤーキャラクターの移動速度を設定します。デフォルトの速度は3.0です。
  4. public float rotateSpeed = 3.0f;
    • プレイヤーキャラクターの回転速度を設定します。こちらもデフォルトで3.0です。
  5. void Update()
    • 毎フレームごとに呼び出される関数です。ゲーム中のキャラクターの動きを処理します。
  6. CharacterController controller = GetComponent<CharacterController>();
    • CharacterControllerコンポーネントを取得します。このコンポーネントはキャラクターの物理演算を管理します。
  7. transform.Rotate(0, Input.GetAxis("Horizontal") * rotateSpeed, 0);
    • 矢印キーの左右の入力に応じてキャラクターを回転させます。Y軸(縦方向)を中心に回転します。
  8. Vector3 forward = transform.TransformDirection(Vector3.forward);
    • キャラクターの前方方向を取得します。
  9. float curSpeed = speed * Input.GetAxis("Vertical");
    • 矢印キーの上下の入力に応じて現在の速度を計算します。
  10. controller.SimpleMove(forward * curSpeed);
    • キャラクターを計算した速度で前後に移動させます。

全体の動き

  • 矢印キーの入力を取得し、その入力に応じてキャラクターを回転または移動させます。
  • 左右の矢印キーはキャラクターをその場で回転させます。
  • 上下の矢印キーはキャラクターを前後に移動させます。

まとめ

このスクリプトは、CharacterControllerコンポーネントを使って、プレイヤーキャラクターをキーボードの矢印キーで操作できるようにしています。左右キーで回転し、上下キーで前後に移動します。スピードや回転速度は調整可能なので、自分の好みに合わせて変更することもできます。

using UnityEngine;

public class PlayerMove : MonoBehaviour
{
    public float speed = 3.0f;
    public float rotateSpeed = 3.0f;

    void Update()
    {
        CharacterController controller = GetComponent<CharacterController>();
        // 左右キー Yを軸として回転
        transform.Rotate(0, Input.GetAxis("Horizontal") * rotateSpeed, 0);

        // 上下キー 前後移動
        Vector3 forward = transform.TransformDirection(Vector3.forward);
        float curSpeed = speed * Input.GetAxis("Vertical");
        controller.SimpleMove(forward * curSpeed);
    }
}



スムーズに移動する

CharacterControllerを使って階段をスムーズに駆け上がるためのキーは、「Slope Limit」と「Step Offset」の設定です。CharacterControllerのインスペクターからこれらの値を調整しましょう。

  • Slope Limit: 斜面を登れる最大角度を指定します。階段をスムーズに上がるためには、この値を実際の階段の角度に合わせるか、それよりも少し大きめに設定すると良いでしょう。
  • Step Offset: キャラクターが乗り越えられる階段の高さを指定します。階段の高さに合わせてこの値を調整しましょう。



シーンを保存してプレイ

最後に、シーンを保存してプレイしてみましょう。

  1. メニューから「File」→「Save Scenes」を選び、シーンを保存します。
  2. 「Play」ボタンを押して、プレイヤーが階段をかけ上がれるか確認してみましょう。

これで完成です!CharacterControllerを使って、オブジェクトが階段をかけ上がる動きをつけることができました。これからもUnityのいろいろな機能を試してみてくださいね。



Moveを使用したスクリプト

SimpleMoveではジャンプができません。CharacterController.Moveを使用してジャンプ機能を付けることができます。

コード全体の説明

このスクリプトは、オブジェクトを前後左右に動かし、ジャンプさせるためのものです。重力もシミュレーションされていて、ジャンプ後には自然に落下します。

各部分の説明

  1. 必要なライブラリのインポート
    ここではUnityの基本的な機能を使うために必要なライブラリをインポートしています。
  2. クラスの定義
    CapsuleMoveという名前のクラスを定義しています。MonoBehaviourを継承しているので、Unityのコンポーネントとして使えます。
  3. 変数の定義
    • speed: キャラクターの移動速度を決める変数です。
    • jumpSpeed: ジャンプする時の上昇速度を決める変数です。
    • gravity: 重力の強さを決める変数です。
    • moveDirection: キャラクターの移動方向を表す変数です。
    • controller: キャラクターを制御するためのコンポーネントです。
  4. Startメソッド
    スクリプトが最初に実行される時に呼ばれます。ここでは、キャラクターに付いているCharacterControllerコンポーネントを取得しています。
  5. Updateメソッド
    Updateメソッドは毎フレーム呼ばれます。以下にその動きを説明します:
    • 地面に接地している時csharpコードをコピーするif (controller.isGrounded)キャラクターが地面にいるかどうかを確認します。
      • 移動方向の設定
        Input.GetAxis("Horizontal")Input.GetAxis("Vertical")でプレイヤーの入力(矢印キーやWASDキー)を取得し、それに基づいて移動方向を設定します。transform.TransformDirection(moveDirection)でオブジェクトの向きに合わせた移動方向に変換し、speedを掛けて移動速度を設定します。
      • ジャンプ
        プレイヤーがジャンプボタンを押した時に、移動方向のy成分にjumpSpeedを設定してジャンプさせます。
    • 重力の適用
      毎フレームごとに重力を適用して、キャラクターが自然に落下するようにします。
    • キャラクターの移動
      CharacterControllerを使ってキャラクターを移動させます。

全体の動き

このスクリプトにより、カプセル型のキャラクターはプレイヤーの入力に応じて前後左右に移動し、ジャンプすることができます。また、重力が適用されるので、ジャンプ後に自然に落下します。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class CapsuleMove : MonoBehaviour
{
    public float speed = 6.0f;
    public float jumpSpeed = 8.0f;
    public float gravity = 20.0f;
 
    private Vector3 moveDirection = Vector3.zero;
    private CharacterController controller;
 
    void Start()
    {
        controller = GetComponent<CharacterController>();
    }
 
    void Update()
    {
        if (controller.isGrounded)
        {
            moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0.0f, Input.GetAxis("Vertical"));
            moveDirection = transform.TransformDirection(moveDirection);
            moveDirection = moveDirection * speed;
 
            if (Input.GetButton("Jump"))
            {
                moveDirection.y = jumpSpeed;
            }
        }
 
        moveDirection.y = moveDirection.y - (gravity * Time.deltaTime);
        controller.Move(moveDirection * Time.deltaTime);
    }
}



おすすめのアセット

Character Controller Proは、Unityでキャラクターの動きをリアルに再現するためのツールです。このアセットは、物理ベースの動きやアニメーションを簡単に設定でき、3Dおよび2Dゲームの開発に最適です。特に、プラットフォーマーやサードパーソンビューのゲームに向いています。直感的なインターフェースと高いカスタマイズ性が特徴で、初心者でも使いやすいです。