Unity 2Dで「雲に引っ掛かる」を止める ― 回転固定・摩擦0・角丸だけに絞った対処法

TL;DR

引っ掛かりの主因は 回転+摩擦+角

次の3つだけでほぼ解消できます。

  1. Freeze Rotation(Z) で回転を止める
  2. Physics Material 2D(Friction=0) を当てて摩擦をなくす
  3. BoxCollider2D の Edge Radius を少しだけ付けて角を丸める

1) 回転を止める(Freeze Rotation Z)

雲(箱)とプレイヤー(円+箱など)が接触すると、角で微小トルクが生まれて姿勢が傾き→さらに角に乗り上げ→引っ掛かりが起きがち。Z回転を凍結して姿勢を固定します。

設定で行う

  • Rigidbody2D > Constraints > Freeze Rotation (Z) をオン。

コードで行う

void Start()
{
    Application.targetFrameRate = 60;
    var rb = GetComponent<Rigidbody2D>();
    rb.constraints = RigidbodyConstraints2D.FreezeRotation; // Z回転固定
}

注意:キャラの向きを回転で変えていた場合は、SpriteRenderer.flipX などへ切り替えを。


2) 摩擦を0にする(Physics Material 2D)

接触面に摩擦があると減速・停止時に引きずられ→角に噛む挙動が出やすくなります。接触する両者に摩擦ゼロのマテリアルを割り当てます。

作成手順

  1. Assets > Create > 2D > Physics Material 2D
  2. 名前例:NoFriction2D
  3. 設定
    • Friction = 0
    • Bounciness = 0
    • Friction Combine = Minimum(※いずれかが0なら0を採用)

割り当て

  • プレイヤー側の全Collider(Circle/Box/Capsule など)
  • 雲側の Collider(BoxCollider2D など)

片側だけ0でも改善しますが、両側に当てると安定します。


3) 角を丸める(Edge Radius)

角が尖ったままだと、スイープ中に**段差に“乗り上げる”**ことがあります。Edge Radius をごく小さく与えて丸めると、物理解決が滑らかになります。

推奨値

  • 雲の BoxCollider2D > Edge Radius = 0.02 ~ 0.05(ワールドスケールに合わせ微調整)
  • プレイヤー側に Box を併用しているなら同様に少し丸める

付け過ぎると形状が大きく変わるので最小限で。


仕上げのチェックリスト

  • プレイヤー Rigidbody2D は Freeze Rotation(Z)
  • プレイヤー&雲の Collider に NoFriction2D を適用
  • 雲の BoxCollider2D に Edge Radius を付与
  • (任意)Rigidbody2D > Interpolate = Interpolate、Collision Detection = Continuous にすると見た目と接触がさらに安定

よくある疑問

Q. 摩擦を0にすると止まりにくくならない?

A. 空中移動主体のゲームでは問題になりにくいです。地上で自然減速が必要なら、摩擦ではなく**速度減衰(Drag)**やスクリプトで制御する方が再現性が高いです。

Q. まだごく稀に引っ掛かる

A. プレイヤーの当たり判定を CapsuleCollider2D(Vertical) 1枚に集約するとさらに安定します(丸みと高さのバランスが良い)。


参考:今回のプレイヤースクリプトの最小変更例

using UnityEngine;

[RequireComponent(typeof(Rigidbody2D))]
public class PlayerController : MonoBehaviour
{
    Rigidbody2D rb;

    void Start()
    {
        Application.targetFrameRate = 60;
        rb = GetComponent<Rigidbody2D>();
        rb.constraints = RigidbodyConstraints2D.FreezeRotation; // ★Z回転固定
        // 物理マテリアルは Inspector で Colliders に割り当てる
    }
}

まとめ

  • 回転固定で姿勢の暴れを止め、
  • 摩擦0で引きずりを無くし、
  • 角丸で段差乗り上げを防ぐ。この3点だけで「雲に引っ掛かる」問題は高確率で解消します。
訪問数 4 回, 今日の訪問数 4回

C#,Unity

Posted by hidepon