ブラックジャックの作り方4 ゲームシステムとbet(賭け金)システムを作る

Unity カードゲームの作り方


Unityの本格ゲーム制作講座はこちら
【30日間の全額返金保証付き】

前回の記事でカードを配れるようになりました!

前回の記事:

ブラックジャックの作り方3 トランプの山札・カードを引く処理を作る
前回の記事でシーンに必要なものが配置できました。 前回の記事: で、今回の記事ではトランプのカードを配れるように山札を作り、カードを引く処理を作っていきます。 ここまでできるとデッキからカードを引いて戦うようなゲームの基本部分も作...

今回の記事では実際にブラックジャックのゲームの流れを作っていきましょう!

賭け金を決めてベットする処理やコルーチンを用いたゲームの管理システムを構築していきます。


【Unity入門の森の最新ゲーム開発講座もお届け】

ブラックジャックのゲームの流れをコルーチンで管理する

ブラックジャックでは次の流れを繰り返します。

  • このゲームのベットを決める
  • カードを配る
  • 配られたカードを見てヒットするかスタンドするか決める
  • ゲームの結果を判定する

これを実装するにあたってコンポーネントのUpdateメソッドを利用すると余計な処理が必要になり、管理が難しくなります。

なので、この記事ではUpdateメソッドを使わず代わりにコルーチンを利用します。

次のサンプルコードからはコルーチンを使用してゲームの流れを管理していきます。

関連記事:Unity C#のIEnumerable・IEnumeratorとコルーチンの使い方・作り方

GameLoopメソッドのwhile文の中でゲームの流れを管理するようにします。

While文は条件式にtrueを渡し無限ループするようになっていますが、メソッドがコルーチンとして実行されかつ、while文の中でyield returnしているので、プログラムがフリーズすることはありません。

この記事ではこのメソッドの内容を順に拡張していきますので、今は実装していく内容のコメントだけにしてください。

また、何か実装するまでwhile文の中のyield return nullを忘れないようにしてください。

もしこの部分がない状態で再生すると無限ループに入り、Unityエディターがフリーズしてしまうので注意してください。

また、この段階で前の記事で追加したUpdateメソッドを削除してください。

ベット(掛け金)を指定できるシステムを作ろう!

まずブラックジャックではゲーム開始時にそのゲームに掛けるポイント(ベット)を指定します。

そのためにはどれくらいのポイントを掛けるのか入力する必要があるので、ベット専用のUIをシーンに追加していきましょう!

そのために次の手順を行なってください。

  • メニューのGameObject > UI > Canvasをクリックし新しいCavansを追加する

追加したCanvasの名前を「InputBetsDialog」とする

  • 「InputBetsDialog」の各コンポーネントは初めに作った「Canvas」と同じものにする
  • 「InputBetsDialog」のCanvasコンポーネントのSort Orderを100に設定する。
  • 「InputBetsDialog」の子GameObjectとしてUI > Imageを作成し、名前を「Background」にする(背景の白画像が不要であればImageコンポーネントを消してもOK)
  • 「Background」の子GameObjectとして次のものを追加する
  • – UI > TextでGameObjectを作成し、「Label」という名前にする。
  • – UI > Input FieldでGameObjectを作成し、「BetsInput」という名前にする。
  • – UI > ButtonでGameObjectを作成し、「OKButton」という名前にする。テキストは「OK」にする。
  • 作成したGameObject達をいい感じになるように配置する

これらの作業が終わると次のような画面になります。

配置に関しては読者の方の自由でOKです。RectTransformのアンカーやLayoutGroupなどを使用するといいでしょう。

この作業の中で「BetsInput」が値を入力するためのGameObjectになります。

「BetsInput」にはUnityEngine.UI.InputFieldコンポーネントがアタッチされており、そのコンポーネントが入力を管理しています。

それでは再生中に「BetsInput」に値を入力したら、「OKButton」をクリックすることでゲームにかけるベットを決定できるようにしていきましょう!

Canvasの描画順序の指定の仕方

CanvasコンポーネントのSorting OrderでCanvasコンポーネントの描画順序を指定することができます。

大きい値のものほど画面の前に表示されますので、複数のCavansを使用する際に利用してください。

アタッチされたコンポーネントのコピーの仕方

UnityエディターではInspectorからアタッチされているコンポーネントをコピーしたり、貼り付けたりできます。

これらの作業を行いたい場合はInspectorのコンポーネントの右上にあるボタンを押してメニューを開き、その中から行いたいものをクリックしてください。

SceneManagerコンポーネントに組み込む

シーンにベット入力用のGameObjectを配置したら、次はSceneManagerにそれを組み込みましょう!

この記事の序盤で説明した通り、GameLoopメソッドの中に処理を追加していきます。

GameLoopメソッドのwhile文の初めにベット入力を待つ処理を追加します。

ベット入力には先に作った「BetsInputDialog」を使用しますので、それと「BetsInput」をSceneManagerコンポーネントのフィールドに追加しています。

スクリプトのコンパイルに成功したら、そちらも忘れずにアタッチしてください。

上のサンプルコードではベットの入力するために次の処理を行なっています。

  • まず「BetsInputDialog」をアクティブにし画面に表示する
  • 「BetsInputDialog」が非アクティブになるまで待つ(yield return new WaitUntil(条件);で条件の間処理を止めてくれる)
  • 非アクティブになったら「BetsInput」に入力されたテキストをチェックする
  • チェックの結果、賭けられる数値ならそれを使用する
  • できない場合はベット入力をもう一度初めからやり直す。

結構難しい処理になっていますが、入力した値の検証をする必要があるのでこのような手順で処理を行っています。

無事作成できたら、次は「OKButton」のクリック操作を設定しましょう。

「OKButton」のInspectorからButtonコンポーネントのOnClickイベントを次のように設定してください。

  • 「InputBetsDialog」をアタッチし、その中のGameObjectのSetActiveメソッドを選択する。引数はfalseにする。

こうすると「OKButton」を押すたびに「InputGetsDialog」が非アクティブになります。

ただし、現在のポイントより大きいものを入力したときや数値でない時は何もおきません。

InputFieldコンポーネントのイベントを利用して入力値を検証する

Unity UIのInputFieldコンポーネントには入力したテキストが変更された時のイベントが用意されています。

それを利用すると入力値の検証ができるので使用できるベットの値の時のみ「OKButton」を押すことができるようにしましょう!

次のサンプルコードを実装できましたら必ずSceneManagerコンポーネントのBetsInputOKButtonフィールドには「OKButton」をアタッチしてください。

今回はInspector上ではなくスクリプト上から直接イベントを設定しています。

InputField.onValidateInputはスクリプト上からしかイベントを設定できないので注意しましょう!

設定しているイベントは次のものになります。

どれも「BetsInput」のテキストが変更されたときに呼び出されるイベントになります。

  • BetsInputOnValidateInput:入力された文字が数字かどうか判定している。
  • BetsInputOnValueChanged:入力された値がベットに使えるなら、「OKButton」を有効化する。

InputField.onValidateInputの戻り値にヌル文字(’\0’)を指定すると入力した文字はテキストに追加されませんので覚えておくといいでしょう!

また、Unity UIのButtonコンポーネントのinteractableをfalseに設定するとそのボタンはクリックすることができません。trueにすると再びクリックすることができます。

このサンプルコードを組み込むと「BetsInput」には数字しか入力できず、使用できるベットの値の時のみ「OKButton」が押せるようになります。

ベットを入力したらプレイヤーとディーラーにカードを配ろう

ここまででベットの入力ができたので、次はプレイヤーとディーラーにカードを配ってみましょう!

こちらはGameLoopメソッドを拡張します。カードを配る処理はDealCardsメソッドで既に実装できているので、そちらを使用します。

プレイヤーの行動を選択するためのボタンを実装しよう

無事カードを配れたので、次はプレイヤーの行動を実装しましょう!

プレイヤーの行動は画面右にある「Buttons」の中のボタンで行います。

上のサンプルコードを追加できたら、「Buttons」のボタンにSceneManagerのメソッドを設定しましょう。

設定するメソッドはSetActionメソッドになります。

ここで注意点としてUnityエディターは標準で列挙型に対応していないので代わりにint型を引数に渡すようにしています。

  • 「HitButton」にSceneManagerコンポーネントのSetActionメソッドを設定し、引数を1にする
  • 「HitButton」にSceneManagerコンポーネントのSetActionメソッドを設定し、引数を2にする

int型は列挙型に変換できます。その際、実際の列挙型の値と一致する数値を使用してください。

ただし、存在する列挙型の値かどうかはint型の値次第なので、念のためチェック処理をGameLoopメソッドの中で行っています。

Action列挙型の値の各数値は次のようになっています。

  • Action.WaitAction: 0
  • Action.Hit:1
  • Action.Stand:2

ここまで問題なくできたら、行動ボタンによって処理を分岐できるようになっています。

最後に、動作確認用に入れておいた「yield return new WaitForSeconds(2);」の命令を消しておきましょう。

まとめ

今回の記事でブラックジャックのゲームの流れができました!

あとはゲームの判定処理や細かいルールを実装すると完成になのでもう少し頑張ってみましょう!

今回の記事をまとめると次のようになります。

  • コルーチンを使うとゲームの流れを簡単に作ることができる
  • UnityEngine.CanvasのSortingOrderを使うと複数のCanvasの描画順を決めることができる。
  • UnityEngine.UI.InputFieldを使用するとテキストを簡単に入力することができる。
  • UnityEventの引数には列挙型を設定できないので代わりにint型を使用する

それでは次の記事に行ってみましょう!

次回の記事:

ブラックジャックの作り方5 Hit・Stand処理と絵札の効果を作る
前回の記事でブラックジャックの大まかな流れを作成することができました。 前回の記事: 今回はHit、Stand処理を作り、カードを引くか引かないかの分岐や、ジャック、クイーン、キングを10扱いにしたり、エースを11or1で選択できる...

Unityカードゲーム開発講座へ戻る>>

参考用:スクリプトの完成図

ちなみに今回の記事で作成したスクリプトの完成図は次のようになります。


【Unity入門の森の最新ゲーム開発講座もお届け】

コメント

  1. kei より:

    コメント失礼します。
    「SceneManegerコンポーネントに組み込む」でサンプルコードは「yield return new WaitWhile(()」、説明は「yield return new WaitUntil(条件);」となってますがこれはどちらが正しいのでしょうか

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