「ありすのステージ」制作メモ

去年に続き、今年も夏コミとありす誕に向けて、PC/iOS用にゲームを作りました。

正確には完成はしておらず、まだ続いているプロジェクトなのですが、
自分自身音ゲーが好きで、もっと増えればいいのに〜と思っているので、何か役立ちそうな情報をメモとして残しておきます。


◆作ったゲームについて
ひとことで言うと、某スマホゲームのような音ゲーです。


○AppStore
https://itunes.apple.com/jp/app/suteji-for-arisu/id1145407264?l=ja


◆開発の期間と規模と進捗情報
開発期間は2015年12月〜2016年8月。
関わった人数は全部で12人。
下記は自分の作業(主にプログラムと企画)の時間の図です。
(発注時のやり取りなどは記録していないため、あまり正確ではないです。)
-作業の流れと時間の図-


◆スコープ
完成するか期間的・技術的に謎だったので、「やること」が完了していなかったら公開延期で進めていました。
○やること 3dダンス 音ゲー 最低限のオプション
○やらないこと android対応 親切なチュートリアル 初心者用の譜面 変拍子などの対応
○未定 シナリオ 口パク 表情 多機種対応(負荷対策)
蓋を開けてみると、13日ほど有休が使えたため、未定なことも色々組み込めました。


◆開発のこと
ゲームエンジンは、開発の初期はUnity5.4.0b12、最終的にはUnity5.4.0f3になりました。
参考にしたサイトや使用したアセットなどを箇条書きで紹介します。

○Unity+スマホで3Dゲーム開発最適化するための考え方
https://speakerdeck.com/cygames/unity-sumahode3dgemukai-fa-zui-shi-hua-surutamefalsekao-efang
去年の11月頃にあった勉強会の資料です。このゲームを作るきっかけの一つでもあります。

○ユニティちゃんライブステージ! -Candy Rock Star-
https://github.com/unity3d-jp/unitychan-crs
ユニティちゃんのライブステージにも大変お世話になりました。
・紙吹雪(Confetti)
・手から出るパーティクル(StarDust)
これらのシェーダーはライティングしないものに変更
・髪とスカートの骨物理(SpringCollider SpringManager SpringBone)
破綻しない程度に揺らす程度に抑えています(なので結構スカートにめり込みます)
・カメラ挙動(CameraSwitcher)
確率で次のカメラ位置にスムーズに移動するように変更
30度ルール(http://www.ediusworld.com/jp/pimopic/cat6_153.html)に当たる場合は必ず上が適用されて移動するように。
・瞬き(AutoBlink)
・輪郭線(CharaOutline)
輪郭線の色と厚み変更。
アウトラインは今回のモデルの場合、反転拡大だと上手く出なかったため、
1パス目の前に、法線方向に拡大して、反転せず、zも書かず、アウトラインを書いてから、通常描画→輪郭線描画を行っています。
・モーション(C86unitychan_002_SIM01_Final)
再生速度を1.13倍にして使用

○映像コンテンツの制作技術('16)
http://www.ouj.ac.jp/hp/kamoku/H28/kyouyou/C/joho/1570200.html
放送大学テレビ講座。カメラの動きでしてはいけないことなどの参考にしました。

○目線
基本カメラ追従するように。
ただし、視野角(120度)を超えると徐々に正面向くようにしています。

○ニコニ立体プレイヤー
http://3d.nicovideo.jp/works/td16467
開発用のモデルビューワーに使用。
モバイルで使えるように、スマホ用の入力を追加して使いました。
(3本指で平行移動、2本指で拡大縮小、1本指で回転)

○イメージエフェクト
・keijiro/KinoBloom (https://github.com/keijiro/KinoBloom)
・Standard Assets/DepthOfFieldDeprecated
・Standard Assets/CameraMotionBlur

○ポーズ
行った操作は以下。
TimeScaleを1から0に
BGMとループ音(ホールドの音)をPauseする。復帰時にUnPause。
物理で揺らしている物のUpdateを止めると同時に、再開時に大きい値が入らないようにTime.deltaTimeの値をClampしておく(下記)
var deltaTime = Mathf.Clamp(Time.deltaTime,1/90.0f,1/10.0f);
ノートの長押し判定の無効化(切れてしまわないようにする)

○曲との同期
曲の再生時間に合わせて、ノート生成/カメラの切り替え/ダンス/口パクをさせています。
同期タイミングは、カメラが別の角度にワープする瞬間。
(毎フレはなんか重い感じがしていて(未確認)、秒数固定にすると切替時にがくがくって見える事があるので)

○口パク
1.vsqx(ボカロの歌唱ファイル)の制作
2.発音タイミングと言葉のデータに変換
3.言葉によって、先行発音の口と伸ばす時の口でアニメーション
2のタイミングと言葉のデータはこんな感じ
new MusicAction(VsqTiming(3120),()=>{Lyric("ゆ");}),
new MusicAction(VsqTiming(3360),()=>{Lyric("め");}),
3の実装としては
アニメーションは例えば「め」ならすぐ「ん」の口の形にしてから、0.05秒後に「え」の口の形にするように登録して、0.1秒かけて「え」の形になるように補間。
曲にもよりますが、この曲の場合明示的に口を閉じる必要があったのは最後のみでした。
・口パク実装の過程で試したけどダメだったこと
-リップシンクプロ
試してみた所上手く行かず、音源をボカロに変更してもダメだったので諦めました。(多分英語じゃないときつそう)
https://www.assetstore.unity3d.com/jp/#!/content/32117

○譜面制作
iBMSC(http://hitkey.nekokan.dyndns.info/ibmsc_ja/)を使用。
1P側にノートの種類とタイミングを、2P側にどこから降ってくるかを記述。

○スライド判定
ノートとノートの間のポイントの2箇所で縦に線を引いて、その線を超えたかどうかで判定。
1つの入力(例:5番目を左スライド)につき、2回判定がある感じです。
実はこの判定がandroidでは上手く行かず、リリースができていない状態だったりします。

○判定
他のゲームと比べると、甘めに設定しています。
1f = (1/60)sとして
◆タップと遅めの判定
Excellent 3f+1ms
Great 5f+1ms
Good 7f+1ms
Bad 10f+1ms
◆スライドと長押しを離した時
Excellent 6f+1ms
Great 8f+1ms
Good 10f+1ms
Bad 13f+1ms
遅めは、早く判定しないと、次のノートが詰まります。(スマホ音ゲーはそこまで連打させないので、シビアではないですが)
長押しを離すやスライドは操作が複雑なので、若干長めに取ったほうが良さ気です。

○同時押しノート
同時押しのノートは、プレイヤーが同時に押したとしても、1フレームずれていることが多く同時押し感が損なわれる事があるので、最大2フレーム待ってから同時に鳴らしています。
意外に効果高いのでおすすめです。

○タップ音の音ズレ問題
AudioManagerのDSPBufferSizeをBest latencyに変更すると体感的には大丈夫。
ただし、割と高い確率でWindowsで音の再生がもたついていたので、その場合はBestlatency(256)をDefault(0)に戻す必要があります。

○UI
uGUIを使用。Tweenは後述のNGUIのTween。
ステージパートのノートは、Meshで描画(zを書くため)。
長押しと同時押しとスライドの線はLineRendererで描画。
長押しの色付けはParticleSystemで乗算の後加算で描画(2パス)。
ParticleSystemの利点としては長押しが重なった時とバーに近い時に綺麗に描画できますが、欠点としてオーバードローがひどく、機種によっては処理落ちするので、おすすめしません。
(手元のiPad miniのVeryLowで平均28FPSが長押し2個登場で10FPS位に)
-ParticleSystemで線を書くとオーバードローがひどいの図-


◯NGUI: Next-Gen UI
https://www.assetstore.unity3d.com/jp/#!/content/2413
Tweenのみの使用で、
UIの移動や、地面に映るライトの動きや、時計の針の動きに使用

○BezierCurves
https://www.assetstore.unity3d.com/jp/#!/content/11278
ノートの移動制御に利用

◯EasyMaskingTransition
https://www.assetstore.unity3d.com/jp/#!/content/8734
画面遷移用に改造して使用。

◯UnityCloudBuild
https://build.cloud.unity3d.com/
自動ビルド。プランはPro。
proプランにしてから、並列ビルドの待ち時間が気にならないレベルになったので、手元でビルドすることがなくなりました。
関係者に共有するときもリンク送るだけで楽です。
-ビルドの待ち時間とビルド時間の図-

(9個同時で、最大でも待ち時間が11分)

コミケのDLカードについて
・カード本体
使ったサービスは「Conca」
https://conca.cc/
0.3mmが200枚で1枚あたり167円。
7/21に発注、8/3着
・包装
シモジマ(https://www.shimojima.co.jp/)で購入
透明のPP袋:200枚で367円 (カードサイズで封なし。)
店員の方に聞いた所、カードサイズで封をする物は受注生産になるそうです。
・シリアル隠し用カード
同じくシモジマで音符の模様のConcaと同じ大きさのカードがあったので購入
200枚で3020円
・感想
+直前まで開発できる
+後日バグが有ってもサポートしやすい
+かさばらない 軽い
-高い
-配る時、何か嬉しくない

スマホ版開発
・電池消費
iPhone6sでクオリティ「Mid」だと1曲で電池が0-1%減る所、
イメージエフェクトが付き出す「High」からは、1曲で電池が3-5%ほど減るのでなんとかしたい所。(未解決)
・起動時間
Resourcesフォルダに数置かない
最初のシーンの前に、まっさらなシーンを用意して、そこからスタートにする。
Unityのスプラッシュスクリーンを使う場合、恐らくUnity5.3位から起動後に表示するようになったため、表示している間に最初のシーンを読みこめば、その分起動が早くなります。
・容量削減
bitcodeをONにすると、見かけ上は増えるけどDLとゲーム内サイズは小さくなりそうです。
ONにするためには何もしなくてokです。
-bitcodeの容量削減の効果(推定)の図-

(bitcode使用で、54MB/99.4MBが37.4MB/82MBに!)

・マーケットに表示される言語を日本語に
OnPostprocessBuild内で下記を記述。
var plist = new PlistDocument();
var plistFilePath = Path.Combine(path, "Info.plist");
plist.ReadFromFile(plistFilePath);
plist.root.SetString("CFBundleDevelopmentRegion","ja_JP");
plist.WriteToFile(plistFilePath);

◆マーケット公開
iOS審査について
8/23 02:47 提出
8/24 03:08 審査中(In Review)
8/24 05:17 リジェクト(4. 1 DESIGN: COPYCATS)
8/24 08:14 二次創作ガイドラインのURLを送って提出
8/25 01:41 リジェクト(4. 1 DESIGN: COPYCATS)
8/25 02:13 二次創作ガイドラインのURLを再度送る+タグを修正して提出
8/26 08:58 リジェクト(4. 1 DESIGN: COPYCATS)
8/26 16:50 二次創作ガイドラインから、該当箇所を抜粋して提出 & スクショに二次創作であることを明記して提出
8/27 00:05 審査中(In Review)
8/31 11:44 Apple Developerサポート(0120-933-388)経由でレビューチームに迅速な審査の要求
8/31 12:12 審査チームから電話(サンノゼから日本語)でリジェクト理由の説明
8/31 14:45 「ストア上」のアイコンとタイトルとスクリーンショットと動画からキャラ名とキャラクターを外したものを提出
8/31 23:25 審査中(In Review)
9/01 01:00 迅速な審査の要求が空振りしたメールが届く(既に審査が終わっていたから?)
9/01 07:58 審査通過

リジェクト(4. 1 DESIGN: COPYCATS)の理由
「Your app name, icons, and screenshots create a misleading association with ありす. It is not appropriate to use contents that are similar to third-party owned trademarks in your app name, icons, and screenshots.」

・審査早い。
・ユーザーを混乱させる恐れがあるので、ストアに載るタイトルやスクショや動画やアイコンやタグに、自身が権利を保有していないキャラ(パブリックドメインを除く)の名前や画像を使ってはいけないらしい。
・タイトルの場合、「ステージ for ありす」「ステージ ありす edition」のどちらかならOKとのこと。(先頭に「ありす」って付けるのがダメらしい)
・電話で二次創作ガイドラインにこう書いてあるのでキャラを使う権利はあると説明しても折れてくれなかったので、おそらくユニティちゃんとか、バンナムのカタログIPオープン化とかも同じ理由で引っかかりそう。
・4回同じ理由でリジェクトした場合、電話してるとのこと。
・迅速な審査の要求あんまり意味ないかも。ただ、放置されてそうな場合は電話で相談したほうが良いかも。(9/1の空振りメールを見る限り、審査チームからの電話とApple Developerサポートからの迅速な審査の要求は関連なさそう)

◯公開日について
AppStoreで公開日の予約ができるようになっていたのでそちらを利用しました。
9月4日の0時に公開予約をした結果、
0時20分 ストアのページが有効に
0時56分 検索に引っかかるように
なりました。

以上です。なにか一つでも参考になれば幸いです…!