godot

L002_2 Godot tips


godot4.x(3)の覚書です。

シーン

ツリー任意の位置にセット

	add_scene_below_common(TimerNode,$"02_Cameras")

#シーンを任意の位置にセットする
func add_scene_below_common(new_scene: PackedScene,upScene):
	# 'Common' ノードを取得
	var common_node = upScene

	if not common_node:
		print("Error: 'Common' node not found.")
		return

	# 新しいシーンをインスタンス化
	var instance = new_scene.instantiate()

	# 'Common' の親ノードに新しいシーンを追加
	var parent_node = common_node.get_parent()
	parent_node.add_child(instance)

	# 子ノード一覧から 'Common' のインデックスを取得
	var children = parent_node.get_children()
	var common_index = children.find(common_node)

状態遷移

状態の管理についてです。

enumの定義

enumはスクリプト内で状態や種類をリスト化するために使用します。

# 状態を管理する enum の定義
enum State {
    IDLE,       # 0
    RUNNING,    # 1
    JUMPING,    # 2
    ATTACKING   # 3
}

# 現在の状態を保持する変数
var current_state: State = State.IDLE

この定義では、State.IDLE0State.RUNNING1、...と、自動的に整数値が割り当てられます。

状態のチェックと切り替え

func _process(delta: float) -> void:
    match current_state:
        State.IDLE:
            print("現在は待機状態です")
        State.RUNNING:
            print("走っています")
        State.JUMPING:
            print("ジャンプ中です")
        State.ATTACKING:
            print("攻撃中です")

# 状態を切り替える例
func switch_to_running():
    current_state = State.RUNNING

プレイヤーの状態管理

# プレイヤーの状態を管理する enum
enum PlayerState {
    IDLE,
    WALKING,
    RUNNING,
    JUMPING
}

# 現在の状態を保持する変数
var state: PlayerState = PlayerState.IDLE

func _process(delta: float) -> void:
    match state:
        PlayerState.IDLE:
            handle_idle()
        PlayerState.WALKING:
            handle_walking()
        PlayerState.RUNNING:
            handle_running()
        PlayerState.JUMPING:
            handle_jumping()

# 状態ごとの処理を定義
func handle_idle() -> void:
    print("プレイヤーは待機しています")

func handle_walking() -> void:
    print("プレイヤーは歩いています")

func handle_running() -> void:
    print("プレイヤーは走っています")

func handle_jumping() -> void:
    print("プレイヤーはジャンプしています")

# 状態を切り替える関数
func switch_state(new_state: PlayerState) -> void:
    print("状態を切り替えます: %s -> %s" % [state, new_state])
    state = new_state

GDscript

@exportがないとグローバル変数の参照で警告がでる。

1. @export

  • 用途: プロパティをエディタに公開し、インスペクタから値を設定可能にします。
  • 主な機能:
    • プロパティの型制限
    • デフォルト値の設定
    • 値の範囲やプリセットの設定
  • :gdscriptコードをコピーする@export var speed: float = 10.0 @export_range(1, 100) var health: int = 50

2. @tool

  • 用途: スクリプトをツールスクリプトとしてマークします。
  • 効果:
    • スクリプトがエディタ内で実行されるようになります。
    • 主にエディタのカスタマイズやリアルタイムフィードバックの提供に使用されます。
  • :gdscriptコードをコピーする@tool extends Node func _ready(): print("This runs in the editor.")

3. @onready

  • 用途: ノードツリーが準備完了したときにプロパティを初期化します。
  • 効果:
    • _ready() が呼ばれるタイミングでプロパティに値を代入します。
  • :gdscriptコードをコピーする@onready var player = $Player

4. @signal

  • 用途: カスタムシグナルを定義します。
  • 効果:
    • 独自のイベントを発行できます。
  • :gdscriptコードをコピーする@signal var health_changed

5. @class

  • 用途: スクリプトに名前を付けたり、型として使用可能にします。
  • 効果:
    • クラス名を明示的に指定でき、型チェックやコード補完がしやすくなります。
  • :gdscriptコードをコピーする@class_name Player extends CharacterBody2D

6. @global_class

  • 用途: スクリプトをグローバルクラスとして登録し、他のスクリプトから簡単にアクセスできるようにします。
  • 効果:
    • class_name に加え、エディタで新しいノードタイプとして利用できます。
  • :gdscriptコードをコピーする@global_class @class_name Player extends CharacterBody2D

7. @rpc

  • 用途: リモートプロシージャコール(RPC)用のメソッドを定義します。
  • 効果:
    • マルチプレイヤーゲームで使用され、特定のメソッドをネットワーク越しに呼び出せるようにします。
  • :gdscriptコードをコピーする@rpc func update_position(new_position: Vector2): position = new_position

8. @staticmethod

  • 用途: スタティックメソッド(クラスメソッド)を定義します。
  • 効果:
    • インスタンスを作成せずにメソッドを呼び出せます。
  • :gdscriptコードをコピーする@staticmethod func calculate_area(width: float, height: float) -> float: return width * height

9. @const

  • 用途: 定数として扱う変数を宣言します。
  • 効果:
    • 定数として宣言された変数は変更できません。
  • :gdscriptコードをコピーする@const var MAX_HEALTH: int = 100

10. @animated_property

  • 用途: アニメーションで制御可能なプロパティを定義します。
  • 効果:
    • プロパティがエディタのアニメーションツールで制御可能になります。
  • :gdscriptコードをコピーする@animated_property var light_intensity: float = 1.0

11. @internal

  • 用途: スクリプト内でのみ使用されるプロパティやメソッドを指定します。
  • 効果:
    • エディタで非表示になります。
  • :gdscriptコードをコピーする@internal var debug_mode: bool = false

まとめ

@ を使用したアノテーションは、Godot 4でコードの可読性や保守性を向上させるために導入されています。これらを活用することで、エディタとの連携やコードの安全性を向上させることができます。

ChatGPTより

コメント