同じ敵を性能違いで何体も置くときは、速さや最大HPを @export でインスペクタに出し、コードを開かずに変えられるようにします。数値には範囲を、選ぶものには選択肢を付けておくと、入力の間違いも減ります。
ただ、インスペクタで敵のHPを30にしたのに、動かすと10で倒れることがあります。ゲームで使う値を、シーンに保存された値が届く前に作ってしまっているからです。
この記事では、数値を範囲で縛る書き方と選択肢の作り方、インスペクタの値が届く順番とセッターの使いどころを解説します。
この記事でわかること
@export_rangeの引数はminmaxstepの順。ヒントはその後ろ- 選ぶものはコード側の
enumにすると、名前のまま比較できる- 範囲は入力欄の制限で、実行中の値は守らない
- 宣言の行では、インスペクタの値はまだ届いていない
動作確認環境: Godot 4.7
数値の範囲(@export_range)
数値をそのまま出すと、いくらでも入ります。@export_range を使うと、スライダーと上下限が付きます。
@export_range(20, 180, 1, "suffix:px/s") var speed: float = 60.0

引数の位置が決まっています。前から min、max、step で、ヒントの文字列はその後ろです。3番目にいきなり "or_greater" と書くと step の位置なので通りません。
使えるヒントは次のとおりです。
"or_greater"と"or_less": スライダーの外の値も入力できるようにする"hide_slider": スライダーを隠して、入力欄だけにする"suffix:px/s": 欄の後ろに単位を表示する
もう1つ、書き方で見落としやすいところがあります。@export と @export_range を両方書いてはいけません。@export_range だけでエクスポート済みです。重ねると解析エラー(実行する前、エディタがスクリプトを読んだ時点で出るエラー)になり、そのスクリプトの項目がまるごとインスペクタから消えます。
型も明示してください。@export_range(0, 10, 0.1) var speed = 3 と書くと、初期値の 3 から整数の欄になり、0.1 刻みのスライダーになりません。var speed: float = 3.0 と書けば小数で刻めます。
他のエンジンでいうと:
@export_rangeは、Unity で[SerializeField]に[Range]を添えた形、Unreal Engine のUPROPERTY(EditAnywhere, meta=(ClampMin, ClampMax))にあたります。
選択肢(enum)
「歩く」「跳ねる」のように選ぶ値は、数値の欄にせず選択肢にします。コード側で enum(名前を付けた整数の並び)を定義して、そのまま出すのがいちばん扱いやすい形です。
enum Motion { WALK, HOP }
@export var motion: Motion = Motion.WALK
