賢く実装する Unity その2

色々状況も実装も変わったので1は消去しました。
Effective Unity とか欲しい。

Prefab の挙動を正しく知り、正しく使おう

 プレハブとは、ヒエラルキー上にあるオブジェクトをまるで切り取ったかのように状態保存し、使い回せる形にする Unity の要の機能である。使いこなせばとても便利だが、その一方で少々クセがあり、修羅場時にハマる原因となることも確か。正しく知り、正しく使うことがマスターアップ直前に焦らないための第一歩だと思う。

  • オブジェクトを Prefab 化すると、コンポーネントやそのパラメータ、オブジェクト構造や Transform などが保存される。
  • Prefab と結びついているオブジェクトの状態を変更し、Apply を押すと、元の Prefab にその状態が反映され、その Prefab を使った他のオブジェクトにもその状態が同期される。これはシーンもまたぐ。
  • Prefab を public の GameObject 変数などに代入して Instantiate すると、全く同じ複製がヒエラルキー上に生成される。
  • Prefab を中に含んだ Prefab は(現行バージョンでは)できない。

実際にぼくがゲームを作る上で心がけている運用は以下の通りである。

  • シングルトンはまとめて一つの Prefab にする。新しくシーンを作った時はそれをまずドラッグ&ドロップするだけで全てのセッティングが整う。
  • エフェクトや自機・敵機は全て Prefab 化し、ヒエラルキーには置かない。また、Instantiate するための変数はプロジェクトビューのみで Prefab 同士にて行う。
  • ヒエラルキー上に「浮いた値」の Prefab を作らない。浮いた値とは、元の Prefab に保存された値ではない値のことである。浮いた値は他のシーンに反映されないし、他のシーンで Prefab を更新すると自動で同期され消えてしまうので、バグの温床となる。ただし、デバッグや調整用途ではこの限りではない。また、シーンIDなどシーン毎に違う値を入れる必要がある場合も例外となる。
  • Prefab 上に「浮いた値」を極力作らない。この時の浮いた値とは、スクリプト側で設定された本来の初期値とは違う値である。これも、バグの原因になりうる。バリエーションなどもスクリプト上から制御すべきである。ただし Instantiate 用の参照やどうしても制御が困難なものはこの限りではない。
  • Prefab の仕様をスクリプト上から扱うことは C++ におけるポインタの利用と同程度の特殊さとなる。変数名には pf などの接頭詞をつけ、絶対に混同しないこと。

シーンが多くなっても、Prefab さえ上手く作ってあれば全く苦労することなく管理できるので、挙動をよく知っておくことが大事である。

ポストエフェクトの効果を知ろう

http://d.hatena.ne.jp/eiki_okuma/20141011/1413044179
これを参照のこと。また、必要に応じて改良できる程度の技量を有しておくと、取り回しが楽。(弄るくらいならシェーダプログラムもそんなに難しくはない!)

PC で動かす時に心がけたい点

  • クオリティ設定。初期状態では多すぎてユーザが混乱するので、絞った方が良い。また、「そこそこのPC」を持っているユーザは、動かなければクオリティを下げるが、動いたならクオリティを上げようとは思わない。デフォルトは自分の望むグラフィック水準にしておくこと(むしろ、最も良い設定がデフォルトでもいい)
  • クオリティマネージャ。ビルトインのクオリティ設定ではたかが知れているので、専用のクオリティマネージャを作って QualitySettings をスクリプト側で読もう。ポストエフェクトのオフやオブジェクトの非表示、Terrain のエラー精度などは特に有効な箇所である(そのくせ Unity は何もしてくれない)。
  • ビルトインの Input は使いにくい。自前でキーコンフィグを実装すべきだし、世の中には上下や左右が反転するゲームパッドがあることは知っておいて損がない。また、二つ目のスティックは取り回しが難しく、デフォルトだと常にどちらかの Axis が傾いてしまうものもあるようで、視点移動などを設定する場合は特に注意である。
  • 音量設定。全ての PC ユーザのオーディオ環境は嫌がらせのようにバラバラである。
  • PlayerPrefs は使わない。これはレジストリを汚すだけである。キー設定はどうしてもここに保存されるので、任意にレジストリをクリアするコマンドも用意しておくべき。
  • output.txt の存在。吐き出さないというチェックを入れない限り全てのログはここに出るので注意。また、差分生成ソフトでパッチを作る場合はこの txt を除いてから作らないと大ハマリする。

Asset Store は期待を裏切る

まず前提として、Asset Store の仕組みはすばらしいものであり、そこにある大半のAsset はあなたをゲーム制作において大いに助けてくれることだろう。
が、彼らは少なくない頻度で我々を裏切ってくることもあるので、その覚悟のために。

モデル
  • 大体の見た目はごまかせないので信頼性は高い。
  • ただし、ポリゴン数が多め。ローポリと書かれていたら3000polyかもしれない。勿論、ハイポリは10000polyを優に超えている。
  • モバイルや、背景の処理を出来る限り押さえたいゲームでは自前でリダクションする覚悟が必要。
  • 単品ではなくセットになっているものは、少なくとも同じ見た目を提供してくれるサンプルシーンが同梱されているので、ちょっと安心度はあがる。まあ、大抵一画面に1Mpolyくらい描画しているのだが。
テクスチャ
  • 見た通りのものが入っているが、その効用は実際に自分のゲームのシーンに入れてみるまでわからないのがネック。思ったよりしょぼかった、なども。
  • ノーマルマップが含まれているかそうでないかで大きくクオリティが変わるので注意。
Skybox
  • テクスチャと同じで、実際に入れてみるまで分からない。
  • 無限遠なのと分割されているせいで普通のテクスチャよりさらに分かりにくい。適用したら残念感に溢れていた、とか太陽の位置がおかしい、とか。解像度が低い、なんてものもある。
  • ただ、安いのでお得。一枚なら$2とかも。
エフェクト
  • ムラが大きい。エフェクトは一枚絵は良くても実際に動かすとショボい、という現象が多発するので、サンプルデモが付いていると安心。
  • ビルトインの機能で自由に編集できるので、単純な工数削減目的としてはベースがあるだけで大分助かる。
  • BISHAMONー!はやくきてくれー!
サウンド
  • Ready to Use が求められてるらしく、そんな感じのサウンドに溢れている。
  • 実はそんなに買ったことがないのでアレだが、セット売りのものは基本的に一つで一つのゲームを賄う、くらいの覚悟らしく、多分複数買うと音が大分ダブる。
  • 自由に利用できる音素材としては……驚くほど安い。$20 でフルセットとか。まともに買ったらその五倍から十倍はする。
  • マッチメイカァズよりは聞き覚え度が低いので併用するのも手か。でもやっぱり、自前で音を編集できる環境が欲しい所。
エディタ拡張 / スクリプト
  • 鬼門。良いものもあるし、良くないものもある。
  • 一見便利そうでもちょっとやりたいことと違ったり、痒い所に手が届かなかったり、余計なことをして Unity が不安定になったり。
  • サポートが英語なのも日本人には辛い所。そもそもサポート体制はあまり良くない(個人〜小規模企業なので当然)ので、依存してしまうのはちょっと怖い。
  • Unity のバージョンアップで容赦なく使えなくなるのも悩み所。
  • あと何より困るのは、拡張同士でよく衝突すること。
  • 軽いものなら、自作するのが一番。その一方で、個人レベルでは到底作れないような高機能なものもある。
  • 「Freeでも使えるクオリティの高い○○」系は素直に Pro 買ったほうがいいと思う。
シェーダ
  • 数は少なめだが、3D ゲームではよくあるシェーダを Unity に移植しているものなどは嬉しい。
  • 地雷もたまにあるし、Unity の仕様変更に対応できてない古いシェーダもあるので注意。
共通
  • アセット個別ページにあるユーザレビューは新しい順ではない。スクリプト等では必ず、「すべてのレビューを表示」で最新のレビューを見ること。動かなくなっている可能性がある。
  • レビューの星は、コメントしなくても付けられる。
  • 外国人のゲーム作りの思想はそもそも日本人と違うので、大勢の彼らが Awesome! とか言っててもクソなことはある。注意。

まとめ

去る三年前くらいの Unity を思えば大分闇が浄化されたと思うので、皆さんも正しく Unity を学んで光のゲームクリエイターになりましょう。