# 物理チェーン・ロープのセットアップ方法

**URL:** https://guild.rpgmakerofficial.com/t/topic/1144
**Category:** モジュール/プラグイン共有
**Created:** [2026 年 2 月 6 日午前 6:52 UTC](https://guild.rpgmakerofficial.com/t/topic/1144 "2026-02-06T06:52:34Z")
**Posts on this page:** 1
**Page:** 1

<div class="post-metadata">

### Author: ![Shirokishi](https://avatars.discourse-cdn.com/v4/letter/s/df788c/32.png) [@Shirokishi](https://guild.rpgmakerofficial.com/u/Shirokishi)
#### Post date: [2026 年 2 月 6 日午前 6:52 UTC](https://guild.rpgmakerofficial.com/t/topic/1144/1 "2026-02-06T06:52:34Z")

</div>

# 物理チェーン・ロープのセットアップ方法

本ガイドでは、物理チェーン（ロープや鎖）をセットアップする方法を詳しく説明します。

* * *

## 目次

1. [基本的なチェーン構造の理解](#1-%E5%9F%BA%E6%9C%AC%E7%9A%84%E3%81%AA%E3%83%81%E3%82%A7%E3%83%BC%E3%83%B3%E6%A7%8B%E9%80%A0%E3%81%AE%E7%90%86%E8%A7%A3)
2. [手動セットアップ](#2-%E6%89%8B%E5%8B%95%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97)
3. [自動セットアップ（ChainJointSetupTool使用）](#3-%E8%87%AA%E5%8B%95%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97chainjointsetuptool%E4%BD%BF%E7%94%A8)
4. [可視化システムの設定](#4-%E5%8F%AF%E8%A6%96%E5%8C%96%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%AE%E8%A8%AD%E5%AE%9A)
5. [ジョイント監視の設定](#5-%E3%82%B8%E3%83%A7%E3%82%A4%E3%83%B3%E3%83%88%E7%9B%A3%E8%A6%96%E3%81%AE%E8%A8%AD%E5%AE%9A)
6. [よくある設定パターン](#6-%E3%82%88%E3%81%8F%E3%81%82%E3%82%8B%E8%A8%AD%E5%AE%9A%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3)
7. [トラブルシュート](#7-%E3%83%88%E3%83%A9%E3%83%96%E3%83%AB%E3%82%B7%E3%83%A5%E3%83%BC%E3%83%88)

* * *

## 1. 基本的なチェーン構造の理解

### チェーンの構成要素

チェーンは以下の要素で構成されます：

1. **RigidBody2D** : チェーンの各リンク（節）
2. **GrooveJoint2D または PinJoint2D** : リンク間の接続
3. **segノード** : 各RigidBody2D内の接続点マーカー（Node2D）
4. **BreakableJointMonitor2D** : ジョイントの破断を監視
5. **ChainPathBinder2D** : チェーンの形状をPath2Dとして可視化
6. **PathRibbonMesh2D** : Path2Dをリボンメッシュで描画

### ノード構造の例

```auto
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: チェーンのルートノードを作成**

1. シーンに`Node2D`を配置します（例：`ChainRoot`）
2. このノードがチェーンの親になります

**ステップ2: RigidBody2Dを配置**

1. `ChainRoot`の子として`RigidBody2D`を複数配置します
2. 各RigidBody2Dに名前を付けます（例：`Link1`, `Link2`, `Link3`…）
3. 各RigidBody2Dの位置を設定します（縦に並べる場合：各リンクの長さに応じて適切な間隔で配置）

**ステップ3: CollisionShape2DとSprite2Dを追加**

1. 各RigidBody2Dの子として`CollisionShape2D`を追加します
2. `Shape`に`RectangleShape2D`または`CapsuleShape2D`を設定します
3. 各RigidBody2Dの子として`Sprite2D`を追加します（任意）
4. テクスチャを設定します

**ステップ4: segノードを作成**

1. 各RigidBody2Dの子として`Node2D`を追加します
2. 最初のノードを`seg1`と命名し、`position`を`(0, -10)`に設定します
3. 2番目のノードを`seg2`と命名し、`position`を`(0, 10)`に設定します
  - これらは接続点のマーカーです
  - `seg1`は上側、`seg2`は下側の接続点を表します

**ステップ5: GrooveJoint2Dを配置**

1. 2番目以降の各RigidBody2Dの子として`GrooveJoint2D`を追加します
2. 各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: 先頭・末尾の固定（任意）**

1. 先頭を固定する場合：

2. 末尾を固定する場合：

**完成例**

```auto
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: チェーンのルートノードを作成**

1. シーンに`Node2D`を配置します（例：`ChainRoot`）

**ステップ2: RigidBody2Dを配置**

1. `ChainRoot`の子として`RigidBody2D`を複数配置します
2. 各RigidBody2Dに`CollisionShape2D`と`Sprite2D`を追加します
3. 位置を適切に設定します

**ステップ3: ChainJointSetupToolを配置**

1. `ChainRoot`の親ノード（または任意の場所）に`Node`を配置します
2. `chain_setup_tool.gd`をアタッチします
3. Inspectorで以下を設定します：
  - `target_parent`: `ChainRoot`へのNodePath
  - `joint_type`: `GROOVE`（推奨）または`PIN`
  - `auto_create_seg_nodes`: `true`（segノードを自動生成）
  - `auto_setup_all`: `true`（全システムを自動セットアップ）

**ステップ4: セットアップを実行**

1. Inspectorで`_setup_button`にチェックを入れます
2. または、スクリプトから`setup_chain()`を呼び出します
3. エディタでは自動的に実行されます

**自動生成されるもの**

- `auto_setup_all=true`の場合：
  - 各RigidBody2Dに`seg1`と`seg2`ノードが生成されます
  - 各RigidBody2Dに`GrooveJoint2D`（または`PinJoint2D`）が生成されます
  - `BreakableJointMonitor2D`が生成されます
  - `ChainPathBinder2D`が生成されます
  - `Path2D`が生成されます
  - `PathRibbonMesh2D`が生成されます

### 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を配置**

1. チェーンのルートノード（またはその親）に`Node`を配置します
2. `chain_path_binder.gd`をアタッチします

**ステップ2: 基本設定**

1. `auto_detect_mode`: `true`に設定（自動検出モード）
2. `search_root`: チェーンのルートノードへのNodePath（例：`../ChainRoot`）
3. `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を配置**

1. チェーンのルートノード（またはその親）に`Node2D`を配置します
2. `path_ribbon_mesh_2d.gd`をアタッチします

**ステップ2: 基本設定**

1. `path_nodes`: `Path2D`へのNodePathを追加（例：`[NodePath("../Path2D")]`）
2. `width`: リボンの幅（例：`20.0`）
3. `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`が生成されます

**手動作成の場合**

1. チェーンのルートノード（またはその親）に`Path2D`を配置します
2. `Curve2D`が自動で作成されます
3. `ChainPathBinder2D`の`output_paths`に追加します

* * *

## 5. ジョイント監視の設定

### 5-1. BreakableJointMonitor2Dの設定

**ステップ1: BreakableJointMonitor2Dを配置**

1. チェーンのルートノード（またはその親）に`Node`を配置します
2. `breakable_joint_monitor_2d.gd`をアタッチします

**ステップ2: 基本設定**

1. `search_root`: 監視対象のルートノードへのNodePath（例：`../ChainRoot`）
2. `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リソースを作成**

1. プロジェクトパネルで右クリック → `新規リソース`
2. `JointBreakParams`を選択
3. 名前を付けて保存（例：`joint_params_weak.tres`）

**ステップ2: 個別設定を記入**

1. `joint_path`: 対象ジョイントへのNodePath（例：`../ChainRoot/RigidBody2D2/GrooveJoint2D`）
2. 個別の破断パラメータを設定：
  - `-1.0`ならグローバル設定を使用
  - `0.0`以上なら個別設定を使用

**ステップ3: BreakableJointMonitor2Dに追加**

1. `BreakableJointMonitor2D`の`joint_params`に作成したリソースを追加します

**例**

```auto
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.0`
- `initial_offset: 2.0`

**RigidBody2Dの設定**

- `linear_damp: 10.0`（減衰が強い）
- `angular_damp: 10.0`

**BreakableJointMonitor2Dの設定**

- `break_angle_degrees: 80.0`
- `break_angle_duration_sec: 0.3`（短い時間で切断）

**用途** : 柔らかく揺れるロープ、比較的簡単に切れる

* * *

### パターン2: 硬いチェーン

**GrooveJoint2Dの設定**

- `bias: 0.9`（硬い）
- `length: 8.0`
- `initial_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を配置

**例**

```auto
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: ルートノードの作成

1. シーンに適切なルートノードを配置（例：`Area2D`、`Node2D`など）
2. その子としてチェーン用の`Node2D`を配置

### ステップ2: RigidBody2Dの配置

1. チェーン用`Node2D`の子として必要な数の`RigidBody2D`を配置

2. 各RigidBody2Dの位置を設定：

3. 各RigidBody2Dに設定：

### ステップ3: CollisionShape2Dとsegノード

1. 各RigidBody2Dに`CollisionShape2D`を追加
2. 形状は用途に応じて選択（`RectangleShape2D`、`CapsuleShape2D`など）
3. 各RigidBody2Dに`seg1`（`position: 0, -10`）と`seg2`（`position: 0, 10`）を追加

### ステップ4: GrooveJoint2Dの配置

1. 2番目以降の各RigidBody2Dの子として`GrooveJoint2D`を追加：
  - `position: (0, -16)`（RigidBody2Dの上端付近）
  - `node_a`: 前のRigidBody2Dへの相対パス
  - `node_b: ..`（自身のRigidBody2D）
  - `bias: 0.2`（柔らかい接続）
  - `length: 8.0`
  - `initial_offset: 2.0`

### ステップ5: 固定用StaticBody2D（任意）

1. 先頭を固定する場合：ルートノードの子として`StaticBody2D`を配置

2. その子として`GrooveJoint2D`を追加：

3. 末尾を固定する場合も同様に設定

### ステップ6: 可視化システム

1. ルートノードの子として`Path2D`を配置

2. ルートノードの子として`Node`を配置し、`chain_path_binder.gd`をアタッチ：

3. ルートノードの子として`Node2D`を配置し、`path_ribbon_mesh_2d.gd`をアタッチ：

### ステップ7: ジョイント監視

1. ルートノードの子として`Node`を配置し、`breakable_joint_monitor_2d.gd`をアタッチ：

2. `ChainPathBinder2D`の`joint_monitor`に設定（任意）

* * *

## 10. 実例：硬いチェーンと重りの作成

### ステップ1: チェーンの作成

1. シーンに適切なルートノードを配置
2. その子としてチェーン用の`Node2D`を配置

### ステップ2: RigidBody2Dの配置

1. チェーン用`Node2D`の子として必要な数の`RigidBody2D`を配置

2. 各RigidBody2Dの位置を設定：

3. 重りとなるRigidBody2Dには`mass`を大きく設定（例：`mass: 8.0`）

4. 各RigidBody2Dに`seg1`と`seg2`を追加

### ステップ3: GrooveJoint2Dの配置

1. 2番目以降の各RigidBody2Dの子として`GrooveJoint2D`を追加：
  - `position: (0, -16)`
  - `node_a`: 前のRigidBody2Dへの相対パス
  - `node_b: ..`
  - `bias: 0.9`（硬い接続）
  - `length: 8.0`
  - `initial_offset: 1.0`

### ステップ4: 可視化システム

1. チェーン用`Node2D`の子として`Path2D`を配置
2. チェーン用`Node2D`の子として`Node`を配置し、`chain_path_binder.gd`をアタッチ
3. チェーン用`Node2D`の子として`Node2D`を配置し、`path_ribbon_mesh_2d.gd`をアタッチ（適切なテクスチャを設定）

### ステップ5: ジョイント監視（個別設定あり）

1. チェーン用`Node2D`の子として`Node`を配置し、`breakable_joint_monitor_2d.gd`をアタッチ
2. 必要に応じて`JointBreakParams`リソースを作成：
  - `joint_path`: 対象ジョイントへの相対パス
  - `groove_break_angle_degrees: 90.0`（個別設定）
  - `groove_break_angle_duration_sec: 0.5`

3. `BreakableJointMonitor2D`の`joint_params`に追加

### ステップ6: 分岐チェーンの作成（任意）

1. 別のチェーン用`Node2D`を配置
2. 同様に必要な数のRigidBody2Dを配置
3. 連結点のRigidBody2Dに2つのGrooveJoint2Dを追加：
  - 1つ目：自身のチェーン内の接続
  - 2つ目：別のチェーンのRigidBody2Dに接続

* * *

以上が、チェーンのセットアップガイドです。
