はじめに
ゲーム開発では、「あるオブジェクトの動きに追従する別のオブジェクト」という場面が頻繁に出現します。プレイヤーの頭上に表示されるHP バー、銃口から発射される銃弾、カメラをプレイヤーの動きに同期させるなど、多数のシーンで「別のノード同士の連動」が必要です。RemoteTransform2D は、こうした「遠隔での位置同期」を、シンプルで効率的に実装するノードです。
このノードを理解すれば、複雑な計算や複数のスクリプトを書くことなく、シーンの構造を工夫するだけで、洗練された動きを実現できます。本記事では、基本的な使い方から、実践的な応用まで、段階的に解説していきます。
RemoteTransform2Dとは?
RemoteTransform2Dは、このノード自身の「位置(position)」「回転(rotation)」「スケール(scale)」を、別の指定ノードにリモート転送するノードです。親子関係をコードで制御するのではなく、シーン構造として明示的に表現でき、より柔軟で保守性の高い設計が可能になります。
「RemoteTransform2D は遠隔操作のコントローラーのようなものです。自分の動き(位置・回転)を離れた別ノードにリモートで転送します。物理的な親子関係は持たないものの、『同じ動き』を別の場所で再現できるため、カメラ制御、HUD同期、マーカー表示など、多彩な用途に活躍します。」
継承ツリー:
RemoteTransform2D ↓ Node2D ↓ CanvasItem ↓ Node

このノードを使うべき場面
RemoteTransform2Dは以下のような場面での使用に最適です:
- カメラをプレイヤーの子にせず追従させる – カメラの回転・ズーム制御を独立させたい場合、RemoteTransform2D でプレイヤーの位置だけを転送。カメラロジックの自由度向上。
- HUDアイコンをゲームオブジェクトに追従させる – 敵の頭上に HP バーを表示。敵の CanvasLayer(UI層)と異なる場所にあっても同期可能。
- シーンをまたいだ位置同期 – ダンジョン内のマーカーと、マップシーン上のマーカーを同期。複数シーンの座標連動。
- マーカーを別レイヤーのオブジェクトに追従させる – ゲーム空間のエフェクトを、UI層上に表示する影やシャドウに反映。レイヤー間の連動.
別のノードが適切な場面:単純な親子関係で足りる場合は、RemoteTransform2D よりも親子ノード(child)として組織する方が簡潔です。また、「常に完全に同期する必要がない」場合は、コードで手動に位置更新する方が柔軟な場合もあります。
主なプロパティと機能
| プロパティ/メソッド | 型 | 説明 |
|---|---|---|
remote_path |
NodePath | 転送先のノードを指定。例:".." で親ノード、"../../OtherNode" で兄弟ノード |
update_position |
bool | 位置(position)の転送を有効化。false にすると X, Y 座標を転送しない |
update_rotation |
bool | 回転(rotation)の転送を有効化。false にすると角度を転送しない |
update_scale |
bool | スケール(scale)の転送を有効化。false にすると拡大縮小を転送しない |
use_global_coordinates |
bool | true = グローバル座標で転送、false = ローカル座標で転送。親ノードの影響を受けるかどうか |
コード例1:プレイヤー位置をカメラに転送する基本実装
extends Node2D
# この RemoteTransform2D がプレイヤーノードの子にいるシーン構造を想定
# Player (Node2D)
# ├─ Sprite2D
# ├─ CollisionShape2D
# └─ RemoteTransform2D
# └─ remote_path = "../../../Camera2D"
@onready var remote_transform = $RemoteTransform2D
@onready var sprite = $Sprite2D
@export var movement_speed: float = 200.0
var velocity: Vector2 = Vector2.ZERO
func _ready():
# RemoteTransform2D の設定を確認
print("カメラ転送ノードの設定:")
print("- remote_path: %s" % remote_transform.remote_path)
print("- update_position: %s" % remote_transform.update_position)
print("- update_rotation: %s" % remote_transform.update_rotation)
func _process(delta):
# プレイヤーの入力と移動
var input_direction = Input.get_vector("ui_left", "ui_right", "ui_up", "ui_down")
if input_direction:
velocity = input_direction.normalized() * movement_speed
else:
velocity = Vector2.ZERO
# 位置を更新(RemoteTransform2D が自動でカメラに転送)
global_position += velocity * delta
# 移動方向に応じてスプライトを反転
if velocity.x != 0:
sprite.flip_h = velocity.x < 0
func _input(event):
# マウスクリック位置に移動
if event is InputEventMouseButton and event.pressed:
var target_pos = get_global_mouse_position()
global_position = target_pos
# RemoteTransform2D が自動でカメラ位置を更新
コード例2:複数のHUD要素を同期させる実装
extends Node2D
class_name GameCharacter
# キャラクタースプライト
@onready var sprite = $Sprite2D
# HUD 追従用マーカー(RemoteTransform2D の操作元)
@onready var hp_bar_marker = $HPBarMarker
@export var health: int = 100
@export var max_health: int = 100
@export var is_player: bool = false
var hud_canvas_layer: CanvasLayer
var hp_bar: Control
func _ready():
# HUD キャンバスレイヤーを探す
hud_canvas_layer = get_tree().root.find_child("HUDLayer", true, false)
if hud_canvas_layer:
# このキャラクター用の HP バーを作成
hp_bar = Control.new()
hp_bar.custom_minimum_size = Vector2(50, 10)
hud_canvas_layer.add_child(hp_bar)
# hp_bar_marker (RemoteTransform2D) が hp_bar に position を転送するよう設定
hp_bar_marker.remote_path = NodePath("../../../HUDLayer/HPBar")
hp_bar_marker.update_position = true
hp_bar_marker.update_rotation = false
hp_bar_marker.update_scale = false
hp_bar_marker.use_global_coordinates = true
func _process(delta):
# HP バーを描画
if hp_bar:
var hp_ratio = float(health) / float(max_health)
hp_bar.modulate = Color.RED.lerp(Color.GREEN, hp_ratio)
func take_damage(damage: int):
health = max(0, health - damage)
# ダメージフラッシュエフェクト
if sprite:
sprite.modulate = Color.WHITE
var tween = create_tween()
tween.tween_property(sprite, "modulate", Color.RED, 0.1)
tween.tween_property(sprite, "modulate", Color.WHITE, 0.1)

もっと使いこなす:カスタマイズできるパラメータ
| 設定項目 | 説明 | 推奨値・用途 |
|---|---|---|
update_position |
位置転送の on/off | カメラ位置同期なら ON。回転・スケールのみなら OFF |
update_rotation |
回転転送の on/off | キャラの向きが重要なら ON。ただし HUD 要素には不要 |
update_scale |
スケール転送の on/off | 敵の大小変化を HUD に反映させたいなら ON |
use_global_coordinates |
グローバル座標を使用するか | 異なるシーンのノードに転送なら ON。同一シーン内なら OFF で OK |
| 複数転送先 | 複数の RemoteTransform2D で複数箇所に転送 | 1つのオブジェクトの動きを複数の場所に反映。複数の RemoteTransform2D インスタンス |
まとめ
RemoteTransform2Dは、シーン構造の工夫で、複雑な相互連動を実現する優れたノードです。親子関係では表現できない「独立した動き」の同期や、別シーン間の座標連携などが、簡潔に実装できます。ゲーム開発において、シーン設計の自由度を大幅に拡張し、保守性の高い構造を実現するカギとなるノードです。
- RemoteTransform2D は自身の Transform(位置・回転・スケール)を別ノードに遠隔転送
- remote_path で転送先を指定。update_position / update_rotation / update_scale で細かく制御
- カメラ同期、HUD 要素の追従、シーン間の座標連携など、多彩な用途で活躍
次回はPointLight2Dについて解説します。2D ライティングの基本から、リアルな光と影の表現、演出的な発光効果まで、画面を美しく彩るテクニックを学びます。
シリーズ:Godot 4 ノード解説
- 001〜093:各種ノード
- 091:TileMap
- 092:Camera2D
- 093:VisibleOnScreenNotifier2D
- 094:RemoteTransform2D(この記事)
- 095:PointLight2D
この記事はGodot 4.xをもとに執筆しています。


コメント