クールタイムボタン

ℹ️ 留意事項

この記事は Godot 3から Godot 4 へ内容の書き換え中です。 Godot4では存在しない変数、関数が含まれている場合があります。もしその場合はリポジトリのIssuesまでご報告ください。

課題

RPG風のスキルボタンを作成したい。クールタイム効果も組み込みたい。

alt alt

解決策

ボタン用のアイコンが必要な場合、Game-icons.netでは多種多様なデザイン性の高いボタン素材を提供しています。このレシピでもその一部を使用しています。

ノード設定

能力ボタン用のシーンには以下のノードが必要となります。

AbilityButton:  TextureButton
   Sweep:  TextureProgress
    Timer
   Counter:  MarginContainer
      Value:  Label

選択したアイコンを AbilityButtonTextures/Normal プロパティにドロップしてください。

Sweepノードでは、Presetsメニューから 「Full Rect」 を選択します。**Fill Mode(塗りつぶしモード)**を「Counter Clockwise(反時計回り)」に設定してください。

また、クールタイム時の「時計ワイプ」でボタンを暗く表示させたいため、[変調] プロパティに透明度のある濃いグレーを設定してください。

alt alt

Timerノードの設定は「One Shot」に設定してください。

Counterはテキストを保持・配置するためのコンテナです。レイアウトを"Bottom Wide"に設定し、Theme Overrides/Constants セクションでは両方の Margin RightMargin Left5 に指定してください。

最後に、Valueラベルで[水平整列]を「右揃え」に設定し、[テキストクリッピング]を「有効」にしてください。テーマオーバーライド/フォントにフォントを追加してください。動作確認のため、テキスト欄には 0.0 のような値を入力してください。アイコンが白黒の場合は、テーマオーバーライド/定数/アウトラインサイズとして 1 を設定すると効果的です。

スクリプト

以下のスクリプトを AbilityButton に追加してください。

  • Timertimeout シグナルと AbilityButtonpressed シグナルを接続します。
extends TextureButton
class_name AbilityButton

@onready var time_label = $Counter/Value

@export var cooldown = 1.0


func _ready():
    time_label.hide()
    $Sweep.value = 0
    $Sweep.texture_progress = texture_normal
    $Timer.wait_time = cooldown
    set_process(false)

まず、能力のクールタイム時間を格納するcooldown変数をエクスポートします。次に、_ready()メソッド内でこの値を使用してTimerを設定できます。最後に、カウントダウン中のみ表示させたいため、ラベルは非表示にしておきます。

次に、TextureProgress 表示に割り当てるテクスチャが必要となります。この例では、ボタンのテクスチャをコピーしていますが、お好みで別のテクスチャを使用しても構いません。

最後に、スイープ値を 0 に設定し、ノードの処理フラグを false にします。アニメーションは _process() 内で処理するため、クールタイムモードではない時に実行される必要がないようにします。

func _process(delta):
    time_label.text = "%3.1f" % $Timer.time_left
    $Sweep.value = int(($Timer.time_left / cooldown) * 100)

_process() 関数内では、タイマーの time_left プロパティを使用してラベルの text プロパティと Sweepノードの value プロパティを設定しています。

func _on_AbilityButton_pressed():
    disabled = true
    set_process(true)
    $Timer.start()
    time_label.show()

ボタンをクリックするとすべてが始まります。

func _on_Timer_timeout():
    print("ability ready")
    $Sweep.value = 0
    disabled = false
    time_label.hide()
    set_process(false)

タイマーが切れるとすべての設定は初期化されます。複数のボタンを HBoxContainer に配置するだけで、アクションバーが完成します。

alt alt

プロジェクトのダウンロード

プロジェクトのサンプルコードはこちらからダウンロードできます。 https://github.com/godotrecipes/ui_cooldown_button

関連レシピ