前回、Godotにおける乱数の基本的な使い方について紹介しました。
ここでは、更なる応用編として乱数を使って敵をランダムな位置から出現させる方法について実装してみたいと思います。
アクションゲーム等を作る上で実装する事が多いと思うので、是非参考にしてもらえればと思います。
【Godot】乱数を使って敵をランダムな位置から出現させる
ここでは、Timerノードを使用して敵が一定時間経過後にランダムな場所で生成されるようにし、繰り返す方法について解説したいと思います。
実装手順
まずは、敵用のシーンを生成します。
新規シーンから「Node2D」で作成します。シーン名は「Enemy.tscn」等分かりやすいものにしておきます。ノード名も同様に「Enemy」としておきます。
続いて、敵となるキャラクターとしてとりあえずデフォルトでファイルシステムに含まれているGodotのイメージキャラクター?「icon.svg」を使うことにします。
↑コレですね。
次に、Enemyノードの子ノードとしてSprite2Dノードを作ります。
そして、インスペクターからTextureに「icon.svg」をドラッグ&ドロップします。
新たにメインシーンを作成します。メインシーンにはNode2Dノードをルートノードとして配置して、ここで敵をランダムに出現させます。シーン名は「main.tscn」とノード名は「main」とします。
まず、メインシーンにTimerノードを追加します。Timerノードは、設定した待ち時間後にシグナルを発信するため、ランダムな敵出現タイミングの制御に利用します。
メインシーンのmainを右クリックで「子ノードの追加」を選択します。
検索バーにTimerと入力し、Timerノードを追加します。
追加したTimerノードの名前を「EnemySpawnTimer」に変更しておくとわかりやすくなります。
メインシーンのmainノードにスクリプトをアタッチして、敵をランダムなタイミングで出現させる処理を記述します。
ルートノード(main)を右クリックして「Attach Script」を選択し、新規スクリプトを作成します。
以下のコードを入力して、スクリプトに敵の出現ロジックを追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
extends Node2D # 敵シーンへのパスを指定 var EnemyScene = preload("res://Enemy.tscn") # ランダムな敵出現タイミングを制御するTimerノードを変数に設定 @onready var enemy_spawn_timer = $EnemySpawnTimer func _ready(): # 初期化:最初の敵出現時間を設定し、タイマーを開始 set_random_spawn_time() enemy_spawn_timer.start() # タイマーが終了したら敵を出現させるシグナルを接続 enemy_spawn_timer.timeout.connect(_on_spawn_enemy) # 敵の出現時間をランダムに設定 func set_random_spawn_time(): enemy_spawn_timer.wait_time = randf_range(1.0, 5.0) # 1〜5秒の間でランダム設定 enemy_spawn_timer.one_shot = true # タイマーを1回だけ実行 # 敵をランダムな位置に出現させる処理 func _on_spawn_enemy(): var enemy_instance = EnemyScene.instantiate() # 敵シーンをインスタンス化 # ランダムな位置に敵を配置 enemy_instance.position = Vector2(randf_range(0, 1024), randf_range(0, 600)) add_child(enemy_instance) # シーンツリーに敵を追加 print("敵がランダムな位置に出現!位置:", enemy_instance.position) # 次回の敵出現時間を再設定し、タイマーを再開 set_random_spawn_time() enemy_spawn_timer.start() |
コード解説
- var EnemyScene = preload(“res://Enemy.tscn”)
- 敵のシーンをメインシーンで使うために読み込んでおきます。preload()関数で事前に読み込むことで、毎回の出現時にファイルを読み込むよりも効率的です。
- @onready var enemy_spawn_timer = $EnemySpawnTimer
- Timerノード(EnemySpawnTimer)をスクリプト内で扱えるように、変数にセットします。
- func set_random_spawn_time()
- 1〜5秒の範囲でタイマーの待機時間をランダムに設定します。これにより、敵の出現タイミングにランダム性を持たせます。
- func _on_spawn_enemy()
- enemy_instance.position = Vector2(randf_range(0, 1024), randf_range(0, 600))で画面内のランダムな座標に敵を配置します。Vector2で位置のXとY座標を設定し、randf_range()でで画面サイズに合わせて範囲を指定しています。
- 敵が出現するたびにset_random_spawn_time()を呼び出し、次回の出現時間をランダムに設定してタイマーを再開させます。
ここまで出来たら、メインシーンから実行してみます。
すると、こんな感じで指定された範囲内にて1~5秒ごとにランダムな位置から敵が出現するんじゃないかと思います。