# unityPractices02. Basic Practices ________________________________________ 初心者が気をつけるべきUnity開発11のポイント https://shibuya24.info/entry/unity-be-careful Unity 開発に関する 50 の Tips 〜ベストプラクティス〜(2016 Edition) https://shikaku-sh.hatenablog.com/entry/unity-tips-and-best-practices-2016 Unity Technologies Japanさんのプロフィール | ドクセル https://docswell.com/user/UnityJapan ________________________________________ ## 0. はじめに ________________________________________ 特定領域は以下の別ページに詳しく書いてあります。先に読むこと推奨 - unity01ex. プロファイルとメモリリーク - unity02. スクリプトとライフサイクル - unity02ex1. Prefab、MonoBehaviour、Object、UniTask - unity02ex2. ロギング - unity03. Unity UI - unity03ex. Unity UI Tips - unity03ex5. UI・3D全体の描画優先度 - unity06. アセット管理 - unity07. Test Code - unityPractices01. Directory & Scene ________________________________________ ## 1. 50のTips 2016 ________________________________________ ### 1.1. 50のTips 2016 ワークフロー 1. 最初にスケールを決定して、すべて同じスケールになるようにビルドする。以下一例 - 1unity unit = 1m - Canvas Scalerは720p - 3Dモデルの原点は足元 - UIのSelectable要素のNavigationは、活用するかしないか 2. すべてのシーンを実行できる状態にしておくこと - 全てのシーンは可能な限り独立させる - 検証用シーンやプロトタイプシーンは分離可能にして、後で簡単に消せるように 3. Gitを使う 4. ツール(もっぱら Unity 本体)をアップデートするときは、他の人も同時にする 5. コーディング資料 (your setup) をドキュメント化すること - フォルダ構造 - シーン構造 - Tag、Layer、Sorting Layer - ビルド方法 - 定型コードの規約 ________________________________________ ### 1.2. 50のTips 2016 コーディング、ヒエラルキー、クラス設計 ※ 先に以下の別ページを読んでください - unity02. スクリプトとライフサイクル - unity02ex1. Prefab、MonoBehaviour、Object、UniTask 上記にない内容 1. Assert を使うこと 2. 表示されるテキスト以外の文字列は使用しない - 文字列リテラルによる検索・ロード・呼び出し・リフレクションは理由がなければ避ける - GameObject.FindWithTag - Resources.Load - Invoke - SendMessage 3. ゲーム実行中に生成したオブジェクトがヒエラルキーをごちゃごちゃにしないこと 4. 正しい値として null を使用するときは具体的にして、可能な限りそれを避けること - nullをぼんやり使うことを避ける - 明確な意図なくnullを許容することを避ける 5. コルーチンを使うなら効率的な使い方を学ぶ - そもそも、コルーチンよりUniTask 6. 拡張メソッドを使用して構文をより簡便にする - 定型処理は拡張メソッドを積極的に用意する 7. 防御的な GetComponent の代替メソッドを使うこと - そもそも使わないで済むなら使わない 8. 同じことをするのに異なるイディオムを使うのは避ける - イベント登録 - Load - Instantiate - Addressable Assetの操作 - 非同期の書き方 - Web APIへのアクセス - UIが表示するデータの受け渡し方法 - 一覧系UIのUI制御 - 実行順の制御 - 描画順の制御 - Inアニメーション、Outアニメーションの制御 - 入力の制御 9. インスペクターで操作できるフィールドの実装方法を決めて、標準化する - publicフィールドを避ける 10. インターフェースをゲームロジックから分離すること - 表示とロジックを分離 (DDD) - 入力とロジックの分離 (DDD) 11. コンフィグ・ステート・記録を分離すること - config、currentState、prevStateどれであるか明確にすること 12. インデックスで関連づけた public 配列の使用を避けること - 変な配列の使い方を避ける - 同じ要素数の複数の配列あり、同じインデックスでやり取りするのは悪い兆候 ________________________________________ ### 1.3. 50のTips 2016 パターン 1. 便利に singleton を使うこと - ジェネリックSingletonクラスを用意しておくのは定番 2. state machine(パターン)を使用して、複数の振る舞い (state) をつくり、状態遷移をしてコードを実行すること 3. UnityEvent 型のフィールドを使用して、インスペクターに observer パターンを使えるようにしておくこと 4. observer パターンを使って、フィールドの値が変化したタイミングを検出する 5. ランダムなものとパターンのあるデータストリームには generator を使用すること ________________________________________ ### 1.4. 50のTips 2016 Prefab と Scriptable object ※ 先に以下の別ページを読んでください - unity02. スクリプトとライフサイクル - unity02ex1. Prefab、MonoBehaviour、Object、UniTask 上記にない内容 1. 共有するコンフィグ(設定)データには、Prefab の代わりに Scriptable object を使用すること 2. レベルを表すデータには、 ScriptableObject を使用すること 3. ScriptableObject を利用して、インスペクターの中で振る舞いを設定すること 4. 特殊化した Prefab に ScriptableObject を使用すること ________________________________________ ### 1.5. 50のTips 2016 デバッグ ※ 先に以下の別ページを読んでください - unity01ex. プロファイルとメモリリーク - unity02ex2. ロギング - unity07. Test Code 上記にない内容 1. Unity のテストツールを使用して、「スクラッチパッド」のテストをすること - アイディアの検証 - アルゴリズムやデータ構造のお試し実装 - サードパーティAPIの使用実験 2. スクリーンショットを撮影するためのショートカットを実装すること 3. テストを簡単にするためのデバッグオプションを実装すること - デバッグ機能(特定の状態のアンロックなど)を用意する 4. デバッグ用のショートカットキーの定数を定義して、ひとつのところにまとめておくこと ________________________________________ ### 1.6. パフォーマンス ※ 先に以下の別ページを読んでください - unity01ex. プロファイルとメモリリーク - unity03. Unity UI 上記にない内容 1. パフォーマンス上の理由からの設計・デザインに関する一般的なアドバイスには注意すること 2. 開発の初期段階からターゲットとなるデバイスで定期的にテストすること 3. プロファイラーを効果的に使用することで、パフォーマンスの問題の原因を調べる方法を学ぶこと 4. より正確なプロファイリングをするために、必要に応じてカスタムプロファイラを利用すること 5. パフォーマンスを強化する影響を測定すること 6. パフォーマンスのために読みにくいコードを書かないこと