4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Godot 4.3】アイワナ風トリガー針の作り方!

Last updated at Posted at 2024-12-02

はじめに

普段はCosense(Scrapbox)で技術記事を書いていますが、今回、Godotのアドベントカレンダーを見つけたのをきっかけに、Qiitaに記事を投稿してみることにしました。

概要

この記事では、以下のGIF画像のように、プレイヤーが特定の領域に侵入すると動き出す「トリガー針」の作り方を紹介します。

以下のGIFは完成イメージです。

205f3eb30732e66d9f713408a61ad6ca.gif

環境

  • Microsoft Windows 11 Home
  • Godot Engine 4.3

トリガー針の作り方

作成するシーンの基本構成

今回作成する「トリガー針」は、以下の2つのシーンを中心に構築します。

  • 針(thorn)
    • 針そのものを表すシーン
    • トリガーがオンになると動作する
  • 針トリガーエリア(thorn_trigger_area)
    • プレイヤーが領域に侵入すると、子ノードである「針」のトリガーをオンにする
    • 領域は呼び出し側で定義する

針のシーンを作成

まず、針のシーンとなるthorn.tscnを作成し、以下のようにノードを作成します。

  • Thorn(Sprite2D型)
    • Area2D
      • CollisionPolygon2D

次に、Thornノードにスクリプトをアタッチし、thorn.gdとして保存します。

image.png


Area2Dノードのシグナルからbody_enteredを選択し、thorn.gdスクリプトに接続します。

image.png


接続後に、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として保存します。

image.png


ThornTriggerAreaノードのシグナルからbody_enteredを選択し、thorn_trigger_area.gdスクリプトに接続します。

image.png


接続後に、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ノードは、針トリガーエリアのシェイプとして機能します。
このシェイプがプレイヤーの侵入を検知する領域を定義します。

配置イメージ

以下は、トリガー針を配置した例です。

image.png

動作の確認

CollisionShape2Dノードで設定した領域にプレイヤーが侵入すると、針が動き出します。
以下のGIFは完成イメージです。

205f3eb30732e66d9f713408a61ad6ca.gif

あとがき

私が調べた限りでは、Godotでトリガー針を作る方法を解説した記事は見当たりませんでした。
なので、この記事が少しでも皆さんの参考になれば嬉しいです!

記事のタイトルは「アイワナ風トリガー針」としましたが、個人的には『ノロイ ノ ゲエム』の飛んでくるギロチンのイメージが強いです。

技術的な疑問や改善点や、記事の記述の改善点があれば、ぜひコメントで教えてください!
ここまでお読みいただき、ありがとうございます。

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?