スポンサーリンク
※サイト運営にサーバーは必須です※
~このサイトもエックスサーバーを使用しています~
目次
はじめに
「サイコロの面をあてるだけの簡単なお仕事」という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
~Webサイトを自分で作ってみませんか?~
Webサイトを運営するにはサーバーが必須です。
このサイトは、エックスサーバー のサーバーを使用しています。
エックスサーバーは無料で10日間お試しができます。