はじめに
普段はCosense(Scrapbox)で技術記事を書いていますが、今回、Godotのアドベントカレンダーを見つけたのをきっかけに、Qiitaに記事を投稿してみることにしました。
概要
この記事では、以下のGIF画像のように、プレイヤーが特定の領域に侵入すると動き出す「トリガー針」の作り方を紹介します。
以下のGIFは完成イメージです。
環境
- Microsoft Windows 11 Home
- Godot Engine 4.3
トリガー針の作り方
作成するシーンの基本構成
今回作成する「トリガー針」は、以下の2つのシーンを中心に構築します。
- 針(thorn)
- 針そのものを表すシーン
- トリガーがオンになると動作する
- 針トリガーエリア(thorn_trigger_area)
- プレイヤーが領域に侵入すると、子ノードである「針」のトリガーをオンにする
- 領域は呼び出し側で定義する
針のシーンを作成
まず、針のシーンとなるthorn.tscn
を作成し、以下のようにノードを作成します。
- Thorn(Sprite2D型)
- Area2D
- CollisionPolygon2D
- Area2D
次に、Thorn
ノードにスクリプトをアタッチし、thorn.gd
として保存します。
Area2D
ノードのシグナルからbody_entered
を選択し、thorn.gd
スクリプトに接続します。
接続後に、thorn.gd
スクリプトを以下のように編集します。
extends Sprite2D
@export var is_move : bool = false # trueの場合、針が動く
@export var speed : float = 1.0 # 秒間1マス
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
add_to_group("thorn") # thornグループに設定
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
if is_move:
# ~~~ 針の移動処理 ~~~
func _on_area_2d_body_entered(body: Node2D) -> void:
if body.name == "PlayerCharacter":
body.damaged() # プレイヤーが針に被弾した際の処理
実装のポイント
-
is_move
- 針トリガーエリアでオンにするためのフラグ
-
speed
- 各針の移動速度を個別に設定できるよう、エクスポートする
-
add_to_group("thorn")
-
_ready
関数で針をthorn
グループに登録する - 後述する針トリガーエリアが複数の針を認識しやすくするための設定です
-
針トリガーエリアのシーンを作成
針トリガーエリアのシーンとなるthorn_trigger_area.tscn
を作成し、以下のようにノードを作成します。
- ThornTriggerArea(Area2D型)
ノードにシェイプが設定されていないため警告が表示されますが、これは呼び出し元で設定するため、無視して問題ありません。
次に、ThornTriggerArea
ノードにスクリプトをアタッチし、thorn_trigger_area.gd
として保存します。
ThornTriggerArea
ノードのシグナルからbody_entered
を選択し、thorn_trigger_area.gd
スクリプトに接続します。
接続後に、thorn_trigger_area.gd
スクリプトを以下のように編集します。
extends Area2D
# ~~~ _readyと_processはpassのみのため、記述を省略 ~~~
func _on_body_entered(body: Node2D) -> void:
if body.name == "PlayerCharacter":
for children in get_children():
if children.is_in_group("thorn"):
children.is_move = true
実装のポイント
-
for children in get_children():
- トリガーエリア内のすべての子ノードを順に処理する
-
if children.is_in_group("thorn"):
- 子ノードが
thorn
グループに属している場合にのみ、針を動作させる処理を実行する
- 子ノードが
トリガー針をステージに配置
これまでに作成したトリガー針を、ステージに配置して動作させてみましょう。
ステージとなるシーンにThornTriggerArea
シーンを追加し、以下のようにノードを作成します。
- ThornTriggerArea
- CollisionShape2D
- Thorn1
- Thorn2
- Thorn3
- …(必要に応じて追加)
CollisionShape2D
ノードは、針トリガーエリアのシェイプとして機能します。
このシェイプがプレイヤーの侵入を検知する領域を定義します。
配置イメージ
以下は、トリガー針を配置した例です。
動作の確認
CollisionShape2D
ノードで設定した領域にプレイヤーが侵入すると、針が動き出します。
以下のGIFは完成イメージです。
あとがき
私が調べた限りでは、Godotでトリガー針を作る方法を解説した記事は見当たりませんでした。
なので、この記事が少しでも皆さんの参考になれば嬉しいです!
記事のタイトルは「アイワナ風トリガー針」としましたが、個人的には『ノロイ ノ ゲエム』の飛んでくるギロチンのイメージが強いです。
技術的な疑問や改善点や、記事の記述の改善点があれば、ぜひコメントで教えてください!
ここまでお読みいただき、ありがとうございます。