【Unity】Randomクラスを使ってトランプをシャッフルするサンプル
ビバ乱数!
と叫ばんばかりに最近は乱数ばっかりいじってます。
Unityのマニュアルに『ランダムなゲームプレイ要素の追加』の項目があるのですが、これを自分なりに解釈して手を動かしてコーディングしています。
今回はその中の『リストをシャッフルする』の項目を出発点に、トランプをシャッフルするサンプルを作成してみます。
環境
macOS 10.13 High Sierra
Unity2018.1.0f2
作りたいサンプル
4種類のマーク(スート) * 13個の数字 + ジョーカーで計53枚のトランプを考えます。
このトランプをシャッフルして、毎回異なる並びにするサンプルを作ります。
その動作確認のため1つのマークだけ使い、13枚のカードでシャッフルしてみることを目指します。
まずはカードの定義とカードリストの作成を行います。
カードは上記のようにstructで定義してみました。
スペード、クラブなどのマーク(スート)を保持するフィールド、カードの数字、ジョーカーフラグをもたせました。
ジョーカーフラグがtrueの場合はマークや数字に関係なくジョーカー扱いとする予定。
コンストラクタで各フィールドの値を突っ込んでいます。
Unityのマニュアルでは配列でカードを保持しています。でも同じことやってもアレなので、ここではListで持たせることにします。
初期化はInitializeCardList()で行なっています。上で定義したCard型のリストを新しく作り、カードを1枚ずつ生成してAddしています。最初はスペードだけでいきましょ。
作られたデッキの中身はShowCardsName()でコンソールに出力しています。ひとまず1行にまとめて出力しちゃいましょう。
上のスクリプトを任意のゲームオブジェクトにアタッチしてゲームを実行すると、以下のようにコンソールにメッセージが出力されます。
あ、全角の記号って小さく表示されますね。……まぁいいや(適当)
これでカードデッキが作成されました。次はシャッフルしてみます。
カードをシャッフル
上で作ったカードデッキをシャッフルして、そのたびにランダムに並べ変わるようにします。
Unityのマニュアルで掲載されているサンプルコードの流れは以下の通り。
- 順番にカードデッキの配列にアクセスする
- アクセスした要素(A)は一時的に変数に格納
- 要素を格納する位置をRandom.Rangeを使ってランダムに取得
- 移動先の要素(B)を(A)の位置に格納
- (B)の位置に(A)を格納
- これをリストの大きさだけ繰り返す
カードデッキがList型でも同じように作成できます。上記のスクリプトファイルに以下を追加します。
スクリプトを保存してゲームを実行するとコンソールに以下のテキストが表示されます。
無事シャッフルされました。
あとは他のマーク(スート)を追加して、ジョーカーも入るようにします。11, 12, 13もJ, Q, Kで表示したいなー。
マーク(スート)の追加はフィールドで。そのリストも作成しました。こうしておくと初期化の時にforeachが使えて便利。
初期化のメソッドにマーク(スート)の追加を反映しました。ジョーカーは個別対応です。追加したい枚数に応じてどんどんCardを追加すればOKですが、今回は1枚なのでシンプルに。
マーク(スート)の追加に応じて、コンソールに出力するときの記号も追加しました。また、11, 12, 13をJ, Q, Kとして表示する処理も入れました。
実は一度全部のカードを1行に表示してみたのですが、えらいことになったので複数行に分ける処理を入れました。
1行にしてしまうと、横幅がものっそい伸びて、このブログの横幅に入りきらないんです。縮小すると文字が潰れてしまうので痛し痒し。
なので1行表示の文字列は残しつつ、表示用に分割する処理を入れています。
これらの変更を保存し、ゲームを実行するとカードがシャッフルされて表示されます。
よしよし、いい感じです。
まとめ
シャッフル以外の場所で時間取られましたが、シャッフル自体は簡単にできました。
カードゲーム系では必須も必須なので自分用にソースコードを用意しておくといいかも。
これを使ってババ抜きとかやってみようかしら。
ゲーム開発の攻略チャートを作りました!
-
前の記事
【Unity】乱数を使ってAnimationCurveに応じた確率分布曲線を描く 2018.06.25
-
次の記事
【Unity】山札からトランプの手札を配るサンプル2通り 2018.06.26
[…] 参考にしたのは下記のサイト。 【Unity】Randomクラスを使ってトランプをシャッフルするサンプルUnityのRandom… Cardスクリプトの作成 カードのデータを保持するクラス […]