サイコロの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ドルするが、最適化されている類似アセットの使い方をまとめた記事は↓。