【Unity】CharacterControllerで氷の上を滑るシミュレーションを実装する方法

2024年9月17日

この記事では、Unityでキャラクターが氷の上を滑る動作を実装する手順を説明します。キャラクターコントローラを使用してプレイヤーの動きを制御し、スクリプトで滑る動きをシミュレートします。

手順

新しいプロジェクトを作成

  • Unityを起動して新しいプロジェクトを作成します。

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

  • Hierarchyビューでプリミティブオブジェクト(例: CapsuleCubeSphereなど)を作成し、名前を「Player」に変更します。
  • または、外部で作成した3Dモデル(FBXOBJ形式)をUnityのAssetsフォルダにインポートし、それを使用してPlayerオブジェクトとして設定します。
  • 注意:プリミティブオブジェクトにはデフォルトでコライダーがアタッチされていますが、キャラクターコントローラには独自のコライダーが含まれているため、デフォルトのコライダーは削除します

キャラクターコントローラの追加

  • PlayerオブジェクトにCharacter Controllerコンポーネントを追加します。このコンポーネントは、プレイヤーの移動をスクリプトで制御します。
  • 重要:キャラクターコントローラでは、Physics Materialは無効です。摩擦や滑りなどの物理効果はスクリプトで直接制御する必要があります。

氷のオブジェクトの作成

  • Hierarchyビューで新しいGameObjectを作成し、名前を「Ice」とします。
  • IceオブジェクトにBox Colliderを追加して、衝突判定を行えるようにします。
  • 重要IceオブジェクトにPhysics Materialを設定しても、キャラクターコントローラではこの設定は無効になります。そのため、氷の上での滑る挙動はスクリプトで再現します。

プレイヤーの移動スクリプト

  • Playerオブジェクトに以下のスクリプトを追加し、プレイヤーが氷の上を滑る動きをシミュレートします。
using UnityEngine;

public class PlayerMovement : MonoBehaviour
{
    public float speed = 10f;
    private CharacterController controller;
    private Vector3 moveDirection = Vector3.zero;
    private bool isOnIce = false;

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

    void Update()
    {
        float horizontal = Input.GetAxis("Horizontal");
        float vertical = Input.GetAxis("Vertical");
        Vector3 inputDirection = new Vector3(horizontal, 0, vertical);
        inputDirection = transform.TransformDirection(inputDirection);

        // 通常の移動
        if (!isOnIce)
        {
            moveDirection.x = inputDirection.x * speed;
            moveDirection.z = inputDirection.z * speed;
        }
        else
        {
            // 氷の上では摩擦を減らした滑る挙動をシミュレート
            moveDirection = Vector3.Lerp(moveDirection, inputDirection * speed, Time.deltaTime);
        }

        controller.Move(moveDirection * Time.deltaTime);
    }

    void OnControllerColliderHit(ControllerColliderHit hit)
    {
        if (hit.gameObject.tag == "Ice")
        {
            isOnIce = true; // 氷に触れているとき滑る状態にする
        }
        else
        {
            isOnIce = false; // 氷以外の表面では通常の移動に戻る
        }
    }
}

タグの設定

  • Iceオブジェクトに「Ice」タグを設定します。プレイヤーがIceオブジェクトに衝突すると、OnControllerColliderHitメソッドが呼び出され、氷の上にいることを判定して滑る動作が再現されます。

拡張アイデア

このサンプルをもとに、以下のような機能を追加してゲームを拡張できます。

  • ジャンプ機能: プレイヤーが氷の上でジャンプして、より遠くまで飛べるようにする。
  • アイテムの追加: 氷の上にアイテムを配置し、取得するとスコアが増える。
  • 障害物の追加: 氷の上に障害物を置き、プレイヤーが衝突するとゲームオーバーにする。

これで氷の上を滑るサンプルが完成です。キャラクターコントローラでは物理エンジンのPhysics Materialが無効であるため、スクリプトを使って滑りをシミュレートします。また、氷の上にいるかどうかをタグで判定し、スムーズな滑りの動きを実現しています。

Unity

Posted by hidepon