アマゾンバナーリンク

ディスプレイ広告

スポンサーリンク

Unity CharacterControllerを使った時に斜面を滑らせる方法

こんにちは!ジェイです。Unityでキャラクターを動かす時に便利なのが、CharacterControllerで自キャラの操作などによく使います。しかし、Rigidbodyみたいに重力を計算してくれないので自力で実装するしかないです。

今回はそんな場面の一つである斜面をすべらせる方法について解説します。

記事内広告

斜面角度の取得

まず斜面の取得ですが、以前は公式のフォーラムに存在したのですが、今はないので、こちらからCharactorMotor.csをダウンロードし、参考にして、角度取得するメソッドを作ります。

[System.NonSerialized]
public Vector3 groundNormal = Vector3.zero;
 
private Vector3 lastGroundNormal = Vector3.zero;
 
[System.NonSerialized]
public Vector3 lastHitPoint = new Vector3(Mathf.Infinity, 0, 0);
 
float groundAngle = 0;
 
void OnControllerColliderHit(ControllerColliderHit hit)
{
    if (hit.normal.y > 0 && hit.moveDirection.y < 0) {
        if ((hit.point - lastHitPoint).sqrMagnitude > 0.001f || lastGroundNormal == Vector3.zero) {
            groundNormal = hit.normal;
        } else {
            groundNormal = lastGroundNormal;
        }
 
        lastHitPoint = hit.point;
    }
 
    // 現在の接地面の角度を取得
    groundAngle = Vector3.Angle(hit.normal, Vector3.up);
}

この斜面の角度を使って、キャラクターを滑らせる処理を行います。

キャラクターを滑らせる

先程求めた角度(groundAngle)を使って、slopeLimitより角度が大きい時に斜面に沿って滑らせます。

void Update()
{
    Vector3 moveDirection = Vector3.zero;
 
    // ここの間で移動するベクトルを求めてmoveDirectionに入れる
 
    // 地上で斜面にいる場合はその方向へ滑らせる
    if (IsGrounded() && characterController.slopeLimit <= groundAngle) {
        float slidingSpeed = 5f;
        moveDirection.x += groundNormal.x * slidingSpeed;
        moveDirection.y -= groundNormal.y * slidingSpeed;
        moveDirection.z += groundNormal.z * slidingSpeed;
    }
 
    // CharacterControllerで移動
    characterController.Move(moveDirection * Time.deltaTime);
}
 
public bool IsGrounded()
{
    return characterController.isGrounded && (groundNormal.y > 0.01);
}

これでslidingSpeedの速さでY軸を基準に落下するようになります。

Rigidbodyで滑る感じとは違いますが斜面に対して滑らせることができます。

アイコンは鬼塚@取締役さんからお借りしました。

+2