【Unity】階段が登れない時はCharacterControllerを使う

unity

UnityでFPSゲームでプレイヤーにRigidbodyをつけてスプリプトで操作するようにしていたんですよ。

でもね、階段が登れないんです。

困ったので、しばらくググってたら以下のサイトが出てきました。

https://forum.unity.com/threads/how-to-get-a-rigidbody-player-to-walk-on-any-type-of-stairs.133573/

上記のサイトに、

「Character Controllerを使えばいいじゃん。」

って回答があるんですよ。

CharacterControllerとは??

CharacterController は Rigidbody による処理を持たなくてもコリジョンによって簡単に動きの制限を行うことが可能です。 CharacterController は力には影響されず、Move 関数を呼び出した時のみ移動します。 その時に移動を行いますがコリジョンによって制限されます。

CharacterControllerには階段を登るためのパラメータStep Offsetまで用意されています。

Rigidbodyを使わずともCharacterControllerを使えばキャラを操作できるのです。

CharacterController単体だと動かないので、操作用スクリプトを作成。

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour
{
    private CharacterController controller;

    [SerializeField]
    private float speed = 3.0f;
    private float gravity = 9.8f;

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

    void Update()
    {
        CalculateMove();

        if (Input.GetMouseButtonUp(0))
        {
            Cursor.lockState = CursorLockMode.Locked;
            Cursor.visible = false;
        }
        if (Input.GetKeyDown(KeyCode.Escape))
        {
            Cursor.lockState = CursorLockMode.None;
            Cursor.visible = true;
        }
    }

    void CalculateMove()
    {
        float horizontalInput = Input.GetAxis("Horizontal");
        float verticalInput = Input.GetAxis("Vertical");
        Vector3 direction = new Vector3(horizontalInput, 0, verticalInput);
        Vector3 velocity = direction * speed;
        velocity.y -= gravity;
        velocity = transform.transform.TransformDirection(velocity);
        controller.Move(velocity * Time.deltaTime);
    }
}

これで無事解決しました。