カテゴリー: Tech

【Unity】Raycastを利用して接地判定を行う

はじめに

こんにちはsuzukiです。久しぶりにunityを触り色々忘れてしまっていたので、改めて学び直しております。
今回は接地判定の利用について簡単にまとめていこうと思います。

今回やりたいこと

unityのStandardAssetでジャンプを行うキャラクターは簡単に利用できるのですが、ジャンプを自分で設定するにはいくつかのハードルがあります。今回は内容はそのうちの接地判定について説明します。

色々な接地判定

検索すると様々な接地判定方法が見つかります。
・Rayを利用する方法
・CharacterControllerを利用する方法
・CheckSphereを利用する方法
平らなフィールドで利用する場合はCharacterControllerが簡単なのでおすすめなのですが、凸凹なフィールドなどを想定するのであれば単体で使わない方が良さそうです。
今回はRayを利用する方法を説明していきます。

Rayとは

Rayとは和訳すると光線という意味でワールド座標から方向を決めて生成します。
あたり判定や接地判定で使われるのがRaycastという機能になります。
イメージとしてオブジェクトから下向きに光線を放ち、その光線が他のオブジェクトにヒットするかという判定を行えます。
あるオブジェクトの接地判定の際には
そのオブジェクトの中央から足元まで光線を放ち、その足元の光線が他のオブジェクトにぶつかっているかどうかで判定できます。

接地判定

接地判定を行う場合は下記のようなコードで可能です。
Rayのコードについて、接地判定を行いたいオブジェクトの座標から、↓方向を指定します。
RayCastの最大距離をオブジェクトの高さ/2+少し余裕を持たせるぐらいに設定しの接地判定を行います。

    bool CheckGrounded()
    {
        //放つ光線の初期位置と姿勢
        var ray = new Ray(transform.position + Vector3.up * 0.1f, Vector3.down);
        //光線の距離(今回カプセルオブジェクトに設定するのでHeight/2 + 0.1以上を設定)
        var distance = 1.2f;
        //Raycastがhitするかどうかで判定レイヤーを指定することも可能
        return Physics.Raycast(ray, distance);
    }

ジャンプのコードを記述

実際に接地している際にジャンプをさせるコードを書いてみました。

public class PlayerController : MonoBehaviour
{
    private Rigidbody rb;
    private bool isGrounded;
    // Start is called before the first frame update
    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    // Update is called once per frame
    void Update()
    {
        //接地判定
        isGrounded = CheckGrounded();
        //スペースキーをタップした際の動作
        if (Input.GetKeyDown(KeyCode.Space))
        {
            //
            if (isGrounded)
            {
                isGrounded = false;
                rb.AddForce(Vector3.up * 200);
            }
        }
    }

    bool CheckGrounded()
    {
        //放つ光線の初期位置と姿勢
        var ray = new Ray(transform.position + Vector3.up * 0.1f, Vector3.down);
        //光線の距離(今回カプセルオブジェクトに設定するのでHeight/2 + 0.1以上を設定)
        var distance = 1.2f;
        //Raycastがhitするかどうかで判定レイヤーを指定することも可能
        return Physics.Raycast(ray, distance);
    }
}

さいごに

今回はシンプルにRaycastを使う方法を説明しました。StandardAssetのロジックではそのほかに接地判定として経過時間を持って正確性をあげるコードが書かれていたり、CharacterControllerの接地判定でfalseの場合のみ今回のようなRaycastを利用した判定を行なう方法があったりとかなり奥が深いです。
次回はこちらの記事をもとにキャラクターにアニメーションを設定していきます。

おすすめ書籍

suzuki

シェア
執筆者:
suzuki
タグ: Unity

最近の投稿

フロントエンドで動画デコレーション&レンダリング

はじめに 今回は、以下のように…

3週間 前

Goのクエリビルダー goqu を使ってみる

はじめに 最近携わっているとあ…

1か月 前

【Xcode15】プライバシーマニフェスト対応に備えて

はじめに こんにちは、suzu…

2か月 前

FSMを使った状態管理をGoで実装する

はじめに 一般的なアプリケーシ…

3か月 前