【Unity無料アセット】サイコロの3Dモデルと出目の判定システム

【Unityアセット】[WyrmTale Games] Dice Pack Lightのテスト画像

サイコロの3Dモデルと、出目の判定システムが含まれた、フリーアセット[WyrmTale Games] Dice Pack Lightの使い方。

以下サンプル動画。

インポート

Project Settingsが多少変更されるので、出来るだけ初期状態のプロジェクトにインポートする。

「Importing a complete project will overwrite your current project settings.~」というメッセージが出るが、Project Settingsが変更されますよ、といった内容。

使い方

準備

任意のGameObjectに、Diceスクリプトをアタッチしておく。

ロールする時


Staticメソッドなので、参照の取得は必要ない。
以下の内容のスクリプトを作成して、任意のGameObjectにアタッチ、適当にRollDiceを呼べばサイコロが振られる。



public class GameManager : MonoBehaviour

{
	Vector3 spawnPosition = new Vector3(-3, 3, -3);
	Vector3 direction = new Vector3(1.0f, 1.0f, 1.0f).normalized;
	float force = 10.0f;

	public void RollDice () {
		Dice.Clear();
		Dice.Roll("1d10", "d10-black", spawnPosition, direction * force);

//複数振る場合。
		Dice.Roll("2d10", "d10-black", spawnPosition, direction * force);

//ダイス毎の設定を変える場合は、単純にRollを複数回実行。
		Dice.Roll("1d10", "d10-black", spawnPosition, direction * force);
		Dice.Roll("1d10", "d10-red", spawnPosition, direction * force);

  	}

}

Rollメソッドの詳細

引数で文字列を渡して、使用するプレハブや、マテリアルを判定し、Resources.Loadでロードして設定している。
複数のサイコロを振る場合は、自動的に時間差で出現するようになっている。

Rollメソッドの仕様は以下のような感じ。
(フリー版なので、die typesは「d6, d10」のみ対応)。


	/// format dice	:	({count}){die type}	, exmpl.  d6, 4d4, 12d8 , 1d20
	/// possible die types	:	d4, d6, d8 , d10, d12, d20

	public static void Roll(string dice, string mat, Vector3 spawnPoint, Vector3 force)

Roll(“一度に振る個数” + “サイコロの種類「d6, d10」, “マテリアル名”, 出現地点, ロールの際に掛ける力);

有効なマテリアル名

  • d10-red
  • d10-green
  • d10-blue
  • d10-yellow
  • d10-white
  • d10-black
  • d6-red
  • d6-green
  • d6-blue
  • d6-yellow
  • d6-white
  • d6-black

サイコロの目の取得

サイコロが一定の速度以下になると、Dice.valueに目の値が入る。
通常時の値は0なので、0の結果を除外する事で、サイコロを振った結果の値を特定出来る。
(10面ダイスの0の面の場合は10が取得される)。

目の値の取得

引数にstringでdieTypeを渡す。


//全てのサイコロの目の合計値。
	Dice.Value("");

//全ての6面ダイスの目の合計値。
	Dice.Value("d6");

//全ての10面ダイスの目の合計値。
	Dice.Value("d10");

目の値を文字列で取得(デバッグ表示用)

前項のValueと同じく、引数にstringでdieTypeを渡す。
「サイコロの種類 + 各サイコロの目」のような一定の書式で、各情報が取得出来る。

Debug.Logや、Print等に直接入れれば良い。


	Dice.AsString("");

	Dice.AsString("d6");

	Dice.AsString("d10");

備考

複数のサイコロを振る場合はDice.Valueのコードを改変

前述のように「サイコロを振った結果の目」を「!= 0」で判定している場合、複数のサイコロの結果に対応出来ない。
DiceクラスのValueメソッドを以下のように改変する事で、全ての結果が出揃っていない場合は0を返すように変更出来る。

Diceスクリプトの位置は、「プロジェクト名\Assets\Dice\Plugins」。


	public static int Value (string dieType)
 	{
		int v = 0;
		// loop all dice
		for (int d = 0; d < allDice.Count; d++)
		{
			RollingDie rDie = (RollingDie) allDice[d];
			// check the type
			if (rDie.name == dieType || dieType == "")
				v += rDie.die.value;

//ここを追加した。
			if (rDie.die.value == 0) {
       				v = 0;
      				return v;
			}

  		}
  		return v;
	}    

オブジェクトプールではないので、負荷が高い

Dice.ClearでGameObjectのDestroy、Dice.RollでInstantiateしている。
オブジェクトプールのように使い回していない。

サイコロが邪魔な場合はDice.Clearで破棄しておく

前項の通り、オブジェクトプールではないので、再利用していない。
非アクティブ化しても、仕様を変えない限り意味がないので、素直に破棄しておく。


	Dice.Clear();

Resourcesフォルダが使用されているので、ビルドサイズが増える

Resourcesフォルダ内に配置されている為、使っていないプレハブや、マテリアルもビルドに含まれてしまう。
多少ビルドサイズが増加してしまうので注意が必要。

GetComponentが多用されているので、負荷が結構ある

コード全般で、コンポーネントが保持されておらず、GetComponentで毎回取得している。
速度が必要になる場面では使用しないようにして、メインのゲーム部分とは分けておく。

名前空間が設定されていないので、名前の衝突に注意

Dice Pack Lightの各クラスには、名前空間が設定されていない。
一応、名前の衝突に注意。

まとめ

粗への対応が面倒臭いです…。
2DメインのTRPG風ゲームや、ADV等なら使用に堪えるかも知れない。

軽くしたいなら、オブジェクトプールにして、更にGetComponentを初期化時のみに変更する。

5.5ドルするが、最適化されている類似アセットの使い方をまとめた記事は↓。

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