マニュアル: カスタムアクションプラグイン

概要

カスタムアクションプラグインとは、アクションや条件をGDScriptを使って作成し、既存のアクションや条件と同じように扱えるようにするシステムです。

カスタムアクションプラグインの導入方法

カスタムアクションプラグインの本体(特定の形式で記述された.gdファイル)が手元にある前提での解説となります。

  1. プラグインの本体(.gd)をプロジェクト内の任意のフォルダに配置します。(この時点で自動で読み込みが行われます)
  2. ヴィジュアルスクリプト画面を開きます。
  3. プラグインが条件の場合は任意のリンクにて「条件を追加」、アクションの場合は任意のステートで「アクションを追加」を選択します。
  4. 上部のタブをデフォルトのAGMakerから、CustomConditionやOfficialPlugin等のタブに切り替えます。(このタブ名は、プラグイン側で自由に設定できるため、プラグインによって表示される名称は異なります)
  5. プラグインのアクション/条件が存在すれば、あとは既存のアクション/条件と同様に利用ができます。

*注意点: プラグインのバージョン更新をする際は、元のプラグインと差し替える形で導入してください。「クラス名が競合している」という旨のエラーが発生する可能性があります。

カスタムアクションプラグインの作り方

カスタムアクションプラグインは、GDScriptの記述にのみ対応しています。
.gd形式のスクリプトを任意の場所に作成し、以下のフォーマットに沿って記述を行ってください。

アクションの場合

@tool
extends AGMPluginAction
class_name CustomAction

## 数値
@export var num: float = 0.0
## 属性
@export_enum("Fire", "Water", "Earth") var elements: int = 0

# タブを定義
func get_plugin_tab_name() -> String:
	return "タブ"

# グループを定義
func get_group_name() -> String:
	return "グループ"

# 追加ダイアログにてホバー時のツールチップにて表示される説明を定義
func get_description() -> String:
	return "説明内容"

# ステート入場時に呼ばれる
func on_state_enter(p_owner: Object) -> void:
	print("AGMPlugin : CustomAction: on_state_enter")

# ステート中常に呼ばれる
func on_state_update(p_owner: Object, p_delta: float) -> void:
	print("AGMPlugin : CustomAction: on_state_update")
	var gameobject:GameObject = p_owner as GameObject
	var basesettings: BaseSettings = gameobject.get_base_settings()
	basesettings.set_hp(num)

# ステート退場時に呼ばれる
func on_state_exit(p_owner: Object) -> void:
	print("AGMPlugin : CustomAction: on_state_exit")

条件の場合

@tool
extends AGMPluginCondition
class_name CustomCondition

# タブを定義
func get_plugin_tab_name() -> String:
	return "タブ"

# グループを定義
func get_group_name() -> String:
	return "グループ"

# 追加ダイアログにてホバー時のツールチップにて表示される説明を定義
func get_description() -> String:
	return "説明内容"

# 条件入場時に呼ばれる(ステートに入るタイミングで呼ばれる)
func on_condition_enter(p_owner: Object) -> void:
	print("AGMPlugin : CustomCondition: on_condition_enter")

# 条件判定の為に常に呼ばれる
func on_judge_condition(p_owner: Object, p_delta_time: float) -> bool:
	print("AGMPlugin : CustomCondition: on_judge_condition")
	var gameobject:GameObject = p_owner as GameObject
	var basesettings: BaseSettings = gameobject.get_base_settings()
	if basesettings.get_hp() <= 0:
		return true
	else:
		return false

# 条件退場時に呼ばれる(ステートから抜けるタイミングで呼ばれる)
func on_condition_exit(p_owner: Object) -> void:
	print("AGMPlugin : CustomCondition: on_condition_exit")

コードを記述する上でのヒント

AGMPluginAction/ConditionはNode2Dの継承クラスではありません。
ownerであるGameObject(CharacterBody2Dベース)やArea2DGameObject(Area2Dベース)を取得して実行する形式で記述しましょう。
複数のアクション/条件からなる大規模なプラグインを作成する場合は、汎用処理をまとめたスクリプトを別途用意した継承チェーンを作ることが有効です。

「いいね!」 1

マニュアル: AIを活用したカスタムアクション/条件作成機能

AIを活用したカスタムアクションプラグイン作成

プログラミング経験がなくても、自作のアクションや条件を作成したい場合は、AIの活用を検討しましょう。

カスタムアクションプラグインは、ベースエンジンである Godot Engine の機能を利用して作成されます。Godot Engine は現在のAIモデルに広く学習されているため、AIによるコード生成との相性が良く、ACTION GAME MAKER向けのプラグインコードを生成できる場合があります。

AIへの指示例

アクションを作成する場合の例

以下のようなプロンプトをAIに入力します。

これは、Godot Engine 4.4のカスタムエディターである ACTION GAME MAKER 用のプラグインを作成するスクリプトです。

ACTION GAME MAKER はFSM型のヴィジュアルスクリプトエディターであり、Godot Engine の基本機能を利用できます。

プラグインのオーナーは以下のいずれかです。

  • GameObject(CharacterBody2D ベースのカスタムノード)

  • Area2DGameObject(Area2D ベースのカスタムノード)

GameObjectVariableSettings などのデータ保存用ノードを持ち、さらにプロジェクト共通のデータベースも利用できます。アクセスAPIは以下を参照してください。

Manual: Method/Signal/API List

以下は新しいアクションを追加するためのサンプルコードです。

@tool
extends AGMPluginAction
class_name CustomAction

## 数値
@export var num: float = 0.0

## 属性
@export_enum("Fire", "Water", "Earth") var elements: int = 0

# タブを定義
func get_plugin_tab_name() -> String:
    return "タブ"

# グループを定義
func get_group_name() -> String:
    return "グループ"

# 説明文を定義
func get_description() -> String:
    return "説明内容"

# ステート入場時に呼ばれる
func on_state_enter(p_owner: Object) -> void:
    print("AGMPlugin : CustomAction: on_state_enter")

# ステート中常に呼ばれる
func on_state_update(p_owner: Object, p_delta: float) -> void:
    print("AGMPlugin : CustomAction: on_state_update")

    var gameobject: GameObject = p_owner as GameObject
    var basesettings: BaseSettings = gameobject.get_base_settings()

    basesettings.set_hp(num)

# ステート退場時に呼ばれる
func on_state_exit(p_owner: Object) -> void:
    print("AGMPlugin : CustomAction: on_state_exit")

このサンプルコードを元に、【実現したい動作】 を行うプラグインを作成してください。

条件を作成する場合の例

条件を作成する場合も同様ですが、条件用のサンプルコードを使用します。

これは、Godot Engine 4.4のカスタムエディターである ACTION GAME MAKER 用のプラグインを作成するスクリプトです。

ACTION GAME MAKER はFSM型のヴィジュアルスクリプトエディターであり、Godot Engine の基本機能を利用できます。

プラグインのオーナーは以下のいずれかです。

  • GameObject(CharacterBody2D ベースのカスタムノード)

  • Area2DGameObject(Area2D ベースのカスタムノード)

GameObjectVariableSettings などのデータ保存用ノードを持ち、さらにプロジェクト共通のデータベースも利用できます。アクセスAPIは以下を参照してください。

Manual: Method/Signal/API List

以下は新しい条件を追加するためのサンプルコードです。

@tool
extends AGMPluginCondition
class_name CustomCondition

# タブを定義
func get_plugin_tab_name() -> String:
    return "タブ"

# グループを定義
func get_group_name() -> String:
    return "グループ"

# 説明文を定義
func get_description() -> String:
    return "説明内容"

# 条件入場時に呼ばれる
func on_condition_enter(p_owner: Object) -> void:
    print("AGMPlugin : CustomCondition: on_condition_enter")

# 条件判定のために常に呼ばれる
func on_judge_condition(p_owner: Object, p_delta_time: float) -> bool:
    print("AGMPlugin : CustomCondition: on_judge_condition")

    var gameobject: GameObject = p_owner as GameObject
    var basesettings: BaseSettings = gameobject.get_base_settings()

    if basesettings.get_hp() <= 0:
        return true
    else:
        return false

# 条件退場時に呼ばれる
func on_condition_exit(p_owner: Object) -> void:
    print("AGMPlugin : CustomCondition: on_condition_exit")

このサンプルコードを元に、【判定したい条件】 を条件とするプラグインを作成してください。

指示を出す際のコツ

  • AIエージェントはAPIのアクセスパスやメソッド名を誤る場合があります。その場合は上記ドキュメントを参照し、正しいAPI情報をAIへ伝えて再生成を依頼してください。

  • class_name、タブ名、グループ名は競合を避けるため、自分で調整することをおすすめします。

  • 移動系アクションを作成する場合、ACTION GAME MAKER 側の移動制御を停止する必要があります。そのため、独自の移動処理を実装する前に GameObject.is_release_move_controltrue に設定してください。

「いいね!」 1

サンプルオフィシャルカスタムアクションプラグイン

これらは、「新しいオブジェクトを作成」でテンプレートとして「CustomActionPlugin」を選択することでも追加できます。

カスタムアクション

移動方向に応じて回転

CA_RotateToMoveDirection.gd (1.7 KB)

サインカーブ移動

CA_SineCurveMove.gd (2.2 KB)

物理ノード(RigidBody)を押す

CA_PushRigidBody.gd (1.3 KB)

カスタム条件

ライトの「明るさ」で遷移

CC_CheckBrightness.gd (2.4 KB)

変数の値が一定範囲内で遷移

CC_VariableRange.gd (9.9 KB)

2つの変数を四則演算した結果で遷移

CC_VariableCalculationCondition.gd (13.6 KB)

「いいね!」 2

カスタムアクションプラグインの翻訳

v1.3.3より、カスタムアクションに翻訳ファイルを添付することで翻訳ができるようになりました。

翻訳可能な部分について

  • プロパティ名やプロパティ用のツールチップを翻訳することができます。
  • クラス名(リストに表示される名前)やグループ名は翻訳できませんが、そのツールチップは翻訳できます。

翻訳の実装方法

所定のフォーマットに沿って作成されたcsvファイルをプラグイン内のeditor_translationsフォルダ直下に配置することで翻訳データが読み込まれます。

【フォルダ構成例】

res://addons/
└── custom_action_plugin/
├── custom_action.gd
└── editor_translations
└── custom_action.csv

  • カスタムアクションのgdスクリプトと同階層にあるeditor_translationsの直下にあることが条件であり、addonsフォルダやcustom_action_pluginフォルダ以外のどの場所においても動作します。
  • gdスクリプトの名称とcsvファイルの名称が一致している必要はありません。
  • 複数のgdスクリプトに対して1つのcsvファイルを用意しても動作します。

CSVファイルのサンプル

context,key,ja,en,ko,zh_CN,zh_TW,pt_BR,es_AR,de,ru
"CustomAction","説明内容","カスタムアクション:ツールチップ","Custom Action: Tooltip","커스텀 액션: 툴팁","自定义动作:工具提示","自訂動作:工具提示","Ação personalizada: dica de ferramenta","Acción personalizada: descripción emergente","Benutzerdefinierte Aktion: Tooltip","Пользовательское действие: подсказка"
"CustomAction","group","グループ","Group","그룹","组","群組","Grupo","Grupo","Gruppe","Группа"
"CustomAction:test_num","test_num(数字ツールチップ)","数値のツールチップ","Number tooltip","숫자 툴팁","数值工具提示","數值工具提示","Dica de ferramenta do número","Descripción emergente del número","Zahlen-Tooltip","Подсказка для числа"
"CustomAction:test_num","test_num","数値","Number","숫자","数值","數值","Número","Número","Zahl","Число"
"CustomAction:test_elements","test_elements(属性ツールチップ)","属性のツールチップ","Element tooltip","속성 툴팁","属性工具提示","屬性工具提示","Dica de ferramenta do elemento","Descripción emergente del elemento","Element-Tooltip","Подсказка для элемента"
"CustomAction:test_elements","test_elements","属性","Element","속성","属性","屬性","Elemento","Elemento","Element","Элемент"
"CustomAction:test_elements","Fire","火","Fire","불","火","火","Fogo","Fuego","Feuer","Огонь"
"CustomAction:test_elements","Water","水","Water","물","水","水","Água","Agua","Wasser","Вода"
"CustomAction:test_elements","Earth","土","Earth","땅","土","土","Terra","Tierra","Erde","Земля"

*csvのみ
custom_action.csv (1.7 KB)
*本体を含むサンプル構成例
custom_action_translation_sample.zip (2.2 KB)

列の詳細について

- `context`はそのクラスのどのプロパティに紐づくかを指定します。ただ`export_group`と`get_description()`にて返る説明は紐づくプロパティが存在しないので省きます
- `key`はスクリプト内で定義されている識別子を指定します
- 以降の列は言語設定に応じたテキストを定義します

タブ,グループ,クラスの翻訳(v1.3.4~)

v1.3.4以降はタブ、グループ、クラスを翻訳できます。サンプルは以下となります。
注意点として、タブ、グループについてはkeyのみで、contextは空欄となります。

context,key,ja,en,ko
,"タブ","タブ(日)","タブ(英)","タブ(韓)"
,"グループ","グループ(日)","グループ(英)","グループ(韓)"
"CustomAction","CustomAction","カスタムアクション(日)","カスタムアクション(英)","カスタムアクション(韓)"

※contextはそのクラスがどこに所属しているを示しており、タブとグループ名はクラス自体のデータではないためcontextの列は空となります

CSVの記述のコツ

  1. ヘッダー (context,key,...) はクォートなし
  2. 2行目以降は全項目をダブルクォートで囲む
  3. UTF-8 BOM
  4. CRLF改行
「いいね!」 2