物理チェーン・ロープのセットアップ方法
本ガイドでは、物理チェーン(ロープや鎖)をセットアップする方法を詳しく説明します。
目次
1. 基本的なチェーン構造の理解
チェーンの構成要素
チェーンは以下の要素で構成されます:
- RigidBody2D: チェーンの各リンク(節)
- GrooveJoint2D または PinJoint2D: リンク間の接続
- segノード: 各RigidBody2D内の接続点マーカー(Node2D)
- BreakableJointMonitor2D: ジョイントの破断を監視
- ChainPathBinder2D: チェーンの形状をPath2Dとして可視化
- PathRibbonMesh2D: Path2Dをリボンメッシュで描画
ノード構造の例
ChainRoot (Node2D)
├── RigidBody2D1
│ ├── CollisionShape2D
│ ├── Sprite2D
│ ├── seg1 (Node2D, position: 0, -10)
│ └── seg2 (Node2D, position: 0, 10)
├── RigidBody2D2
│ ├── GrooveJoint2D (RigidBody2D1に接続)
│ ├── CollisionShape2D
│ ├── Sprite2D
│ ├── seg1
│ └── seg2
├── RigidBody2D3
│ └── ...
└── ...
2. 手動セットアップ
2-1. 基本的なチェーンの作成
ステップ1: チェーンのルートノードを作成
- シーンに
Node2Dを配置します(例:ChainRoot) - このノードがチェーンの親になります
ステップ2: RigidBody2Dを配置
ChainRootの子としてRigidBody2Dを複数配置します- 各RigidBody2Dに名前を付けます(例:
Link1,Link2,Link3…) - 各RigidBody2Dの位置を設定します(縦に並べる場合:各リンクの長さに応じて適切な間隔で配置)
ステップ3: CollisionShape2DとSprite2Dを追加
- 各RigidBody2Dの子として
CollisionShape2Dを追加します ShapeにRectangleShape2DまたはCapsuleShape2Dを設定します- 各RigidBody2Dの子として
Sprite2Dを追加します(任意) - テクスチャを設定します
ステップ4: segノードを作成
- 各RigidBody2Dの子として
Node2Dを追加します - 最初のノードを
seg1と命名し、positionを(0, -10)に設定します - 2番目のノードを
seg2と命名し、positionを(0, 10)に設定します- これらは接続点のマーカーです
seg1は上側、seg2は下側の接続点を表します
ステップ5: GrooveJoint2Dを配置
- 2番目以降の各RigidBody2Dの子として
GrooveJoint2Dを追加します - 各GrooveJoint2Dの設定:
position:(0, -16)(RigidBody2Dの上端付近)node_a: 前のRigidBody2Dへのパス(例:../../RigidBody2D)node_b:..(自身のRigidBody2D)bias:0.9(硬い接続)または0.2(柔らかい接続)length:8.0(溝の長さ)initial_offset:1.0または2.0(初期オフセット)
ステップ6: 先頭・末尾の固定(任意)
-
先頭を固定する場合:
StaticBody2Dを配置します- その子として
GrooveJoint2Dを追加します node_a:..(StaticBody2D自身)node_b: 先頭のRigidBody2Dへのパス(例:../../Node2D/RigidBody2D)
-
末尾を固定する場合:
- 同様に
StaticBody2DとGrooveJoint2Dを配置します
- 同様に
完成例
ChainRoot (Node2D)
├── RigidBody2D1
│ ├── CollisionShape2D
│ ├── Sprite2D
│ ├── seg1 (Node2D, position: 0, -10)
│ └── seg2 (Node2D, position: 0, 10)
├── RigidBody2D2
│ ├── GrooveJoint2D
│ │ ├── node_a: ../../RigidBody2D1
│ │ ├── node_b: ..
│ │ ├── position: (0, -16)
│ │ ├── bias: 0.9
│ │ ├── length: 8.0
│ │ └── initial_offset: 1.0
│ ├── CollisionShape2D
│ ├── Sprite2D
│ ├── seg1
│ └── seg2
└── ...
3. 自動セットアップ(ChainJointSetupTool使用)
3-1. 基本的な自動セットアップ
ステップ1: チェーンのルートノードを作成
- シーンに
Node2Dを配置します(例:ChainRoot)
ステップ2: RigidBody2Dを配置
ChainRootの子としてRigidBody2Dを複数配置します- 各RigidBody2Dに
CollisionShape2DとSprite2Dを追加します - 位置を適切に設定します
ステップ3: ChainJointSetupToolを配置
ChainRootの親ノード(または任意の場所)にNodeを配置しますchain_setup_tool.gdをアタッチします- Inspectorで以下を設定します:
target_parent:ChainRootへのNodePathjoint_type:GROOVE(推奨)またはPINauto_create_seg_nodes:true(segノードを自動生成)auto_setup_all:true(全システムを自動セットアップ)
ステップ4: セットアップを実行
- Inspectorで
_setup_buttonにチェックを入れます - または、スクリプトから
setup_chain()を呼び出します - エディタでは自動的に実行されます
自動生成されるもの
auto_setup_all=trueの場合:- 各RigidBody2Dに
seg1とseg2ノードが生成されます - 各RigidBody2Dに
GrooveJoint2D(またはPinJoint2D)が生成されます BreakableJointMonitor2Dが生成されますChainPathBinder2Dが生成されますPath2Dが生成されますPathRibbonMesh2Dが生成されます
- 各RigidBody2Dに
3-2. 詳細設定
GrooveJoint2Dの設定
| プロパティ | 説明 | 推奨値 |
|---|---|---|
groove_length |
溝の長さ | 8.0 |
groove_initial_offset |
初期オフセット | 1.0 または 2.0 |
groove_joint_position_local |
ジョイントの位置 | (0, -16) |
bias |
接続の硬さ | 0.9(硬い)または 0.2(柔らかい) |
disable_collision |
衝突無効化 | false(通常は有効) |
segノードの設定
| プロパティ | 説明 | 推奨値 |
|---|---|---|
auto_create_seg_nodes |
segノードを自動生成 | true |
seg_node_prefix |
segノードのプレフィックス | “seg” |
seg1_position_local |
seg1の位置 | (0, -10) |
seg2_position_local |
seg2の位置 | (0, 10) |
自動セットアップの設定
| プロパティ | 説明 | 推奨値 |
|---|---|---|
auto_setup_all |
全システムを自動セットアップ | true |
auto_connect_breakable_monitor |
BreakableJointMonitor2Dに自動接続 | true |
auto_setup_chain_binder |
ChainPathBinder2Dに自動設定 | true |
setup_on_ready |
実行時に自動セットアップ | false(通常は手動実行) |
4. 可視化システムの設定
4-1. ChainPathBinder2Dの設定
ステップ1: ChainPathBinder2Dを配置
- チェーンのルートノード(またはその親)に
Nodeを配置します chain_path_binder.gdをアタッチします
ステップ2: 基本設定
auto_detect_mode:trueに設定(自動検出モード)search_root: チェーンのルートノードへのNodePath(例:../ChainRoot)output_paths:Path2DへのNodePathを追加(空なら自動生成)
ステップ3: オプション設定
| プロパティ | 説明 | 推奨値 |
|---|---|---|
auto_update |
自動更新 | true |
update_in_physics |
物理フレームで更新 | true |
enable_smooth_handles |
Curve2Dを滑らかにする | true |
smooth_handle_strength_px |
ハンドルの強さ | 2.0~12.0 |
resample_spacing_px |
点列を固定間隔でリサンプル | 0.0(無効)または 8.0 |
4-2. PathRibbonMesh2Dの設定
ステップ1: PathRibbonMesh2Dを配置
- チェーンのルートノード(またはその親)に
Node2Dを配置します path_ribbon_mesh_2d.gdをアタッチします
ステップ2: 基本設定
path_nodes:Path2DへのNodePathを追加(例:[NodePath("../Path2D")])width: リボンの幅(例:20.0)ribbon_texture: テクスチャを設定(例:chain.png、rope.png)
ステップ3: オプション設定
| プロパティ | 説明 | 推奨値 |
|---|---|---|
width_curve |
幅のカーブ | Curveリソース |
upper_width_curve |
上側の幅カーブ | Curveリソース |
lower_width_curve |
下側の幅カーブ | Curveリソース |
thickness_domain_mode |
厚みのドメインモード | 0(通常) |
4-3. Path2Dの作成
自動生成の場合
ChainPathBinder2Dのoutput_pathsが空の場合、自動でPath2Dが生成されます
手動作成の場合
- チェーンのルートノード(またはその親)に
Path2Dを配置します Curve2Dが自動で作成されますChainPathBinder2Dのoutput_pathsに追加します
5. ジョイント監視の設定
5-1. BreakableJointMonitor2Dの設定
ステップ1: BreakableJointMonitor2Dを配置
- チェーンのルートノード(またはその親)に
Nodeを配置します breakable_joint_monitor_2d.gdをアタッチします
ステップ2: 基本設定
search_root: 監視対象のルートノードへのNodePath(例:../ChainRoot)auto_collect_on_ready:true(起動時に自動収集)
ステップ3: 破断条件の設定
| プロパティ | 説明 | 推奨値 |
|---|---|---|
break_relative_speed |
相対速度がこの値以上で破断 | 0.0(無効)または 500.0 |
break_angle_degrees |
この角度以上で一定時間経ったら破断 | 0.0(無効)または 80.0 |
break_angle_duration_sec |
角度超過がこの秒数以上続いたら破断 | 0.5 |
break_stretch_ratio |
初期距離に対する伸び率がこの値以上で破断 | 0.0(無効)または 1.5 |
use_break_delay_frames |
BreakDelayをフレーム数で扱う | true |
break_delay_frames |
exceededがこのフレーム数連続したら破断 | 1~10 |
5-2. 個別設定(JointBreakParams)
ステップ1: JointBreakParamsリソースを作成
- プロジェクトパネルで右クリック →
新規リソース JointBreakParamsを選択- 名前を付けて保存(例:
joint_params_weak.tres)
ステップ2: 個別設定を記入
joint_path: 対象ジョイントへのNodePath(例:../ChainRoot/RigidBody2D2/GrooveJoint2D)- 個別の破断パラメータを設定:
-1.0ならグローバル設定を使用0.0以上なら個別設定を使用
ステップ3: BreakableJointMonitor2Dに追加
BreakableJointMonitor2Dのjoint_paramsに作成したリソースを追加します
例
BreakableJointMonitor2D
├── search_root: ../ChainRoot
├── break_angle_degrees: 80.0(グローバル設定)
└── joint_params:
└── JointBreakParams
├── joint_path: ../ChainRoot/RigidBody2D2/GrooveJoint2D
└── groove_break_angle_degrees: 90.0(個別設定、より敏感)
6. よくある設定パターン
パターン1: 柔らかいロープ
GrooveJoint2Dの設定
bias: 0.2(柔らかい)length: 8.0initial_offset: 2.0
RigidBody2Dの設定
linear_damp: 10.0(減衰が強い)angular_damp: 10.0
BreakableJointMonitor2Dの設定
break_angle_degrees: 80.0break_angle_duration_sec: 0.3(短い時間で切断)
用途: 柔らかく揺れるロープ、比較的簡単に切れる
パターン2: 硬いチェーン
GrooveJoint2Dの設定
bias: 0.9(硬い)length: 8.0initial_offset: 1.0
RigidBody2Dの設定
mass: 3.0(通常のリンク)mass: 8.0(重い部分、例:ボールや重り)
BreakableJointMonitor2Dの設定
break_angle_degrees: 0.0(無効、切れない)- または個別設定で一部のみ切断可能
用途: 硬いチェーン、ほとんど切れない、重い物体を吊るす
パターン3: 固定チェーン
先頭の固定
StaticBody2Dを配置GrooveJoint2Dで先頭のRigidBody2Dに接続
末尾の固定
StaticBody2Dを配置GrooveJoint2Dで末尾のRigidBody2Dに接続
用途: 橋の鎖、固定されたロープ
パターン4: 分岐チェーン
構造
- 複数のチェーンを1つのRigidBody2Dで連結
- 連結点のRigidBody2Dに複数のGrooveJoint2Dを配置
例
Chain1
└── RigidBody2D6
└── GrooveJoint2D (Chain1内)
└── GrooveJoint2D2 (Chain2/RigidBody2D7に接続)
用途: 複数のチェーンを連結、Y字型のロープ
7. トラブルシュート
問題1: チェーンが動かない
原因と対処
| 原因 | 対処 |
|---|---|
RigidBody2Dがfreeze=true |
freeze=falseに設定 |
RigidBody2Dのmassが0 |
massを1.0以上に設定 |
GrooveJoint2Dのnode_aが正しくない |
NodePathを確認、相対パスを修正 |
GrooveJoint2Dのnode_bが正しくない |
node_bを..に設定 |
問題2: チェーンが切れすぎる
原因と対処
| 原因 | 対処 |
|---|---|
break_angle_degreesが小さすぎる |
値を大きくする(例:80.0 → 120.0) |
break_delay_framesが小さすぎる |
値を大きくする(例:1 → 10) |
break_relative_speedが小さすぎる |
値を大きくする、または0.0(無効)に設定 |
biasが小さすぎる(柔らかすぎる) |
値を大きくする(例:0.2 → 0.9) |
問題3: チェーンが切れない
原因と対処
| 原因 | 対処 |
|---|---|
| 破断条件がすべて0.0(無効) | break_angle_degreesなどを有効な値に設定 |
BreakableJointMonitor2Dのsearch_rootが正しくない |
正しいNodePathに設定 |
ジョイントがexclude_groupsに含まれている |
exclude_groupsを確認 |
auto_collect_on_ready=false |
trueに設定、またはcollect_joints()を手動で呼ぶ |
問題4: パスが表示されない
原因と対処
| 原因 | 対処 |
|---|---|
ChainPathBinder2Dのauto_update=false |
trueに設定 |
output_pathsが空 |
Path2Dを追加、または自動生成を待つ |
search_rootが正しくない |
正しいNodePathに設定 |
| segノードが存在しない | auto_create_seg_nodes=true、または手動でsegノードを作成 |
auto_detect_mode=falseでchain_partsが空 |
auto_detect_mode=true、またはchain_partsにChainPartResourceを追加 |
問題5: セットアップツールが動作しない
原因と対処
| 原因 | 対処 |
|---|---|
target_parent配下にRigidBody2Dが2つ未満 |
2つ以上のRigidBody2Dを配置 |
target_parentが未設定で親ノードもない |
target_parentを明示的に設定 |
| エディタで実行していない | エディタで_setup_buttonにチェックを入れる |
| 既存のJointが削除されていない | 手動で既存のJointを削除してから再実行 |
問題6: チェーンが重すぎる(パフォーマンス)
原因と対処
| 原因 | 対処 |
|---|---|
| RigidBody2Dの数が多すぎる | リンク数を減らす |
continuous_cdが大きすぎる |
continuous_cdを0または1に設定 |
PathRibbonMesh2Dの更新が重い |
auto_update=falseにして手動更新、または更新頻度を下げる |
BreakableJointMonitor2Dが毎フレーム再収集している |
recollect_every_frame=falseに設定 |
8. セットアップチェックリスト
基本的なチェーン
-
Node2Dをルートとして配置 - 2つ以上の
RigidBody2Dを配置 - 各RigidBody2Dに
CollisionShape2Dを追加 - 各RigidBody2Dに
seg1とseg2ノードを追加 - 2番目以降のRigidBody2Dに
GrooveJoint2Dを追加 - 各GrooveJoint2Dの
node_aとnode_bを正しく設定
可視化システム
-
ChainPathBinder2Dを配置 -
auto_detect_mode=trueに設定 -
search_rootを設定 -
Path2Dを作成(または自動生成を待つ) -
PathRibbonMesh2Dを配置 -
path_nodesにPath2Dを設定 - テクスチャを設定
ジョイント監視
-
BreakableJointMonitor2Dを配置 -
search_rootを設定 - 破断条件を設定(例:
break_angle_degrees) -
auto_collect_on_ready=trueに設定
自動セットアップ(ChainJointSetupTool使用)
-
ChainJointSetupToolを配置 -
target_parentを設定 -
auto_setup_all=trueに設定 -
_setup_buttonにチェックを入れる、またはsetup_chain()を呼ぶ
9. 実例:柔らかいロープの作成
ステップ1: ルートノードの作成
- シーンに適切なルートノードを配置(例:
Area2D、Node2Dなど) - その子としてチェーン用の
Node2Dを配置
ステップ2: RigidBody2Dの配置
-
チェーン用
Node2Dの子として必要な数のRigidBody2Dを配置 -
各RigidBody2Dの位置を設定:
- 縦に並べる場合:各リンクの長さに応じて適切な間隔で配置
- 横に並べる場合:
position.xを調整 - リンク間の間隔は、各リンクのサイズと接続方法に応じて決定
-
各RigidBody2Dに設定:
linear_damp: 10.0(減衰が強い)angular_damp: 10.0
ステップ3: CollisionShape2Dとsegノード
- 各RigidBody2Dに
CollisionShape2Dを追加 - 形状は用途に応じて選択(
RectangleShape2D、CapsuleShape2Dなど) - 各RigidBody2Dに
seg1(position: 0, -10)とseg2(position: 0, 10)を追加
ステップ4: GrooveJoint2Dの配置
- 2番目以降の各RigidBody2Dの子として
GrooveJoint2Dを追加:position: (0, -16)(RigidBody2Dの上端付近)node_a: 前のRigidBody2Dへの相対パスnode_b: ..(自身のRigidBody2D)bias: 0.2(柔らかい接続)length: 8.0initial_offset: 2.0
ステップ5: 固定用StaticBody2D(任意)
-
先頭を固定する場合:ルートノードの子として
StaticBody2Dを配置 -
その子として
GrooveJoint2Dを追加:node_a: ..(StaticBody2D自身)node_b: 先頭のRigidBody2Dへの相対パスbias: 0.2length: 8.0initial_offset: 2.0
-
末尾を固定する場合も同様に設定
ステップ6: 可視化システム
-
ルートノードの子として
Path2Dを配置 -
ルートノードの子として
Nodeを配置し、chain_path_binder.gdをアタッチ:auto_detect_mode: truesearch_root: チェーン用Node2Dへの相対パスoutput_paths:Path2Dへの相対パスenable_smooth_handles: truesmooth_handle_strength_px: 2.0
-
ルートノードの子として
Node2Dを配置し、path_ribbon_mesh_2d.gdをアタッチ:path_nodes:Path2Dへの相対パスwidth: 20.0ribbon_texture: 適切なテクスチャを設定
ステップ7: ジョイント監視
-
ルートノードの子として
Nodeを配置し、breakable_joint_monitor_2d.gdをアタッチ:search_root: チェーン用Node2Dへの相対パスbreak_angle_degrees: 80.0break_angle_duration_sec: 0.3use_break_delay_frames: falsebreak_delay_frames: 3
-
ChainPathBinder2Dのjoint_monitorに設定(任意)
10. 実例:硬いチェーンと重りの作成
ステップ1: チェーンの作成
- シーンに適切なルートノードを配置
- その子としてチェーン用の
Node2Dを配置
ステップ2: RigidBody2Dの配置
-
チェーン用
Node2Dの子として必要な数のRigidBody2Dを配置 -
各RigidBody2Dの位置を設定:
- 縦に並べる場合:各リンクの長さに応じて適切な間隔で配置
- 先頭のRigidBody2Dは
freeze: trueに設定することも可能(固定)
-
重りとなるRigidBody2Dには
massを大きく設定(例:mass: 8.0) -
各RigidBody2Dに
seg1とseg2を追加
ステップ3: GrooveJoint2Dの配置
- 2番目以降の各RigidBody2Dの子として
GrooveJoint2Dを追加:position: (0, -16)node_a: 前のRigidBody2Dへの相対パスnode_b: ..bias: 0.9(硬い接続)length: 8.0initial_offset: 1.0
ステップ4: 可視化システム
- チェーン用
Node2Dの子としてPath2Dを配置 - チェーン用
Node2Dの子としてNodeを配置し、chain_path_binder.gdをアタッチ - チェーン用
Node2Dの子としてNode2Dを配置し、path_ribbon_mesh_2d.gdをアタッチ(適切なテクスチャを設定)
ステップ5: ジョイント監視(個別設定あり)
- チェーン用
Node2Dの子としてNodeを配置し、breakable_joint_monitor_2d.gdをアタッチ - 必要に応じて
JointBreakParamsリソースを作成:joint_path: 対象ジョイントへの相対パスgroove_break_angle_degrees: 90.0(個別設定)groove_break_angle_duration_sec: 0.5
BreakableJointMonitor2Dのjoint_paramsに追加
ステップ6: 分岐チェーンの作成(任意)
- 別のチェーン用
Node2Dを配置 - 同様に必要な数のRigidBody2Dを配置
- 連結点のRigidBody2Dに2つのGrooveJoint2Dを追加:
- 1つ目:自身のチェーン内の接続
- 2つ目:別のチェーンのRigidBody2Dに接続
以上が、チェーンのセットアップガイドです。