Godot入門:Decalの使い方と活用法

はじめに

3Dゲームをプレイしていて「銃で撃った壁に弾痕が付く」「キャラが血を流している」「地面に足跡がある」といった表現を見かけることがあります。こうした動的なテクスチャの貼り付けは、ゲームの世界をより生き生きとさせる重要な要素です。

このような視覚効果を実現するのがDecalノードです。このノードを使うことで、3D表面にテクスチャを投影して貼り付け、ゲームプレイ中に動的に効果を追加できます。

Decalとは?

Decalは、3D表面にテクスチャを投影して貼り付けるノードです。

たとえ: 照写機(プロジェクター)で壁に画像を投影するのと同じように、Decalはテクスチャを3D空間に投影して、表面に張り付きます。もともとのメッシュのテクスチャは変わらず、デカール(新しい画像)が上に重ねられます。

継承ツリー:

Decal → VisualInstance3D → Node3D → Node

このノードを使うべき場面

  • 銃で撃った壁に弾痕を付けたい
  • キャラから流れた血痕を地面に付けたい
  • 建物の壁に落書きやステッカーを貼りたい
  • 地面にマーキングや警告シンボルを表示したい
  • ゲームプレイ中に動的にテクスチャを追加・削除したい

使わない場面:

  • 静的なテクスチャは最初からメッシュに焼き込む方が効率的
  • 動くオブジェクト(キャラなど)に追従させたい場合(デカールは固定)
Decalの投影方式
図1: Decalはプロジェクターのようにテクスチャを投影します

主なプロパティと機能

プロパティ説明
texture_albedoTexture2D投影する色(ベースカラー)テクスチャ
texture_normalTexture2D法線マップ(表面の凹凸情報)
texture_ormTexture2DOcclusion / Roughness / Metallic の3チャンネル
texture_emissionTexture2D発光テクスチャ(光を放つ部分)
sizeVector3投影ボックスのサイズ(X, Y, Z)
emission_energyfloat発光の強さ
albedo_mixfloat元のテクスチャとの混合度(0.0 = 元のまま、1.0 = デカール色100%)
upper_fade / lower_fadefloat上下方向のフェード(投影ボックスの縁で薄れる効果)
cull_maskintデカールが適用されるレイヤーを指定

基本的な弾痕デカールの例:


extends Node3D

func _ready():
	# Decalノードを作成
	var decal = Decal.new()
	add_child(decal)

	# 弾痕テクスチャを設定
	var bullet_texture = preload("res://assets/textures/bullet_hole.png")
	decal.texture_albedo = bullet_texture

	# デカールのサイズと位置を設定
	decal.size = Vector3(0.5, 0.5, 0.5)
	decal.position = Vector3(5.0, 1.5, -10.0)  # 壁上の位置

	# 透明度を調整
	decal.albedo_mix = 0.8

ゲームプレイ中に動的にデカールを生成する例:


extends Node3D

# プレイヤーが射撃した時に呼ばれる関数
func _on_gun_fired(hit_position: Vector3, hit_normal: Vector3):
	# Decalを作成
	var decal = Decal.new()
	add_child(decal)

	# テクスチャを設定
	decal.texture_albedo = preload("res://assets/textures/bullet_hole.png")
	decal.size = Vector3(0.3, 0.3, 0.3)

	# 衝突位置に配置
	decal.position = hit_position

	# 法線方向を向くように回転
	decal.look_at(hit_position + hit_normal, Vector3.UP)

	# 3秒後に削除(古い弾痕は消す)
	await get_tree().create_timer(3.0).timeout
	decal.queue_free()

func _input(event):
	if event is InputEventMouseButton and event.pressed:
		# 簡略版:固定位置にデカールを作成
		var random_pos = Vector3(randf_range(-5, 5), 1.5, randf_range(-5, 5))
		_on_gun_fired(random_pos, Vector3(0, 0, 1))
Decalのテクスチャ種類
図2: albedo(色)、normal(凹凸)、emission(光)の各テクスチャが独立して機能します

もっと使いこなす:カスタマイズできるパラメータ

まずは基本を動かしてみてから、余裕が出たら試してみてください。

パラメータ説明調整のポイント
size投影ボックスのサイズ小さすぎると効果が限定的、大きすぎるとテクスチャが歪む
albedo_mixブレンド強度(0〜1)0=透明、0.5=半透明、1=完全不透明。血痕なら0.6〜0.8推奨
upper_fade / lower_fadeフェード距離0.1〜0.3がナチュラル。大きすぎるとぼやける
emission_energy発光強度0=発光なし、2.0以上で明るい発光。看板などに有効
normal_blend法線マップの強さ0=フラット、1=完全に法線が反映。凹凸感の調整
cull_mask適用対象レイヤー特定のオブジェクトにのみデカールを適用したい場合に設定
様々なDecalの用途
図3: 弾痕・血痕・落書き・警告マークなど、様々な場面で活用できます

まとめ

Decalは、3D空間の動的なテクスチャ表現を実現する強力なツールです。ゲーム世界をよりリアルで反応的にします。

  • プロジェクター型の投影方式でテクスチャをメッシュに貼り付ける
  • albedo / normal / emission など複数のテクスチャをサポート
  • ゲームプレイ中に動的に生成・削除できるため、ダイナミックな環境変化を表現可能

次回は、3D空間の特定エリアに霧・煙・ガスを配置するFogVolumeノードを解説します。環境効果を使ったビジュアル表現の手法を学んでいきましょう。

関連性の高いノード解説記事

この記事はGodot 4.xをもとに執筆しています。

コメント