足元だけを当たり判定にする

トップへ

参考ページ

https://yttm-work.jp/unity/unity_0023.html
https://kan-kikuchi.hatenablog.com/entry/RayCast4
https://unity-yuji.xyz/raycast-no-response/
https://kan-kikuchi.hatenablog.com/entry/RayCast4

どういうときに使うか

 壁にぶつかったときにひっかかったり多段ジャンプが発動したりするとき

どう解決するか

 Raycastを使って足元だけRayを伸ばして設置判定する。
 なおPlayerのLayerと床のLayerが同じ場合、RayがHitしない(設置扱いにならない)ので、Player側のLayerを変えておくこと。
 また、RaycastするときにLayerMaskをきちんと指定しないとやはりHitしないので大変。


    // 接地判定結果
    private bool isGround;

    void Update()
    {
        CheckGround();
    }


    private static float RAY_LENGTH = 0.5f;

    void CheckGround() 
    {
        /* 設置判定(足元だけバージョン) */
        Vector2 rayPosition = transform.position + new Vector3(0.5f, -1f, 0);
        Ray2D ray = new Ray2D(rayPosition, transform.up * -1);

        int layerMask = LayerMask.GetMask(new string[] {
            "Default"
        });

        RaycastHit2D hit = Physics2D.Raycast((Vector2)ray.origin, Vector2.down, RAY_LENGTH, layerMask);

        if (hit.collider == null) 
        {
            if (SystemConfig.Debug.ViewRayCast) 
            {
                Debug.DrawRay(ray.origin, ray.direction * RAY_LENGTH, Color.blue);
            }
            isGround = false;
        }
        else if (!isGround)
        {
            if (hit.collider.name == "Field") 
            {
                if (SystemConfig.Debug.ViewRayCast) 
                {
                    Debug.DrawRay(ray.origin, ray.direction * RAY_LENGTH, Color.red);
                    Debug.Log("着地");
                }
                isGround = true;
            }
            else
            {
                if (SystemConfig.Debug.ViewRayCast) 
                {
                    // 想定外
                    Debug.DrawRay(ray.origin, ray.direction * RAY_LENGTH, Color.red);
                }
            }
        } 
        else 
        {
            if (SystemConfig.Debug.ViewRayCast) 
            {
                Debug.DrawRay(ray.origin, ray.direction * RAY_LENGTH, Color.green);
            }
        }
    }