【Godot】オブジェクトを一時停止する方法

この記事ではオブジェクトの動きを一時停止する方法について解説します。

get_tree().paused で停止する方法

Godotには “get_tree().paused” というフラグに “true” を設定することで、ゲーム全体を停止させることができます。

実装方法については以下の記事で書きました。

【Godot】ゲームを一時停止するポップアップウィンドウの実装方法

この設定方法はゲーム全体を止めてしまいますのでポーズ機能の実装には良いです。ですが、例えばアクションゲームや格闘ゲームでのヒットストップ(攻撃が当たった時に数フレームだけ停止する)を特定のオブジェクトにのみ適用する……といったことには向いていません

その場合には、”set_process()” を使用すると良いと思います。

set_process() を使用した一時停止

方法は簡単で停止したいオブジェクト(ノード)の “set_process()” 引数に “false” を指定して呼び出します。

var obj; // 停止したいオブジェクト

// これにより _process() が呼び出されなくなる
obj.set_process(false);

// 一時停止を解除する場合
obj.set_process(true);

// 一時停止しているかどうかを判定する
if obj.is_processing():
  // 一時停止している
  pass
else:
  // 一時停止していない
  pass

停止する仕組みとしては、”_process()” が呼び出されなくなるだけです。ですので例えば物理エンジンによる挙動を一時停止したい場合は “set_physics_process()” を使用します。

その他の関数については、公式ドキュメントの “Node” についての資料を確認します。

一時停止のサンプルコード

例えば以下のように “CanvasLayer” に “Godot”というオブジェクトがぶら下がっているとします。

これらをそれぞれ一時停止するコードです。

extends Node2D

onready var layer1 = $Layer1
onready var layer2 = $Layer2

# Buttonをクリックした
func _on_Button_pressed():
  # $Layer1以下のオブジェクトを操作する
	for godot in layer1.get_children():
		if godot.is_processing():
			# 動いていたら停止する
			godot.set_process(false)
		else:
			# 停止していたら動かす
			godot.set_process(true)

# Button2をクリックした
func _on_Button2_pressed():
  # $Layer2以下のオブジェクトを操作する
	for godot in layer2.get_children():
		if godot.is_processing():
			# 動いていたら停止する
			godot.set_process(false)
		else:
			# 停止していたら動かす
			godot.set_process(true)

なお、set_process()” はそのノードのみ有効です。子となるノードに対しては適用されないので、停止したいオブジェクトすべてに対して関数呼び出しが必要となります。

サンプルプロジェクトファイル

今回の記事の内容を実装したプロジェクトファイルを添付しておきます。