こんにちは、H.O SOFTのひろしです。
今回は「雨漏り人生」の技術に関するお話です。技術的にはそれほどたいした事はしていないため、申請まわりで引っ掛かったところなども含め、お話ししたいと思います。
念の為こんなゲームです
こんなブログを読んでいる方は既にご存知だとは思いますが、「雨漏り人生」は↑のようなゲームです。
上から雨漏りがしてきて、それを容器で受けて、それでも容赦なく雨漏りが激しくなるので、水を流しに捨てて、また雨漏りのしているところに置いて……を繰り返すだけのシンプルなものです。この中から、使っている技術や、実装について、申請で引っ掛かったところなどをご紹介していきます。
開発環境
Unity 2018.4.13f1 です。最初は2018の2か3だった気もしますが、最終的にはこのバージョンになりました。
利用している主なアセットは下記のとおり。
- Liquid Volume(後述)
- Master Audio
- DOTween Pro
四畳半モデルは当初は無料のアセットを使っていましたが、最終的には友人のK田氏に作ってもらいました。
この他は、起動後のクレジットのところをご参照ください。
開発期間と人員
人によっては気になる開発期間と人員の話。
正直、隙間の時間でちょこちょこ作っていたので実際に開発に使った時間はよくわからないのですが、gitの最初のコミットは2019年8月26日になっています。そこから飛び飛びでコミットがあり、最終コミットは2020年3月19日です。おおむね半年くらいですね。
半年くらいかけてだらだらと作っていたわけですが、感覚としてはトータル2ヶ月くらいの規模感だったと思います。
人員についてはプログラムは全て自分一人で、アセットについては四畳半とタライをK田氏に、ロゴを兄のおぎのひとし氏にお願いしました。工数としてはプログラム(と、ストア素材などの準備)1.5~2人月、アセット0.5~1人月、ロゴ0.25人月くらいでしょうか。
規模としては、まあ、そんなに大きくもなく、ミニゲームとしては標準的なところかと思いますが、売り物にする以上、ここでかけたコスト以上に儲からないといけないわけで……そのへんの話については次回しようと思います。
雨水用のアセット
容器に雨水がたまっていきますが、これは、「Liquid Volume」というアセットを使っています。
自力でシェーダーを書いても良かったのですが、どうせUnityで作るのであればアセットを使った方が楽なので、極力楽する方向で導入しました。
アセットの使い方などは今回は触れませんが、それほど難しくなく扱う事が出来るので、今回のような表現が必要な場合は有用なアセットだと思います。
ただ、Single Passでの描画がどうしても出来なかったので、今回はMulti Passで妥協しました。頑張って自力で作ればSingle Passでイケたと思いますが、まあ今回は開発速度優先という事で……。
容器の傾きのテキトーな判定
雨漏り人生は、雨の入った容器を持って手首を回転させると、容器が回転し、水がこぼれる、という要素があります。もちろん雨水がなみなみとたまった容器を傾けるとすぐに水はこぼれるのですが、あまり水が入っていない容器は(当然ですが)だいぶ傾けないと水はこぼれません。
このへん、ちゃんと数学が出来る人であればしっかり計算して正確に作れると思うのですが、算数わからん人なので、下記の方法で強引に判定しています(テキトーですので注意)
// 一定以上傾けると水がこぼれる
var deg = Vector3.Angle( Vector3.up, catchedObject.transform.TransformPoint(0,1f,0f) - catchedObject.transform.position );
var waterLevel = catchedObject.WaterLevel;
var newWaterLevel = Mathf.Min(waterLevel, Mathf.Max(0f, 1f - (deg / 90f) ) );
if (waterLevel - newWaterLevel > 0.01f)
{
// こぼれた
}
……なんだこれ?←忘れてる
えーと、catchedObjectがタライなどの容器です。
まず、その容器の底、中心部から、底から垂直にのばしたローカルY軸(上方向)1m先の位置までのベクトルと、Vector3.upとの角度の差を算出します。つまり真上に向いている時は0、真横は90、ひっくり返した時は180になります。
で、その角度(オイラー角)を90で割った値を1から引いた値と0を比較して、大きい値をnewWaterLevelとします。具体的には、容器が真上を向いている時には1、真横を向いている時は0、真横から真下でも0になります(180度になった場合は1f – (deg / 90f)は-1になるのですが、Mathf.Maxにより0以下にはならない仕組みです)。
説明が前後しますが、waterLevelというのは0で水がたまっていない、1で満タン、という値になります。newWaterLevelは、傾きを考慮した、想定されるwaterLevelとなり、現状のwaterLevelから0.01以上の差がある状態になった場合にこぼれるという事ですね。
単純といえば単純なのですが、当時やけに悩んだので説明してみました。
コントローラーの右手、左手の切り替え
雨漏り人生は、技術的にはたいした事をしていないので、ここからは申請で引っ掛かったところを紹介します。
まず、初期の雨漏り人生は、起動時に右手、左手の判定をして、以降利き手を切り替えても無視していたのですが、ここで審査に引っ掛かりました。どうやら、動的に右手、左手どちらのコントローラーが有効かを確認して切り替えなければならないようです。
こちら、ついつい利き手のみでチェックしたりしがちですが(自分だけ?)、ちゃんとゲーム中に切り替えても大丈夫なように作っておくと良いでしょう。
(技術的にはたいした事をしておらず、毎Update時、 OVRInput.IsControllerConnected() で右手、左手の接続があったかを確認して、切り替わったら、 LeftHandAnchor or RightHandAnchorをコントローラーのアンカーTransformとして使ってやるだけです。フツー)
ロゴに含まれる文字の制限
Oculus Storeにおいて、ロゴ画像には、ゲームタイトルの文字以外が含まれてはいけない、というルールがあります。このルールにだいぶハマったのでご紹介を。
当初の雨漏り人生のロゴは、このようなものでした。
個人的には気に入っているロゴでしたが、このロゴにて、タイトルを日本では「雨漏り人生」、英語では「Rain Leak Life」として申請したところ、見事に落ちました。
そのあと、現在のロゴにした上で、タイトルは変えなかったところ、またもや審査落ち……。
これはマズいぞ、と思い、いっそタイトルを「Rain Leak Life」にしてロゴも英語にするか……とも思ったのですが、元々の思惑として「ロゴに日本語が含まれると海外でちょっと目立つのでは」という事もあったので、それは避けたい……と、色々と頭を捻った結果、日本では「雨漏り人生 – Rain Leak Life」、英語では「Rain Leak Life – 雨漏り人生」というタイトルにすることで、どうにか審査を通過したのでした。
ロゴに、タイトル以外の文字が含まれてても別にいいじゃん、と思うのですが、少なくともOculusのタイトルにおいては問題になるので、こちら、今後作る方は気にしておいた方が良いでしょう。
おわりに
前回、マシュマロを募集したので、何か届いたらそちらについてもお答えしようと思ったのですが、↓
一つも質問がなかったので、今回は簡単に、個人的にハマったところ、気になったところをまとめてみました。
まだまだ受け付けておりますので、何か聞いていただければ次回以降お答えしたいと思います。
では、次はついに売上を含めた、「雨漏り人生 – Rain Leak Lifeをリリースしてどうだったのか」といったお話が出来ればと思います。お楽しみに!
今日も雨漏れ!