2D / 3D ゲームを作成できる無料・オープンソースの軽快なゲームエンジン「Godot Engine 4」で、指定した確率で選ばれたシーンを動的に子ノードとして作成するスクリプトと実行結果を紹介します。
シーンを preload して得られる PackedScene を格納する配列の型についても紹介します。
※この記事の内容は、アプリ タップ The 宝箱 の開発でも使用しています。
※ GodotEngine のバージョンは 4.1.2 です。 .NET 版ではありません。
※「いらすとや」様の画像を使用しています。
※「ふい字」フォントを使用しています。
※記事で紹介するスクリプト / プログラム / コードは自己責任で使用してください。
前回の記事
前回は、一定の高さより下に移動したら削除するスクリプトを紹介しました。
コイン以外の飛び出すお宝を追加
前回までは、宝箱をクリックするとコインだけが飛び出しました。
他に、ルビー、エメラルド、サファイアを飛び出すお宝に追加します。
作成の手順はコインと同じなので作成手順は以下の記事を参照してください。
https://compota-soft.work/wp1/wp-admin/post.php?post=25119&action=edit
コインが画面下に落下した際に消去するスクリプトについては以下の記事を参照してください。
https://compota-soft.work/wp1/wp-admin/post.php?post=25206&action=edit
コインのシーンと同様に作り、Sprite2D ノードの Texture プロパティに割り当てる画像ファイルだけ以下の物に変更して3つのシーンを作成します。
いろいろな誕生石のイラスト | かわいいフリー素材集 いらすとや
- jewel07_ruby.png
- jewel05_emerald.png
- jewel09_sapphire.png
確率に従って抽選して選ばれたシーンからノードを作成する関数
確率に応じてランダムにノードを作成する関数を作成しました。
これは、コインなどを飛び出させる宝箱のシーンのスクリプトに追加しました。
メンバ変数で、複製するために用いるシーンと、それが選ばれる確率の二つの Array (配列) を定義します。
シーン (tscn) を preload した際に得られる PackedScene を要素とする配列は Array[PackedScene]と型を定義します。
その二つの配列に _ready イベント関数で要素を設定します。
以下のスクリプトでは、コイン=91%、ルビー=3%、エメラルド=3%、サファイア=3%の確率で飛び出すように設定しました。
# お宝(シーン)のリスト
var list_scene_otakara:Array[PackedScene]
# お宝(シーン)の出現確率
var list_prob_scene_otakara:Array
func _ready():
# list_scene_otakara と list_prob_scene_otakara の設定
list_scene_otakara.append(preload("res://otakara_coin.tscn"))
list_prob_scene_otakara.append(0.91)
list_scene_otakara.append(preload("res://otakara_ruby.tscn"))
list_prob_scene_otakara.append(0.03)
list_scene_otakara.append(preload("res://otakara_emerald.tscn"))
list_prob_scene_otakara.append(0.03)
list_scene_otakara.append(preload("res://otakara_sapphire.tscn"))
list_prob_scene_otakara.append(0.03)
以下の create_otakara 関数をよびだすことで、指定した確率に応じてランダムに選ばれたお宝(コイン、ルビー、エメラルド、サファイア)が作成されて戻り値として返されます。
# 指定された確率に応じて、複数のお宝の中からランダムに決めたお宝のノードを作成して返します。
func create_otakara() ->RigidBody2D:
# 全てのお宝の出現確率の合計値です。
var total_list_prob_scene_otakara = 0
# total_list_prob_scene_otakara を求めます。
for prob in list_prob_scene_otakara:
total_list_prob_scene_otakara += prob
# 0 ~ total_list_prob_scene_otakara の間からランダムに値を取得します。
var random_value:float = randf_range(0, total_list_prob_scene_otakara)
# 各お宝の出現確率を足していき、 random_value の範囲内にあるお宝の要素番号を得ます。
var tmp_total_list_prob_scene_otakara = 0
var index = 0
for prob in list_prob_scene_otakara:
tmp_total_list_prob_scene_otakara += prob
if random_value <= tmp_total_list_prob_scene_otakara:
break
index += 1
# 確率に従いランダムに選択された要素番号のお宝のシーンを使って、ノードを作成して返します。
var selected_scene = list_scene_otakara[index]
var created_otakara:RigidBody2D = selected_scene.instantiate()
return created_otakara
テスト
F6 キーで現在開いているメインのシーンを再生して宝箱をクリックすると、コインが多いですが、おそらく 3% 程度の確率で各宝石も飛び出すようになりました。
まとめ
今回は、2D / 3D ゲームを作成できる無料・オープンソースの軽快なゲームエンジン「Godot Engine 4」で、指定した確率で選ばれたシーンを動的に子ノードとして作成するスクリプトと実行結果を紹介しました。
シーンを preload して得られる PackedScene を格納する配列の型についても紹介しました。
参照サイト Thank You!
- Godot Engine – Free and open source 2D and 3D game engine
- 草コインのイラスト | かわいいフリー素材集 いらすとや
- PackedScene — Godot Engine (4.x)の日本語のドキュメント
- Array — Godot Engine (4.x)の日本語のドキュメント
- 【Godot4.x】シーン・リソースの指定を文字列以外にする方法 | 2dgames.jp
記事一覧 → Compota-Soft-Press
コメント