3Dで自動車を作ろう:カメラで追いかけよう
この記事は Godot 3から Godot 4 へ内容の書き換え中です。 Godot4では存在しない変数、関数が含まれている場合があります。もしその場合はリポジトリのIssuesまでご報告ください。
課題
車(またはその他の物体)を追跡できる「追従カメラ」を実装したい。
解決策
Godot には組み込みの InterpolatedCamera ノードが用意されており、ここで説明している機能の大部分をすでに実装しています。ただし、このノードを使用しない理由は2つあります。まず、キャラクターボディを追いかける際にカクツキが発生しやすい点、次に Godot 4.0 で廃止予定となっている点です。とはいえ、独自のセットアップは非常に簡単ですので、ご安心ください。
カメラのセットアップ方法
新しいシーンをCamera3Dで追加してください。名前はChaseCameraとし、保存してからスクリプトを追加してください。
ChaseCameraには追跡対象のtargetが設定されます。また、必要に応じてこのターゲットを変更する機能も実装します。
extends Camera
@export var lerp_speed = 10.0
var target = null
func _physics_process(delta):
if !target:
return
global_transform = global_transform.interpolate_with(target.global_transform, lerp_speed * delta)
func _on_change_camera(t):
target = t
この設定で重要なのはlerp_speedパラメーターのみです。これはカメラが位置を更新する速度を調整する値です。値を小さくするとカメラは車の動きに「遅れて」追従し、大きく設定すると常に車両に固定された状態になります。
ターゲットの設定
複数の異なるカメラポジションを設定したいと考えています。例えば、近距離用と遠距離用の2種類、あるいは真下を見下ろすアングルなどです。車オブジェクトに Node3D を追加し、名前を CameraPositions とします。さらにこのオブジェクトに、必要な数だけ Marker3D を配置してください。
Marker3D をお好みの位置に移動・配置してください。位置の -Z 軸は車両に向けるようにしてください。
カメラと通信するために、位置変更が必要な時にシグナルを発します。以下のコードを車のスクリプトに追加してください。
extends "res://cars/car_base.gd"
signal change_camera
var current_camera = 0
@onready var num_cameras = $CameraPositions.get_child_count()
func _ready():
emit_signal("change_camera", $CameraPositions.get_child(current_camera))
func _input(event):
if event.is_action_pressed("change_camera"):
current_camera = wrapi(current_camera + 1, 0, num_cameras)
emit_signal("change_camera", $CameraPositions.get_child(current_camera))
インプットマップにカメラ切り替え用のアクションを追加してください。ここではTabキーと右ショルダーボタンを使用しています。
接続方法
メインシーンにChaseCameraインスタンスを追加し、現在のカメラとして設定してください。その後、車のchange_cameraシグナルをカメラの_on_change_angle()関数に接続します。
ゲームを起動し、カメラ切替ボタンを押して試してみてください。