godot4.x(3)の覚書です。
シーン
Godot 4 における
preload
とload
の違いは、読み込みのタイミングとパフォーマンスへの影響にあります。以下にわかりやすくまとめます👇
✅
preload
(プリロード)gdscriptコピーする編集するvar my_scene = preload("res://MyScene.tscn")
- 読み込みタイミング:スクリプトのパース時(=ゲーム起動時)
- 非同期ではない(ブロッキング)
- 高速:一度読み込めば何度でも即時使用可能
- 用途:頻繁に使うシーン・リソースや、すぐに使いたいもの
🔷 メリット
- 使用時にロードの遅延が起きない
- すでにメモリにあるので即使える
🔶 デメリット
- ゲーム起動時にすべて読み込むため、初回ロードが重くなる可能性あり
✅
load
(ロード)gdscriptコピーする編集するvar my_scene = load("res://MyScene.tscn")
- 読み込みタイミング:コード実行時
- 同期処理(Godot 4では非同期版の
ResourceLoader.load_threaded_request()
などもある)- 使うときにだけ読み込まれる
- 用途:使用頻度が低い、または動的に読み込みたいリソース
🔷 メリット
- 起動時の負荷を軽減できる
- 動的にリソースを切り替えたいときに便利
🔶 デメリット
- 読み込み中は一時的に停止する(= フリーズ感)
🎯 使い分けの目安
用途 推奨される関数 ゲーム起動時からよく使うアセット(敵キャラ、UIなど) preload()
条件によって使う、またはあまり使わないアセット load()
大きなファイルを非同期で読み込みたい ResourceLoader.load_threaded_request()
✅ おまけ:動的シーンインスタンス例
gdscriptコピーする編集する# preload の場合(事前に読み込み) var EnemyScene = preload("res://Enemy.tscn") var enemy = EnemyScene.instantiate() add_child(enemy) # load の場合(必要なときに読み込み) var EnemyScene = load("res://Enemy.tscn") if EnemyScene: var enemy = EnemyScene.instantiate() add_child(enemy)
どっちを使えばいいか迷ってたら、使用頻度で考えるのが一番シンプルです👌
シーンの追加
# preload の場合(事前に読み込み)
var EnemyScene = preload("res://Enemy.tscn")
var enemy = EnemyScene.instantiate()
add_child(enemy)
# load の場合(必要なときに読み込み)
var EnemyScene = load("res://Enemy.tscn")
if EnemyScene:
var enemy = EnemyScene.instantiate()
add_child(enemy)
ツリー任意の位置にセット

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.IDLE
が0
、State.RUNNING
が1
、...と、自動的に整数値が割り当てられます。
状態のチェックと切り替え
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
まとめ
ChatGPTより
@
を使用したアノテーションは、Godot 4でコードの可読性や保守性を向上させるために導入されています。これらを活用することで、エディタとの連携やコードの安全性を向上させることができます。
コメント