LIKE A ROLLING BALL

とある学生の活動日記

Unityでミニゲームを作ろう!!#01【じゃんけんゲーム】

ども、(BALL)です。

前回述べた通り、Unityでミニゲームを作っていきます!!

今回挑戦するのは簡単なじゃんけんゲーム。

どんな感じになったのか、見ていきましょう!!

 

 

 

1.出来上がったものがこちら

 

 

どうでしょうか、このやっつけ感の塊みたいなめちゃくちゃチープな出来。

ですが、画面下部のグーチョキパーの3択の中から1つを選ぶとそれが表示され、画面上部にはCPUがランダムで選択した手が表示されています。そしてその手の状況から勝敗またはあいこが表示され、右下の再戦ボタンを押すことで再度勝負に挑むことが出来ます。

当初の予定でもある、ランダムで表示させるというギミックがちゃんと出来上がっているところに関しては、ちゃんと評価すべきではないでしょうか。

 

2.ミニゲームの仕組み

さて、技術的な方面に精通している方お待ちかねのソースコード解説コーナーです。ここから先は比較的専門的な話が続く上、私自身も付け焼刃の知識しかありませんので、読む際は正しくない恐れの方が強いということを念頭に置いてお読みください。

 

あとソースコードに関してはどう表示すればいいのかよくわかってないので、Carbonっていう入力したソースコードを画像で表示するサービスを利用しています。コピペは出来ませんのでご了承ください。

carbon.now.sh

 

2.1ソースコード

てわけでコード1つ目。

「clickhand」

f:id:ballc489:20180227222013p:plain

役割としては、グーチョキパーのボタンをクリックしたら、対応した値を変数に入れ、じゃんけん結果である「pong」sceneへ移動する、という関数を持ったコードです。

また、start時にはCPUの手もランダムで決め、その手に対応した値を変数に入れます。

 

具体的な解説は後でするとして、2つ目のコード。

 「pongscript」

f:id:ballc489:20180227224415p:plain

 長くなり過ぎた結果だいぶ文字が小さくなってしまいましたね・・・。これに関しては次回以降いい感じにしておきます。

中身としては、先ほどの変数の値から、プレイヤー及びCPUの出す手の画像を変更し、またその変数を参照してゲームの勝敗またはあいこを判定しています。

 

2.2各種解説

まず1枚目の「clickhand」の方から。

public readonly static clickhand Instance = new clickhand();

こちら、私自身もあまりわかっていないのですが、ggったところ、scene間で共有できる変数的な感じっぽくて!!(本当によくわかっていません。詳しい人解説してください)

これを宣言することで、上に書いた「playerhand」と「cpuhand」がなんかいい感じに「pong」sceneに持っていけるわけですよ!

ってわけで、「Onclick~」(手のボタンクリック時に動作する用の関数)の中に

clickhand.Instance.playerhand = 0;

とやって、入れておるわけです。

因みに0がグー、1がチョキ、2がパーって設定です。

そして「Start」の中の「cpuhand」の方ですが、こちらはランダムに0~2の値が入る必要があるので、ランダムな値を指定した範囲から出す「Random.Range(x, y)」というやーつを使っています。0~3にすることで、0,1,2の中から選ばれる仕組みになっています。つまりy側はランダムな範囲n+1に設定する必要があります。

 

 

 

そして2枚目「pongscript」。

こちらはStartで

Player.gameObject.GetComponent<Image> ().sprite = yourhand [clickhand.Instance.playerhand];

というなんかよくわからんことをやっていますが、要するに「Player」という上部で宣言したImageタイプのGameObjectに、「yourhand」という画像の配列の中身を当てはめるというもの。配列は右の括弧の中に数字が入るわけですが、その数字というのが先ほど「clickhand」の方で作ったscene間でも共有できる変数の値、具体的に言えば0~2が入るわけです。(だから上部の「yourhand」の宣言のところも「new Sprite[3]」と、3枠宣言されてるわけです)

同様にCPU側の画像も変更しましたら、次は勝敗の判定です。

今回判定に用いたやり方と言うのは、

プレイヤーとCPUが出した手の値(こっち側で設定した0~2)の総和から状況を判断し、その後二つの値を比較して勝敗を決める、というもの。

わかりにくいので具体的に説明しますと、まず前提として、あいこの場合はプレイヤーもCPUも同じ値(手)ですよね。なので、最初に

if (clickhand.Instance.playerhand == clickhand.Instance.cpuhand) {
Score.gameObject.GetComponent<Text> ().text = "あいこ!!";
}

というif文を書いています。要は二人とも同じ値だった場合は、あいこと表示しますよってこと。

そうじゃない場合、勝敗が決まっている場合はどちらも違う値を出します。

その時の組み合わせは、

グー(0)+チョキ(1)=1

チョキ(1)+パー(2)=3

パー(2)+グー(0)=2

の3パターン。このうち上2つのパターンに関しては、どちらも値が小さいほうが勝利ですよね。しかし最後のパターンでは値が大きい方が勝利となります。なので、先ほどのif文に続いてelse ifでこう書きました。

else if (clickhand.Instance.playerhand + clickhand.Instance.cpuhand == 2)

二つの和が2の時、つまりはパーとグーの組み合わせの時だけ判別式が違いますので、else ifで分岐させ、違う判別式「keisan2」に投げます。

もしこれに当てはまらない2パターンが出たら、「keisan1」に投げます。

 

「keisan1」及び「keisan2」は単純な話で、二つの値を比較して、大きさに応じて勝ち負けのテキスト表示を変更するだけです。

ただ大小の符号が逆なだけです。正直それだけならもう少しコードを短縮できそうな気もしたけど面倒だったのでいいです。

 

あと「Onclick」は再戦ボタン用のです。もともとは時間経過で自動で戻るようにしたかったのですが、なんかscene移動に関してやろうとすると結果画面が一瞬表示されてすぐ戻るという原因不明の不具合に直面し、改善しようと試みるもやり方がわからず諦めました。何がいけなかったのかさっぱりなのでこれに関しては将来的な課題にしたいと思います。

 

3.感想

思いのほか簡単だった。まあ一応Unityの教科書的な本のチュートリアルは少しやったし、頑張ってクッキークリッカー的なゲームも作れたので、ggればどうとでもなるレベルではあった。が、scene間の変数の共有的なやり方はそのクッキークリッカー的なゲームの時にわからず諦めてしまったものなので、普通に良い学習となった。

また、ランダムで値を出すやつもなかなかに使い勝手がいいので今後役に立つことだろう。

 

4.次回のミニゲーム発表

続いて制作するミニゲームは・・・じゃかじゃん!

はい、特にまだ決まってないし何が作りたいってのもあんまりわからないので、何か良い案を思い浮かべてきてから追記しますのでしばしお待ちください。

 

刹那の見斬り!!

カービィミニゲームでおなじみの、あれです。突然表示されるエフェクトに対してどちらが素早く反応できるかを競うゲームです。時間関係の処理とかそこらへんについての理解を深めたいのと、少し視覚的にもゲーム性のあるものを作りたいからってところですね。頑張っていきたいと思います。

また、Twitterではハッシュタグ #ゆにみに で随時色々呟いているので、お暇なときに覗いてみてください。

 

それでは今回はこの辺で。

 

ではでは。