Godot4 確率を指定してランダムに複数シーンの中からノードを作成

2D / 3D ゲームを作成できる無料・オープンソースの軽快なゲームエンジン「Godot Engine 4」で、指定した確率で選ばれたシーンを動的に子ノードとして作成するスクリプトと実行結果を紹介します。
シーンを preload して得られる PackedScene格納する配列の型についても紹介します。

※この記事の内容は、アプリ タップ The 宝箱 の開発でも使用しています。
※ GodotEngine のバージョンは 4.1.2 です。 .NET 版ではありません

※「いらすとや」様の画像を使用しています。
※「ふい字」フォントを使用しています。

※記事で紹介するスクリプト / プログラム / コードは自己責任で使用してください。

前回の記事

前回は、一定の高さより下に移動したら削除するスクリプトを紹介しました。

コイン以外の飛び出すお宝を追加

前回までは、宝箱をクリックするとコインだけが飛び出しました。
他に、ルビー、エメラルド、サファイアを飛び出すお宝に追加します。

Godot4 TapTheTakarabako コインと同様にほかのお宝も画像だけを変えてシーンを作成します.

作成の手順はコインと同じなので作成手順は以下の記事を参照してください。

 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% 程度の確率で各宝石も飛び出すようになりました。

Godot4 TapTheTakarabako 確率に応じてランダムにお宝4種類がとびだすようになりました。

まとめ

今回は、2D / 3D ゲームを作成できる無料・オープンソースの軽快なゲームエンジン「Godot Engine 4」で、指定した確率で選ばれたシーンを動的に子ノードとして作成するスクリプトと実行結果を紹介しました。
シーンを preload して得られる PackedScene格納する配列の型についても紹介しました。

参照サイト Thank You!

記事一覧 → Compota-Soft-Press

コメント

Ads Blocker Image Powered by Code Help Pro

お願い - Ads Blocker Detected

このサイトは広告を掲載して運営しています。

ポップアップを閉じて閲覧できますが、よろしければ

このサイト内の広告を非表示にする拡張機能をオフにしていただけませんか?

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

We have detected that you are using extensions to block ads. Please support us by disabling these ads blocker.

タイトルとURLをコピーしました