Godot 4.0: Noise を使って Screen shake
Godot 3.5で使えた
OpenSimplexNoise
クラスは削除され、代わりに
FastNoiseLite
クラスが導入されているのでそれを使う
gdextends Camera2D
class_name PlayerCamera
## noise screen shake を実装
## 参考記事: https://shaggydev.com/2022/02/23/screen-shake-godot/
@export var CAMERA_OFFSET: Vector2 = Vector2(128, 120)
@export var NOISE_SHAKE_STRENGTH: float = 20.0
@export var NOISE_SHAKE_DECAY: float = 6.0
@export var NOISE_SHAKE_SPEED: float = 15.0
@export var NOISE_FREQUENCY: float = 1.0
@onready var rand := RandomNumberGenerator.new()
@onready var noise := FastNoiseLite.new()
var noise_i: float = 0.0
var shake_strength: float = 0.0
func _ready() -> void:
rand.randomize()
noise.seed = rand.randi()
noise.frequency = NOISE_FREQUENCY
func apply_noise_shake() -> void:
shake_strength = NOISE_SHAKE_STRENGTH
func _process(delta: float) -> void:
shake_strength = lerp(shake_strength, 0.0, NOISE_SHAKE_DECAY * delta)
self.offset = get_noise_offset(delta) + CAMERA_OFFSET
func get_noise_offset(delta: float) -> Vector2:
noise_i += NOISE_SHAKE_SPEED * delta
return Vector2(
noise.get_noise_2d(1, noise_i) * shake_strength,
noise.get_noise_2d(100, noise_i) * shake_strength
)
カメラを揺らしたいタイミングで、
get_viewport().get_camera_2d().apply_noise_shake()
を実行すると、揺れる
各種 export しているパラメータで揺れ具合を調整できる
パラメータ調整用の専用シーンを作ったほうが便利
ボタンを押したら Screen Shake を実行するデバッグシーンを用意する
インスペクタで Screen Shake スクリプトの export したパラメータを変更すると、ゲーム起動中でも反映される(デバッグオプションで、 スクリプト変更を同期
にチェックを入れること)
スクリプトで使用しているパラメータを変更して確認
> @export var NOISE_SHAKE_STRENGTH: float = 20.0
揺れの強さ
大ダメージを受けた時ほど値を大きくすると良さそう
揺れが激しいほど、画面外の領域を描画することになるので注意
画面外の何も設置していない無の空間を表示する可能性あり
> @export var NOISE_SHAKE_DECAY: float = 6.0
揺れの減衰値
小さいほど減衰が少ないので、揺れが長く続く
0にするとずっと揺れる
> @export var NOISE_SHAKE_SPEED: float = 15.0
揺れのスピード
強さと似ているパラメータ
スピードを早くしても画面外の領域をたくさん表示することにはならない
> @export var NOISE_FREQUENCY: float = 1.0
揺れのきめ細かさ
小さいほどスムーズに、大きいほどラフになる
FastNoiseLite
クラスには他にもたくさんパラメータがあるので、必要に応じて調整する
参考記事
とても分かりやすい動画と記事で、こちらをベースにしてすぐに作れた