Unity 2Dで「雲に引っ掛かる」を止める ― 回転固定・摩擦0・角丸だけに絞った対処法
TL;DR
引っ掛かりの主因は 回転+摩擦+角。
次の3つだけでほぼ解消できます。
- Freeze Rotation(Z) で回転を止める
- Physics Material 2D(Friction=0) を当てて摩擦をなくす
- 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)
接触面に摩擦があると減速・停止時に引きずられ→角に噛む挙動が出やすくなります。接触する両者に摩擦ゼロのマテリアルを割り当てます。
作成手順
- Assets > Create > 2D > Physics Material 2D
- 名前例:NoFriction2D
- 設定
- 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点だけで「雲に引っ掛かる」問題は高確率で解消します。
ディスカッション
コメント一覧
まだ、コメントがありません