godot-adapt-3d-to-2d について
Godotの3Dプロジェクトやシステムを2Dへ適応させるスキルです。2D化、疑似奥行き、アイソメトリック投影、スプライトベイクを扱い、物理や描画、性能を考慮した移行を支援します。
主な機能
- 012Dと2.5Dへの変換パターン
- 02ジャンプ高度と深度判定のシミュレーション
- 03アイソメトリック投影とYソート
- 043Dモデルからスプライトへのベイク
- 052D向け重力・衝突・ナビゲーション調整
活用シーン
- 013Dキャラクターの移動をCharacterBody2Dへ移行
- 022.5Dゲームで地上・空中の攻撃判定を分離
- 033Dモデルから複数角度のスプライトを作成
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ thedivergentai/ game-dev-agentic-skills --skill godot-adapt-3d-to-2dインストール後、Claude Code で/godot-adapt-3d-to-2dを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/dimension-reduction.mdmigration-notes.mdscripts/2d_lighting_normals.gdadapt_3d_to_2d_patterns.gdbillboard_sprite_manager.gddepth_sorting_y_sort.gddirectional_sprite_resolver.gdfake_3d_shadows.gdgrid_nav_bridge.gdhitbox_depth_manager.gdisometric_math_core.gdjump_z_axis_sim.gdmodel_to_sprite_bake.gdnav_region_flattening.gdortho_simulation.gdortho_to_perspective_fx.gdparallax_depth_camera.gdprojection_utils.gd詳細
絶対にしてはいけないこと
- ゲームプレイ上の補完なしにZ軸を削除しないでください — 3Dを単純に2Dへ平坦化すると、空間的な戦略性が失われます。レイヤーやジャンプの高さの変化など、ほかの奥行きの仕組みを追加してください。
- 3Dのコリジョン形状をそのまま使わないでください — より単純な2D形状(CapsuleShape2D、RectangleShape2D)を使用してください。3D形状は自動変換されません。
- 「2Dモード」として正投影のCamera3Dを使わないでください — 理由:3Dの変換やライティングのコストがかかるうえ、CanvasItemのバッチ処理も利用できません。Camera2Dと2Dノードを使用してください(シミュレートした高さに限り、
ortho_simulation.gdを使用)。 - パフォーマンスが自動的に向上すると決めつけないでください — 描画呼び出しが多すぎる、大きなスプライトシートを使うなど、最適化が不十分な2Dは、最適化された3Dより遅くなることがあります。
- 重力の調整を忘れないでください — 3Dの重力はVector3(0, -9.8, 0)です。2Dの重力はfloat(980 pixels/s²)です。適切にスケールしてください。
- 地上の攻撃と空中の攻撃を、同じArea2Dの重なりとして扱わないでください — 2.5Dでは、地上の斬撃がジャンプ中の対象に当たってはいけません。理由:2D物理にはZ軸がありません。高さのAABBチェックには
hitbox_depth_manager.gdを使用してください。 - スプライトごとに
z_indexを大量に設定してYソートに対処しないでください — 理由:ソート順の管理はYソート対象の親が担います。depth_sorting_y_sort.gdを使用してください。手動でz_indexを設定すると、フレームごとにずれが生じます。
利用可能なスクリプト
必須:対応するパターンを実装する前に、適切なスクリプトを読んでください。
戦略ルーター(必須/読み込まないでください)
| 戦略 | 読み込むもの | 読み込まないもの |
|---|---|---|
| 真の2D(Z軸を削除) | プラットフォーマーの高さを維持する場合のみjump_z_axis_sim.gd。それ以外はCharacterBody2Dのパターン | ortho_simulation.gd、アイソメトリック計算、疑似シャドウ |
| 2.5D/疑似奥行き | 必須 ortho_simulation.gd + jump_z_axis_sim.gd + hitbox_depth_manager.gd + depth_sorting_y_sort.gd(+ parallax_depth_camera.gd / fake_3d_shadows.gd) | 手動のz_index = int(yの大量設定、2D用の疑似正投影Camera3D |
| アイソメトリックを維持 | 必須 isometric_math_core.gd + depth_sorting_y_sort.gd | 直交座標系のみの速度サンプル、疑似正投影Camera3D |
| 3Dをスプライトにベイク | 必須 model_to_sprite_bake.gd(Doom風の場合はbillboard_sprite_manager.gdも) | 本文内のBlenderベイク手順 |
| ノード/物理のみ変換 | 以下の判断ツリーと重力・コリジョンの注意事項 | 戦略コードのサンプル、レビューなしのDimensional Patcher正規表現 |
ortho_simulation.gd
2Dトップダウンゲームで3DのZ軸の高さをシミュレートします。垂直速度、重力、スプライトのオフセット、シャドウのスケーリングを処理します。
projection_utils.gd
ネームプレート、ヘルスバー、ターゲティング用に、3Dワールド位置を2D画面座標へ投影します。カメラ背後の判定と距離に応じたスケーリングを処理します。
isometric_math_core.gd
2Dノードの変換を使わずに、2D直交座標系と真のアイソメトリック画面空間の投影行列を生成して変換する、上級者向けユーティリティです。
depth_sorting_y_sort.gd
CanvasItemの_update_sorting()に合わせて分離されたツリーをソートする、疑似3D用の上級者向け動的ZインデックスYソートスクリプトです。
jump_z_axis_sim.gd
トップダウンゲームで、構造上の物理的な地上移動(X、Y)と、数式でシミュレートするジャンプの高さ(Z)を分離する、CharacterBody2Dの完全なコード例です。
parallax_depth_camera.gd
インデックスに基づいて、互いに大きく異なるCanvasLayerそれぞれに異なるオフセットアルゴリズムを適用し、3Dカメラのパン移動をシミュレートする疑似奥行きカメラです。
hitbox_depth_manager.gd
Area2D派生クラスです。2.5Dで誤った「地上と空中」のコリジョンを防ぐため、2Dトリガーを有効と判定する前に、明示的なカスタムZ軸高さの重なり(1D AABBコリジョン)を必要とします。
fake_3d_shadows.gd
Godot 4.xのTransform2D行列のスキュー変形を利用し、2Dの床にシミュレートした3Dの太陽の方向から離れる向きと角度でシャドウを投影するSprite2Dシャドウシミュレーターです。
billboard_sprite_manager.gd
移動する 2D CharacterBody と Camera2D の視点間にある、シミュレートされた 3D 相対角度を切り分ける、8 方向対応の FPS Doom 風スプライトコントローラーです。
nav_region_flattening.gd
適切な 3D の垂直性の代わりに、複数段階の 2D Navigation Layer を活用することで、「空中」ユニットが壁を越えられるようにする、トップダウン 2D 経路探索の回避策です。
ortho_to_perspective_fx.gd
Mode 7/卓上視点の傾きをシミュレートする、スクリーン空間の CanvasItem ワープシェーダーです。除算によるピンチ効果を使って、画面上部の座標をマッピングします。
2d_lighting_normals.gd
実行時にベースのアルベドとベイク済み法線マップを組み合わせた CanvasTexture をプログラムで自動生成し、スプライトが 3D ジオメトリのように 2D PointLIGHT に正しく反応できるようにします。
model_to_sprite_bake.gd
SubViewport を使った 3D→スプライトの角度ベイクを自動化する場合は必須です。本文は戦略ルーターとして維持してください。
grid_nav_bridge.gd
グリッドベースの 2D 移植向けに、3D のナビゲーション意図を AStarGrid2D に平坦化します(XZ → セルインデックス)。
次元削減の戦略
上の戦略ルーターから 1 行を選んでください。シーン内に変換チュートリアルを貼り付けないでください。
| 戦略 | 意図 | スクリプト |
|---|---|---|
| 真の 2D | Z を削除し、Vector2 の速度と Camera2D を使用 | godot-characterbody-2d/godot-camera-systems の関連項目 |
| 2.5D/疑似的な奥行き | 高さのシミュレーション + Y ソートの管理 + 地上用と空中用の当たり判定 | ortho_simulation.gd、jump_z_axis_sim.gd、hitbox_depth_manager.gd、depth_sorting_y_sort.gd |
| アイソメトリックを維持 | 2D 物理 + アイソメトリック投影 | 必須の isometric_math_core.gd |
重力スケール:3D の 9.8 m/s² → 1 m ≈ 100 px の場合、2D の ~980 px/s²。当たり判定:CapsuleShape3D → CapsuleShape2D(「物理調整」を参照)。カメラ:Camera3D/SpringArm → Camera2D。2D モードとして正投影 Camera3D を使うのは絶対に避けてください。
アートパイプライン:3D モデル → スプライト
GLB/シーンから複数角度のスプライトをベイクする場合は必須です:model_to_sprite_bake.gd(@tool SubViewport ベイカー)。
手動の Blender エクスポートはこのスキルの対象外です。戦略の選択は以下の決定ツリーで行ってください。本文にベイク手順を再度記載しないでください。
物理調整
重力スケーリング
# 3D gravity (m/s²): 9.8
# 2D gravity (pixels/s²): Scale to pixel units
# If 1 meter = 100 pixels:
const GRAVITY_2D = 9.8 * 100 # = 980 pixels/s²
# Adjust jump velocity proportionally:
# 3D jump: 4.5 m/s
# 2D jump: -450 pixels/s
当たり判定の簡略化
# 3D: CapsuleShape3D (16 segments, expensive)
var shape_3d := CapsuleShape3D.new()
shape_3d.radius = 0.5
shape_3d.height = 2.0
# 2D: CapsuleShape2D (much simpler)
var shape_2d := CapsuleShape2D.new()
shape_2d.radius = 16 # pixels
shape_2d.height = 64
操作の簡略化
3D の自由移動 → 2D の制限移動
# 3D: Full 3D movement with camera-relative controls
var input_3d := Input.get_vector("left", "right", "forward", "back")
var camera_basis := camera.global_transform.basis
var direction := (camera_basis * Vector3(input_3d.x, 0, input_3d.y)).normalized()
# 2D: Simple 4-direction (or 8-direction with diagonals)
var input_2d := Input.get_vector("left", "right", "up", "down")
velocity = input_2d.normalized() * SPEED
パフォーマンスの向上
最適化手法
# 1. Use TileMapLayer instead of individual Sprite2D nodes
var tilemap := TileMapLayer.new()
tilemap.tile_set = load("res://tileset.tres")
# 2. Batch sprite rendering
# Use single large sprite sheet instead of individual textures
# 3. Reduce particle count
var godot-particles := GPUParticles2D.new()
godot-particles.amount = 50 # Down from 200 in 3D
UI の適応
# Most 3D games already use 2D UI (CanvasLayer)
# No changes needed!
# Just verify UI scaling for new aspect ratios
get_viewport().size_changed.connect(_on_viewport_resized)
func _on_viewport_resized() -> void:
var viewport_size := get_viewport().get_visible_rect().size
# Adjust UI anchors/margins
エッジケース
奥行きソート
スプライトごとに z_index = int(global_position.y) を設定してソートするのは絶対に避けてください。 これは Y ソートの管理方法と矛盾します。必須の depth_sorting_y_sort.gd を使用し、親の y_sort_enabled を有効にして、子の相対 z はデフォルトのままにしてください。
空間オーディオの喪失
# 3D spatial audio (AudioStreamPlayer3D) → 2D panning (AudioStreamPlayer2D)
var audio_2d := AudioStreamPlayer2D.new()
audio_2d.stream = load("res://sounds/footstep.ogg")
audio_2d.max_distance = 1000.0 # 2D range
audio_2d.attenuation = 2.0
add_child(audio_2d)
決定ツリー:2D に簡略化するタイミング
| 要素 | 3D を維持 | 2D に移行 |
|---|---|---|
| 対象プラットフォーム | デスクトップ、コンソール | モバイル、ウェブ |
| アートスタイル | リアル、没入型 | スタイライズド、レトロ |
| ゲームプレイ | 3D 空間が必要 | 2D 平面で動作 |
| パフォーマンス | GPU 予算に余裕がある | ローエンド環境で 60 FPS が必要 |
| チームのスキル | 3D アーティスト | 2D アーティストまたはピクセルアート |
専門的なテクニックと最適化
1. 平坦化されたナビゲーション(3D ナビメッシュから 2D グリッドへ)
Godot では 2D と 3D のナビゲーションは別々のシステムとして扱われますが、AStarGrid2D を使って 3D 経路探索ロジックを 2D グリッドに投影できます。これは 2D グリッドベースの移動向けに高度に最適化されており、完全な 3D ナビメッシュのオーバーヘッドを回避できます。
class_name GridNavBridge extends Node
var astar_grid: AStarGrid2D
func _ready() -> void:
astar_grid = AStarGrid2D.new()
astar_grid.region = Rect2i(0, 0, 100, 100)
astar_grid.cell_size = Vector2(16, 16)
astar_grid.update()
## Converts a 3D target position to a 2D grid path.
func get_grid_path_from_3d(start_3d: Vector3, end_3d: Vector3) -> PackedVector2Array:
var start_map := Vector2i(start_3d.x / 16, start_3d.z / 16)
var end_map := Vector2i(end_3d.x / 16, end_3d.z / 16)
return astar_grid.get_point_path(start_map, end_map)
2. 2D 向け自動 LOD(パフォーマンス最適化)
自動 LOD は本来 3D の機能ですが、VisibleOnScreenEnabler2D を使用すると 2D でもシミュレートできます。このノードは、高解像度スプライトや複雑な AI などの対象ノードが画面外に出ると、process_mode を自動的に切り替え、CPU サイクルと GPU のフィルレートを節約します。
# Attach to a complex 2D entity
func setup_2d_lod(target_node: Node2D) -> void:
var enabler := VisibleOnScreenEnabler2D.new()
# Define the 'high-detail' rect
enabler.rect = Rect2(-64, -64, 128, 128)
enabler.enable_node_path = target_node.get_path()
add_child(enabler)
3. 次元変換パッチャー(CharacterBody3D から 2D への正規表現変換)
3D コントローラーを自動で 2D に移植するには、RegEx スクリプトを使って Vector3 を Vector2 にマッピングし、3D 固有のプロパティを置き換えます。移動ロジックを手作業で変換するとエラーが起きやすいため、大規模な移植作業には欠かせません。
@tool
extends EditorScript
func _run() -> void:
var regex = RegEx.new()
# Pattern to find Vector3 constructors and replace with Vector2
regex.compile("Vector3\\(([^,]+),\\s*([^,]+),\\s*([^)]+)\\)")
var script_content = "velocity = Vector3(input.x, 0.0, input.y) * speed"
var result = regex.sub(script_content, "Vector2($1, $3)", true)
# Output: "velocity = Vector2(input.x, input.y) * speed"
print(result)
詳細レシピ(必要に応じて)
| トピック | リファレンス/スクリプト |
|---|---|
| 真の 2D/ベイク/カメラ変換 | dimension-reduction.md |
リファレンス
段階的な開示:特定の API を調査する場合にのみ公式ドキュメントのリンクを開き、関連するスキルは隣接ドメインへ振り分ける場合に読み込みます。ドキュメント全体を事前に読み込まないでください。
公式ドキュメント
- 2D の概要 — Node3D のレンダリングから、真の 2D パフォーマンスを実現するレンダリングへ移行する際に切り替える必要がある CanvasItem/Camera2D パイプラインを解説しています。
- CharacterBody2D の使用 —
CharacterBody3DからCharacterBody2Dへの変換後に使用する、標準的なmove_and_slide/床/ジャンプのパターンを解説しています。 - 物理演算の概要 — 単位、レイヤー/マスク、および重力が 2D のスカラー値になると 3D の重力や
Vector3の前提が成り立たなくなる理由を解説しています。 - 2D トランスフォーム — アイソメトリック配置や投影を模した影に使用する
Transform2Dの基底/スキュー演算を解説しています。 - 2D パララックス — ゲームプレイが平面に集約される際に、Z 深度の代わりとなるレイヤーのスクロール倍率を解説しています。
- キャンバスレイヤー — 正投影の
Camera3Dを維持せずに、奥行きを模したカメラを実現するCanvasLayerの重ね合わせを解説しています。 - 2D ライトとシャドウ — スプライトに 3D 風のライティングを再現する、法線マップ付きの
CanvasTexture/Light2Dの手法を解説しています。 - ナビゲーションの概要(2D) — 3D の垂直方向の経路探索を段階的な 2D エージェントに平坦化するための、2D ナビゲーション領域/レイヤーを解説しています。
- ビューポートの使用 — 3D モデルを
SubViewportでキャプチャし、Sprite2Dのテクスチャにする方法(ランタイムまたはベイクのパイプライン)を解説しています。 - Camera2D — 「2D モードとしての正投影 Camera3D」に置き換えるズーム、制限、追従 API を解説しています。
- CanvasItem — 真の Z を失った後の奥行きソートに使用する
y_sort_enabled/z_index/z_as_relativeを解説しています。 - 一般的な最適化 — ドローコール、オーバードロー、処理コストを実際に削減できた場合にのみ、2D 化によるパフォーマンス上の利点が得られることを説明しています。
関連スキル
前提条件
- godot-characterbody-2d — Z 軸をシミュレートまたは削除した後、トップダウン型/プラットフォーマー型の移植先で使用する移動 API です。
- godot-2d-physics — 3D 形状を削除した後の
CapsuleShape2D/Area2Dによる衝突の簡略化とレイヤーマスクです。 - godot-camera-systems — 移植時に疑似的な正投影の
Camera3Dを使い続けずに済むようにするCamera2Dの追従/制限/ズームです。 - godot-gdscript-mastery — 次元削減ヘルパー全体で使用する、型指定された
Vector2/Transform2Dの演算とツールスクリプトです。
補完
- godot-2d-animation — 3D モデルを方向別のフレームにベイクした後の、スプライトシート/
AnimatedSprite2Dパイプラインです。 - godot-shaders-basics — Mode-7/遠近法の傾きなど、画面空間で奥行きを疑似的に表現する CanvasItem シェーダーです。
- godot-tilemap-mastery — 2D への移植で個別の 3D メッシュインスタンスに代わることが多い
TileMapLayerのバッチ処理です。 - godot-navigation-pathfinding — 空中/垂直ルートを平面化する際に役立つ、より高度な 2D ナビゲーションメッシュ/
AStarGrid2Dのパターンです。 - godot-audio-systems — 空間オーディオを失った後の、
AudioStreamPlayer3D→AudioStreamPlayer2Dのパンニング/減衰です。 - godot-adapt-2d-to-3d — 移植時にどの軸を維持するか、または逆転させるかを決める際に役立つ、逆方向の適応ラティスです。
下流/利用側
- godot-performance-optimization — 次元削減後も 2D への移植でフレーム予算を超える場合に、対応を引き継ぎます。
- godot-platform-mobile — バッテリーや GPU の制約に対応するための、3D→2D 簡略化を促す一般的なリリース先です。
- godot-adapt-desktop-to-mobile — このスキルの 2D への平面化ステップを含むことが多い、より広範なデスクトップ→モバイル適応です。
マスター
- godot-master — ライブラリのルーターであり、対応するモジュールへのエントリです。複数領域にまたがる 2D/3D の課題を担当するドメインスキルを探す際に開いてください。