オンゲキから学ぶ、初心者に優しい譜面データ

こんにちわ。ふみです。
この記事は ねおりん Advent Calendar 2018 の18日目の記事です。
昨日は まくむくみさんの 「みなさんお元気ですか。私は元気です。」でした。
なるほど…この画像の元ネタだったのですね。この画像が元ネタだった。

ちなみにこの記事は下記でお送りされております。



●自己紹介
ねおりんアドベントカレンダー…ということで
ねおりんさんとの繋がりとしては、
24時間でゲーム作るやつで一緒にゲーム作ったことがある、とかそんな繋がりです。
↓その時のゲーム すしあつめ 。作った後お寿司食べに行ったのも良い思い出。


個人的な趣味だと
ねおりんさんが所属している「ゆいゆい*カンパニー」社長の小倉唯さんが歌っている「回レ!雪月花」も収録されている オンゲキ にはまっています。

図1.オンゲキ-NETのSS
2700曲ほどプレイしてるらしい
あと柚子ちゃんかわいい

アドベントカレンダーのネタは何書いても良いと聞いているので、今回はオンゲキを遊んでて良く出来てるなーって思ってる事。特に譜面について書こうと思います。


●オンゲキについて
仕様の前に、このページを見ている人の中でオンゲキを遊んだことある人はあんまり多くないと思うんですね。なので先にゲームの紹介でも。
2018/7/26に稼働したリズムゲームで、ゲームセンターで遊ぶことが可能です。
操作は、左右3色のボタン/サイドのボタン/レバーで構成されています。
ノーツに対応する色のボタンを叩く、の他に、レバーを動かしてフリックノーツを取る/敵の弾を避ける/ベルを拾う/フィールド内に居続ける などが特徴的です。
最終的に相手のライフを削りきれれば勝ちで、ライフを削るためにデッキ編成したり強化したり良いスコアを取ったり…といった感じになります。(詳しくは 公式サイト が良さそう。)

・操作デバイスの図(公式サイトのあそびかたより引用)

https://ongeki.sega.jp/assets/img/pages/how_to_play/index/operation_controller.png


・ゲーム画面(プレイ動画)



●オンゲキの良いところ
全体的に、よく出来てると言った感想です。
メインのリズムゲーム内では、画面では難しそう、でもやってみると簡単っていうところが良いですね。物理デバイスなので遊んでいる感も大きいです。
続けるためのモチベーション、ゲームを遊ぶ最終的な目標としては、おそらく下記のどれかになると思います。そして、それぞれが干渉しづらい設計になっているのが遊びやすいと思っています。

  • 親密度(キャラ愛)
  • テクニカルスコア(色々な曲を遊ぶ)
  • イベント(ランキング)
  • 図鑑コンプ(ガチャ)
  • バトルスコア(強いデッキ)

実際はバトルスコアは全てを包括しており、他は独立していると言った感じです。
自分は親密度勢になるのですが、イベントの報酬として設定されていないので参加しなくてもよい、と言った感じで、自分の好きなように遊べて気が楽な感じです。
(他のゲームに例えると、ゲームでキャラを育てるために走りたくないイベントを走ったり、遊びたくないpvp系のイベントに参加が必要…とかそういうのがない。)
テクニカルスコア勢だと、他の要素は基本的に不要(ストーリー進めるためにある程度カードが必要なくらいだけどゲーム内で揃う)で、
イベント勢だと強いデッキがあれば有利にはなるけど基本どれだけ遊んだかの勝負になりそうなので他の要素はそこまでいらなさそう(推測)
図鑑勢はガチャ引いてゲーム内で交換するために走ったりすればよいのかな…。
バトルスコアも、理論値的には音ゲー力が試されるけど、強いデッキであることの比重が大きいので、親密度上げたりひたすらエンドジュエル収集したり、ガチャ引いたり…とかそんな感じなはず。

その他、細かいことを箇条書きにすると…

  • GP制によりプレイ時間の調節がしやすい(1曲でやめたり出来る)
  • 最強のデッキにはガチャ不要(ゲーム内で手に入るカードが強い)
  • ハイスピ設定が線形ではないので調整しやすい(1:2.7秒 5:1.3秒 12:0.68秒 19.5:0.47秒 SONIC:0.1秒)

と言ったところでしょうか。まだまだありそうだけど今思いついたことはこれくらい。


●初心者に優しい譜面データ
リズムゲームをプレイしたことのない人/リズムゲームを制作している方に薦めたいゲームで、
随所に難易度を下げる工夫が散りばめられているように感じます。

  • 難しい箇所にCR-TAP(CRITICAL-TAP:光っているノーツ)を配置している
  • 敵弾音やベル音に早いフレーズを当てることで、難易度を下げている
  • 長押しノーツが多いので、テクニカルスコアが高くなりやすい
  • 敵弾音やベル音がガイド音になっている
  • 敵弾は意識して避ける必要がほぼ無い(ノーツの上に移動していればベルを取りながら敵の弾は避けれるような配置がほとんど)
  • 操作が忙しい箇所は左右分業などの工夫によりカバーできる
  • レーンが可動式なことにより、認識難で難易度を上げられている

とは言え実例がないとよく分からない…って感じなので、動画とともにまとめてみました。

○難しい箇所にCR-TAPノーツを配置
CR-TAPノーツは光っているノーツのことで、だいたいのタイミングで叩けてれば最高評価のCritical Breakを貰えるノーツ。
・みんなHappy!! Masterより
さぁ元気を「出して」の跳ねている箇所がExTAPになっている。
(サイドタップは若干判定広いので、大抵ミスらない。)


・Dolphika Masterより
赤青交互連打地帯で4分間隔でCR-TAPを置くことによって、泊をつかみやすくしている。
動画だと分かりづらいのですが、CR-TAPは通常のノーツと違う音が鳴るので、音で泊を感じることが出来ます。
自分は完璧にできていないので説得力にかけるのですが、連打は タタタタ タタタタ タタタタ タタタタ…みたいな感じで区切りとかで考えて叩いたほうがリズムを刻みやすいとか。


・Everlasting Today Masterより
階段っぽい配置が続く箇所は同時押し的な感じでも取れるようにしてある


○ベル音に早いフレーズを当てることで、難易度を下げている
譜面制作において、このフレーズを演奏させたいけど、そうすると難易度上がりすぎてしまう…みたいなことがあるんですよね。
オンゲキにおいては、そういうフレーズにベル音を当てて解決しています。
また、適度に間引くということも可能になっています。
(タップさせる場合だと、間引かれると逆にリズムが取りづらくてやりづらい…とかで悩ましい問題が発生する)
・Master譜面
しゃらららららららん、にあわせてベルが配置されている。低難易度でも同じく


Basic(ここから3個音量大きめです)


Advanced (Basicより控えめ)


Expert(Basicより激しい)


○長押しノーツが多いので、テクニカルスコアが高くなりやすい
この曲では長押し(ホールド)ノーツが約46%(451/971)。
長押しは最高評価のCRITICAL BREAKしか出ないので、精度が不足していても安心。


○敵弾音やベル音がガイド音になっている
リズムゲームの難しいところとして、リズムが分からず叩けなくて、ゲーム外で上手くプレイ出来ている動画を見て覚えて来る、みたいなことがあるのですよね。
オンゲキではベルや敵弾音により正確なリズムをゲーム内で覚えられるようになっているので、ある程度この問題を解消できています。
・Cyberozar Masterより
長押し中に敵弾でリズムを教えた後、実際に叩くというステップが取られている


○敵弾は意識して避ける必要がほぼ無い
ノーツの上に移動していればベルを取りながら敵の弾は避けれるような配置がほとんど
・AiNov Masterより
ノーツの上に居れば弾を避けられている作りになっている
※高難易度な譜面(最高14な中13+)なので、ちょっと先に行くと裏切られたりはしますが


・YURUSHITE Masterより
フリックとベルを取ろうとすると自動的に敵弾を回避するように配置されている。
多分フリックとベルがないと回避が困難になり難易度上がりそう。


○操作が忙しい箇所は左右分業/専業などの工夫によりカバーできる
リズムゲームでよくあるのが、縦連力が限界を迎えてこのゲームは無理だ…ってなること。
オンゲキでは左右にボタンが付いており交互で連打したり、片手で両手分操作したりなどの工夫でカバーできるので、望みがある。
・YURUSHITE Masterより
同じ色の縦連は、左右交互に押すと取りやすいよ、ということを段階的に示してくれている(取れるとは言っていない)


○レーンが可動式なことにより、認識難で難易度を上げられている
Everlasting Today Masterのラストとかが代表的で、
同じレーンに青と赤が重なってよく分からない感じになっています。



●そのほかプレイ中に効果的だと思う箇所

  • 敵弾音でのアクセント
  • ボス登場ボイス

○敵弾音でのアクセント
みんなHappy!! では「Say Yeah!!」というフレーズが3回存在しているのですが、
その中でも最後の「Say Yeah!!」では敵弾音を鳴らすことによって、最後にふさわしい盛り上がり方を演出しています。
・最後の「Say Yeah!!」(2分26秒)


・1回目と2回目(1分24秒と1分38秒)



○ボス登場ボイス(1分50秒~)
もはや曲の一部と感じている人が多そうなボス登場ボイス。
ここからボスが登場するから倒してねーという意味の他に、中だるみ防止という重要な機能があると思っています。
オンゲキの曲はたいてい2分30秒程になるのですが、これくらいの長さとなるとプレイ中にまだ終わらないのかな…って思う事もあると思います。
そんな中、ボス登場という一区切り(+大抵譜面は落ち着いている)
ということをボイスで知らせてあげることによって、後半スタート!という切り替えもありかなり機能しているように思えます。



●おわりに
本当はこんなに書く予定はなかった。
でも、調べてるうちにいろいろな工夫が見えて、改めて良く出来てるなと再確認。
そんなオンゲキは お近くのゲームセンター でプレイ出来ます。
興味を持っていただき、何かの機会で遊んでいただければ記事を書いた身としては嬉しいです!

明日は おっしゅ さんです。どんなお話か楽しみですね!
そして同じく明日はオンゲキCD第2弾 ONGEKI Vocal Collection 02 の発売日でもあります。ぜひ購入しましょうっ!

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

去年に続き、今年も夏コミとありす誕に向けて、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分 検索に引っかかるように
なりました。

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


DQB 1章メルキド編 RTAメモ 【ドラゴンクエストビルダーズ】


普段はRTAしないのですが、このゲームのRTAは面白そうだと思ったので走ってみました。
ボス戦で死亡したり内容はかなりお見苦しいですが、走った時に見ていたメモを残します。


◆チャート
東に移動→キメラの羽根5→降りる→拠点に戻りながら、以下を回収
ロロンド救出
キノコ3
モモガキの実5
ふとい枝14〜16
じょうぶな草15〜20
あおい油3
たき火2
わらの扉1
わらのベッド1
箱1
土77~83

たいまつ、こんぼう、キメラのつばさを制作して石の作業台を壊す
拠点で旗を立てる
個室を直す、たいまつ立てる
ピリンに話しかける
石の作業台を個室の近くに設置する
わらベッド1、収納箱3、扉3制作
ピリンの図作成、収納箱に青いエキスと図とももがきの実と枝と草をしまう
料理用たきび制作
中くらいの所に、かべ、料理用たき火、扉、収納箱 焼きキノコ3個作成
狭い所にかべ、扉と松明
広い所に、かべ、扉、松明、収納箱、箱を設置
ロロンドにキノコ渡す
バトル(隙間時間に足りなければ「じょうぶな草5、ふとい枝6、土6」になるまで回収)

●青扉
青扉を拠点のそばに→ボロ布1個ならロロンドに1回、2個以上なら話しかけずにワープ
ツタ3、あかい油1回収しておおきづち
じょうぶな草が足りなければ現地調達してわら床作成→補修。要らないもの捨てて話しかける
おおきづち2,たびびとのふく 作成
銅6、石炭4、石8採取
炉→銅インゴ1→どうのつるぎ
木材8、毛皮3採取
兵士救出(土2個載せて、そこから攻撃)→キメラで拠点へ
ツボ→大倉庫制作
バトル開始→大倉庫を広い部屋に置く
回転斬りクエ受ける
青扉→宝箱、壁掛け松明2回収する
必殺技クエ→キメラで拠点→城に行きながら、以下回収
ぼろ布3
あかい油4
木材12
銅6
石炭22(最低3~15)
ツタ4
粘土5
小麦10
城では、石垣と罠、タペストリ2、貴族のいす1、柱4、貴族ベッド、いす、ドレッサー、宝箱を回収する
戻ったら広い部屋に、すべての家具を置く
レベル上がるので扉壊してもう一回設置する
石垣積みの壁とトゲ罠3個作る。レンガ1個作る
エスト進めていく。石のいすは作れるだけ作ってok

●赤扉
うさぎから生肉1を回収しながら、
料理人→鉄24→ゆきのふ救出
石炭を青扉で22にしていなかったら、ここで19個以上にしておく
キメラで街戻る。鉄の剣とか作る
ピラミッドに行く
薬の葉6
かがり火6、石の階段4、カベカケ松明2、火吹き像2回収→キメラ
高台制作
炉作成→はがねインゴット3個→はがね剣、かなづち
はがねのまもり制作
順序は、バリケード→トゲ罠→石像→扉→土→石垣にする→カベカケ松明

●緑扉
オリハルコン10
ばくだんいし6
ゴーレムの石3
魔法の玉を作る時に、薬草作る
4連戦の前に、料理の収納箱を確認して、あればウサギステーキを取って雑魚に使う

●ボス
まほうの玉はボスの左足元に置くと安定する







ゲーム作ってみたので、参考になりそうなデータ公開します。

夏コミという締め切りに追われながら、PC/Android/iOS用に1本ゲームを作りました。

いろいろな理由でゲームを作っていたのですが、
その理由の一つとして、今後のゲーム作りに参考になりそうなデータが取れればと、作業履歴をメモっていたので公開します。

◆作ったゲームについて
「マカロン」となぞって繋ぐパズルゲームです。advパートもあります。(advのボリュームは背景3 キャラ1 衣装3 表情差分12 テキスト量は800文字程度 フルボイス)

AppStore
https://itunes.apple.com/jp/app/arisunomakaron/id1030357536?l=ja
GooglePlay
https://play.google.com/store/apps/details?id=li.fumi.macaron


◆開発の期間と規模と進捗状況
開発期間は2015年1月〜2015年8月までで、トータルの規模はおよそ400時間(2.5人月)。
企画開発は自分一人で、イラストとボイスは発注する形式でした。
当初の予定では継続してコツコツと…と考えていたものの、
コミケ受からなかったらどうしようとかやっぱりそういうことは思うわけで、
振り返ってみると途中の何もしてない感がひどく、
結果手が付けられていない夏休みの宿題状態になりました。


※このグラフは自分担当分のみです


◆分野別の作業時間
今回のゲームではこういう感じになりました。
カウント方法は作業開始時と終了時に時間をメモというアナログな方法で、
自分以外の作業時間は後日ヒアリングした時間を追加してます。

分野時間割合
企画54.5h13.65%
デザイン114.5h28.68%
サウンド58.5h14.65%
プログラム125.3h31.37%
その他46.5h11.65%
合計399.3h100.00%

※企画:主にGoogleSpreedSheetで作業している時。企画作成 シナリオ作成 素材管理シート作成 発注書作成 資料集めなど
デザイン:主にPhotoshopやIllstratorで作業している時。仮UI作成や本画像作成など
サウンド:主にLogicやAudacityサウンド作成/加工、ボイス収録時。se bgm voiceなど
プログラム:主にUnityで作業している時。バランス調整も含まれる。
その他:webサイト作成 CI環境整備 動画撮影 マーケット申請など

プログラムの比率もう少し高いかな?と考えていたものの、案外違うみたいで全体の30%ほどでした。ただ、これは他の分野が苦手で時間がかかっていただけかもしれません。


◆開発のこと
ゲームエンジンはUnity5.1を使用しました。
特に思ったことやアセットなど紹介します。

◯描画
主にuGUI、時々2DSpriteとParticleSystemを使用しています。

◯NGUI: Next-Gen UI
https://www.assetstore.unity3d.com/jp/#!/content/2413
DOTweenなどいろいろ試しましたが、最終的にアニメーションはNGUIのTweenを使っています。(リザルトのマカロンが降ってくる箇所は物理演算)
uGUIへのカラー対応はTweenAlpha.csにImageとTextとCanvasGroupについて追記して使いました。

◯宴(Unity Text Adventure Game Engine)
https://www.assetstore.unity3d.com/jp/#!/content/15905
advパートで使用。
表情差分やキャラの前に背景置く場合は以下の様な感じでLayer重ねて対応しました。(表情については、別のやり方があるかもしれません。)

LayerNameTypeXYOrder
背景Bg000
キャラCharacter0-300100
表情Character0193101
背景(前面)Sprite0-502200

◯Particle Playground
https://www.assetstore.unity3d.com/jp/#!/content/13325
テクスチャをエフェクト類に使用。機能そのものは使っていません。

◯UniRx
https://www.assetstore.unity3d.com/jp/#!/content/17276
ボタン制御に使用。

◯EasyMaskingTransition
https://www.assetstore.unity3d.com/jp/#!/content/8734
画面遷移のエフェクトに使用。とても使いやすくて便利です。

◯MusicEngine
https://github.com/geekdrums/MusicEngine
音楽と演出の同期に使用。
Actionを渡して指定したタイミングで実行する機能を追加して使っています。
Music.csのUpdateでそのアクション行うようにしていて、最大1/60秒程度タイミングが変わるので、シビアなものはデータ側で対応しています。
(例えばパズル中のメロディーやリザルトのメロディーは遅れて鳴ってもある程度許容できるように、ディレイ掛かった音にしてあります。)

◯VisualStudio+ReSharper
https://www.visualstudio.com/
http://samuraism.com/products/jetbrains/resharper
MacBookProで開発していたので、最初はVisualStudioCodeを使っていましたが、
最終的にPalallelsで起動のVisualStudio+ReSharperに落ち着きました。
若干動作重いのと外部で作ったファイルの認識にVS再起動が必要だったりでめんどくさかったですが、ReShaerperがそれを上回る便利さを提供してくれておすすめです。

◯Bitbucket
https://bitbucket.org/
gitのホスティングサービス。
一人で開発なので、主な役割はデータのバックアップとUnityCloudBuildとの中継役。

◯UnityCloudBuild
https://build.cloud.unity3d.com/
自動ビルド。プランはFree。
ビルドエラーが出たときはクリーンビルドを選ぶとだいたい直ります。
webplayer版で現状を関係者に共有したり、
平日夜開発してプッシュ→翌朝ダウンロードして電車内でデバッグしたりなど、時間節約にかなり便利でした。

スマホ版開発
主に行ったことはシーンロード時間の短縮と音ズレ問題の解決。
シーンロード時間はサウンドの読み込み設定をCompressd In Memoryに変更、
音ズレに関しては、AudioClipのプリロードと
m_DSPBufferSizeを0から256とかに変更するとそれなりに効果があったように思えました。


◆マーケット公開
iOS審査について
8/14 申請
8/22 メタデータリジェクト(=>当日再申請)
8/29 通過
メタデータリジェクトの理由は、審査のためにアプリ内に含まれる全ての画像をくれとのことだったので、zipでアップロードしたら通りました。(それでも審査入るまで遅くて9/4に公開できるかドキドキでした。)

◯公開日について
iOSは9/4の0時1分に公開ボタンを押して、公開日は9/4
Androidも同時刻に公開ボタンを押して、公開日は9/3
Androidの場合に表示の日付を合わせたいなら日本時間ではなくどこかの時間の0時に合わせる必要がありそうです。


以上です。なにか一つでもゲーム開発の参考になれば幸いです。

【Unity】Modelインポート時のシェーダーを自動で設定する

前回の続きです。

なんで2年以上も前の記事の続きを書いているかというと、エディタ拡張で「これどうすればいいんだろう。何かサンプル無いかなー」って検索したら、自分の記事が出てきて存在を思い出したからです(笑)

さて、今回困っていたことは、タイトルの通り「Modelインポート時のシェーダーを自動で設定する」です。
結論から書くと、OnAssignMaterialModel(モデルのマテリアルを割り当てる時に呼ばれる関数)内で変更すると良いみたいです。

下の例では以下の様な判定でシェーダーを変更しています。
  • インポートするモデルのパスにcharacterがあり、テクスチャの名前にeffectがある=>モバイル用加算シェーダー
  • インポートするモデルのパスにcharacterがあり、テクスチャの名前にeffectがない=>モバイル用ディフューズシェーダー
  • インポートするモデルのパスにcharacterがない=>ライトを使わないシェーダー
他には以下のことも行っています。
  • モデルと同じ階層にマテリアルを保存(何もしない場合はMaterialフォルダが作られ、その下に保存されます。)
  • パスにcharacterがない場合はアニメーションをインポートしない
補足事項としては、OnAssignMaterialModel内で全く変更したくない場合はnullをreturnするとokです。

CustomModelImporter.cs

using UnityEngine;
using UnityEditor;
using System.IO;

public sealed class CustomModelImporter : AssetPostprocessor
{
//Postprocessorの制御順(今回は使っていないのでいらない気がしています)
public override int GetPostprocessOrder()
{
return 0;
}

//インポート前の処理
void OnPreprocessModel()
{
//パスにcharacterが入っていなければ何もしない
if(!assetPath.Contains("character")) return;
var modelImporter = assetImporter as ModelImporter;
//アニメーションをインポートしない
modelImporter.importAnimation = false;
//アニメーションタイプを無しにする
modelImporter.animationType = ModelImporterAnimationType.None;
}

//material
//モデルから生成したマテリアル(データとしては保存されていません)
//renderer
//このパラメータの使い方分かってません…!
//戻り値
//設定するmaterialです。nullならUnityがデフォルトのマテリアル検索/生成メソッドを使用してマテリアルを割り当てます。
Material OnAssignMaterialModel(Material material,Renderer renderer)
{
//テクスチャの名前
string textureName = material.mainTexture.name;
//作成して保存するマテリアルのパス
string materialPath = string.Format("{0}/{1}.mat",Path.GetDirectoryName(assetPath),textureName);

Debug.Log("assetPath:"+assetPath);
Debug.Log("textureName:"+material.mainTexture.name);
Debug.Log("materialPath:"+materialPath);

//パスとテクスチャの名前によって、マテリアルを切り替える
//パスにcharacterという文字が含まれていたら
if(assetPath.Contains("character"))
{
//テクスチャにeffectという文字が含まれていたら
if(textureName.Contains("effect"))
{
//モバイル用加算シェーダーに変更する
material.shader = Shader.Find("Mobile/Particles/Additive");
}
else
{
//モバイル用ディフューズシェーダーに変更する
material.shader = Shader.Find("Mobile/Diffuse");
}
}
else
{
//ライトを使わないシェーダーに変更する
material.shader = Shader.Find("Unlit/Texture");
}
//シェーダーを変更したマテリアルをmaterialPathに保存する
AssetDatabase.CreateAsset(material, materialPath);Debug.Log(string.Format("CustomModelImporterの処理により、以下の場所に[{1}]シェーダーのマテリアルを作成しました。\n{0}",materialPath,material.shader.name));
return material;
}
}


もし何か、間違っている箇所とかあったら教えていただけると助かります!
(あとニコニコブロマガに綺麗にソースコード貼る方法あれば知りたいです)

========================================
2016/3/5追記
テクスチャが剥がれると報告を受けて、下記サイトの用に行うと良いと言う回避策を頂きました。

Unityで拡張子を変換するエディタ拡張
http://qiita.com/naotaro0123/items/6abe82ae0f827f675177

以下、全てのインポートされたマテリアルのシェーダーをUnlit/Textureに変更するスクリプトになります。

CustomAssetPostprocessor.cs
using UnityEngine;
using UnityEditor;
using System.IO;
using System.Collections;

public class CustomAssetPostprocessor : AssetPostprocessor {
/// <summary>
/// あらゆる種類の任意の数のアセットがインポートが完了したときに呼ばれる処理
/// </summary>
/// <param name="importedAssets"> インポートされたアセットのファイルパス。 </param>
/// <param name="deletedAssets"> 削除されたアセットのファイルパス。 </param>
/// <param name="movedAssets"> 移動されたアセットのファイルパス。 </param>
/// <param name="movedFromPath"> 移動されたアセットの移動前のファイルパス。 </param>
static void OnPostprocessAllAssets
(string importedAssets, string deletedAssets,
string movedAssets, string movedFromPath)
{
// アセットがインポートされた場合
foreach(string asset in importedAssets){
// 拡張子のみ取得
string type = Path.GetExtension(asset);

if(type == ".mat"){
// マテリアルを取得
var material = AssetDatabase.LoadAssetAtPath<Material>(asset);
// シェーダーをUnlit/Textureに変更
material.shader = Shader.Find("Unlit/Texture");
}
}
}
}


【Unity】AssetImporterを使ってみた。

こちらのスライドの13pを参考に、オーディオのアセットインポーターを使ってみました。

エディタ拡張って、検索しても実際に使っているコードが出てこなくて、「情報少ないし難しそう」となかなか手が出にくく、私も敬遠していたのですが、試しに使ってみたら少しの手間で結構な見返りが得られたので、是非使ってみて下さい!

今回はファイルのパスの何処かに"voice"という文字列があったら、
oggやmp3などの圧縮をする。
・3dサウンドを使わない(2dにする)
・96kbpsにする
という設定にしてあります。

【こんな感じの設定が、自動でされます】



下記の罫線の間のコードを、CustomImporter.csという名前で保存し、
Editorフォルダに入れると、それ以降のインポートしたファイルに適用されます。
(見難くてごめんなさい。インデントを入れたかったのですが、行頭の半角スペースや、tabが使えないみたいです…!)

【CustomImporter.csの配置場所です。】



CustomImporter.cs

using UnityEngine;
using UnityEditor;

public sealed class CustomImporter : AssetPostprocessor
{
public override int GetPostprocessOrder()
{
return 0;
}

void OnPreprocessAudio()
{
if(assetPath.Contains("voice"))
{
var audioImporter = assetImporter as AudioImporter;
audioImporter.format = AudioImporterFormat.Compressed;
audioImporter.threeD = false; //2d sound
audioImporter.compressionBitrate = 96000; //96kbps
}
}
}



もし何か間違えなどあれば、指摘していただけると助かります!