サイコロの面をあてるだけの簡単なお仕事(あとがき)

  • このエントリーをはてなブックマークに追加

スポンサーリンク

※サイト運営にサーバーは必須です※
~このサイトもエックスサーバーを使用しています~

はじめに

「サイコロの面をあてるだけの簡単なお仕事」という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

Unityコースやアプリコースあり。無料体験の申込みあり。
  • このエントリーをはてなブックマークに追加

スポンサーリンク

コメントを残す

*

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)