スポンサーリンク
※サイト運営にサーバーは必須です※
~ ロリポップ! はコスパのよい初心者向けサーバーです~
目次
はじめに
「サイコロの面をあてるだけの簡単なお仕事」というAndroidアプリをリリースした。
ダウンロードページ:https://play.google.com/store/apps/details?id=com.kaen.dice
この記事は、アプリの作成からリリースまでを振り返ったあとがきのようなもの。
「この部分が難しかったな~」と作者が振り返るだけ。あまり面白いことは書いていない。
※アプリはUnityを使用して作成
サイコロの作成
まず、最初にぶち当たった壁は、どうやって、サイコロを作成するかである。
サイコロの表裏が合計で7になるようなサイコロの場合、ゲームとして面白くなくなると考えていた。そのため、サイコロの6面は、プログラムでランダムに画像を変えられるようにしたかった。
それゆえ、3Dのcubeにテクスチャを貼り付けるだけでは、目指しているものが作れないと考えていた。
最終的には、バラバラのサイコロの画像を用意して、空間上に配置することで決着がついた。
回転をすべての面で連動させるために、空の親オブジェクトを作成する。その後、6枚画像に対応するオブジェクトを子として紐づけた。
※自作したサイコロの画像は無料で公開
回転パターン
最小の動きで、サイコロのすべての面を、網羅するように動かしたかった。
そのため、あらかじめ回転パターンを用意しておく必要がある。
これをまじめ考えたサイトは見つからなかったので、自分で考えるしかなかった。
考えた結果、全部で40通りあるとわかった。プログラムとして実装する際は、うまくやりくりすることで、基本の5パターンを用意するだけで済んだ。
サイコロの回転手法
当初はiTweenを使用しようと思っていた。
だが、回転をするたびに、微妙なずれが生じて、何度も回転をし続けると、無視できないずれになる。
次に、ググって、Unityで物体を回転させるプログラムを漁るが、どれもしっくりしなかった。
色々検討した結果、この部分は自作。
※Unityはデフォルトでは、Local軸(物体にx,y,z軸が内蔵されていると考える)だ。しかし、今回のような回転制御の場合、World軸(空間のx,y,z軸)で回さないとうまくいかない。Local軸で回すと、いわゆる、「ジンバルロック」が発生する危険性がある。
サイコロの回転制御
真っ先に思いついたのが、Update()の中にif文を用意して、回転制御する。
しかし、この手法は、Unityの素人から見ても、賢くない実装だと感じた。(Updateの度に、If文の判定をするのだから)
最終的には、コルーチンを直列つなぎで実装することで対処。
サイコロの面の数字の把握
サイコロが回転した際に、「どの数字が、いまどの面にあるか」を追う必要がある。
最初に思いついたのが、直接場所の情報を読み取ること。
例えば、上面(高さ1)にある数字が何か知りたい場合、
「高さ1にある面にあるオブジェクトが何か読み取る」行為に対応する。
しかし、検討してみると、この手法は思った以上にめんどくさいと感じた。
※どれだけ回転したかという情報は、空のオブジェクト(親)に収納されている。サイコロの面の(x,y,z)のポジションの情報に反映されるわけではないので。
※もしも、この手法で作るとするなら、上面(高さ1)の部分に透明のオブジェクトを用意して、それに接触しているオブジェクトを読み取るコードを書けばいけると思われる。
結局、回転した際に、ついでに、どのように数字が変わるか計算することにした。
サイコロの画像の入れ替え
サイコロがずっと同じだと面白くないので、サイコロの画像は変わるようにした。
※つまり、表と裏が常に7になるとは限らない。
これ自体は難しくない。
だが、これに、サイコロの回転を考慮した途端、サイコロの面の数字を把握する難易度が跳ね上がった。
行列のインデックスの中に、他の行列が入るような書き方をしないといけず、頭がぐちゃぐちゃになりそうだった。
結局以下の3つの情報に分けて考えるとすっきりした。
① 最初にどの面にどの数字を割り振るか?
② どのように回転したか?
③ ①と②の情報をもとに、現在どの面にどの数字があるか計算して表示
特に最初は、③の情報をきちんと考えていなかったので、応用力のないプログラムになっていた。(1回シャッフルした後、2回目のシャッフルに耐えられない)
サイコロの画面上での位置
Unityのカメラの関係上、サイコロはどう頑張っても真ん中以外の位置からずらせなかった。
もしも、サイコロを画面上で上方向に移動させた場合、サイコロの下面が見えてしまう。これを防ぐには、サイコロとカメラの高さ方向を合わせるしかない。
※perspectiveでなくorthographicで描写することも考えたが、サイコロの見え方がorthographicだとだいぶ違和感を覚えた。
これは結局あきらめて、かわりにskyboxの水平線を下げることにした。
関連記事
「サイコロの面をあてるだけの簡単なお仕事」のダウンロードページ:https://play.google.com/store/apps/details?id=com.kaen.dice
~ギャンブルに絶対儲かる必勝法があるのだろうか?~
私(サイト主)はこの疑問に対して非常に興味を持ち、プログラミングで検証してみました。
このサイトを応援してもいいかなと思う人はぜひとも購入を検討してみてください。