【Unity】効率よく開発するためのTips

# 基本
* [🔎検索力](https://www.google.co.jp/search?q=%E6%A4%9C%E7%B4%A2%E5%8A%9B)
* [🛒AssetStore](https://assetstore.unity.com)
* [🚀ショートカットキー](https://www.google.co.jp/search?q=%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E3%82%AD%E3%83%BC)
* [🤖インテリセンス](https://www.google.com/search?q=unity+%E3%82%A4%E3%83%B3%E3%83%86%E3%83%AA%E3%82%BB%E3%83%B3%E3%82%B9)
* [📝コードスニペット](https://www.google.com/search?q=C%23+%E3%82%B3%E3%83%BC%E3%83%89%E3%82%B9%E3%83%8B%E3%83%9A%E3%83%83%E3%83%88)
* [🔤プログラミングフォント](https://www.google.com/search?q=%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%83%95%E3%82%A9%E3%83%B3%E3%83%88)
* [🛠️拡張機能](https://www.google.com/search?q=visual+studio+%E6%8B%A1%E5%BC%B5%E6%A9%9F%E8%83%BD+%E3%81%8A%E3%81%99%E3%81%99%E3%82%81)
* [🖥️SOLID原則](https://www.google.com/search?q=SOLID%E5%8E%9F%E5%89%87)

# Unity

## 🔰基本


* [📦プレハブバリアント](https://docs.unity3d.com/ja/current/Manual/PrefabVariants.html)
* [🧙DoTween](https://assetstore.unity.com/packages/tools/animation/dotween-hotween-v2-27676)
* [✨Attribute](https://www.google.com/search?q=unity+attribute)
* [📦UnityPackage](https://www.google.com/search?q=unitypackage)

## [🚀Unityのショートカットキー](https://www.google.com/search?q=unity+%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E3%82%AD%E3%83%BC)

よく使うショートカットキーを紹介します。

**全般**

|ショートカットキー|内容|
|-|-|
|Ctrl + D|複製|
|Ctrl + Shift + C|コンソール表示|
|Shift + Space またはタブをダブルクリック|全画面表示|
|Ctrl + F / Ctrl + K|検索 / 広範囲に検索|
|Ctrl + P|再生 / 停止|
|Ctrl + Shift + P|一時停止|
|Alt + フォルダやオブジェクトをクリック|全ての階層を展開/全ての階層を折りたたむ|

**Sceneビュー**

|ショートカットキー|内容|
|-|-|
|右クリック + WASD|視点を前後左右に移動|
|右クリック + Shift + WASD|視点を前後左右に素早く移動|
|QWERTY|ツールの切り替え|
|Ctrl + 移動 / 回転 / 拡大|グリッドしながら移動 / 回転 / 拡大|

Edit -> ShortCuts からショートカットキーの閲覧と編集が可能です。

## [🎛️プリセット](https://www.google.com/search?q=Unity+preset)

プリセットとは、コンポーネントの設定値を保存して再利用可能にする機能です。コンポーネント設定の手間が省け、ミスも防げます。
インスペクタの右上にある、調整バーのアイコンをクリックすると、コンポーネントの値をプリセットとして読み込んだり書き出したりできます。プリセットは画像や音声のインポート設定、Project Settings の設定値など、色々なもので作れます。
![Inspector.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307985/ea6bdd7b-abf3-0b27-328c-50b1228332f3.png)
画像をインポートした時やコンポーネントを追加した時に、プリセットを自動で適応したい場合は、プリセットのインスペクタにある「Add to 〇〇 default」ボタンをクリックして下さい。プリセットが Project Settings -> Preset Manager に追加されます。
![AudioSourcePreset.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307985/34c203d4-25c4-8783-4ff4-dd02446c4144.png)

## [🛠️Editor拡張](https://www.google.com/search?q=Unity+Editor%E6%8B%A1%E5%BC%B5)
Unity Editor はスクリプトでカスタマイズできます。Unity Editor を不便に感じたときは、Editor拡張をネットで検索してみてください。色々なEditor拡張が配布されています。
[ContextMenu](https://www.google.com/search?q=unity+ContextMenu) や [MenuItem](https://www.google.com/search?q=unity+MenuItem)、[OnValidate()](https://www.google.com/search?q=unity+OnValidate) といったEditor拡張であれば簡単に作れます。

## [⏯️Script Changes While Playing](https://docs.unity3d.com/Manual/Preferences.html)
Editorでゲーム実行中にスクリプトを変更した際の挙動を変えて、無駄な待ち時間を減らせます。
変更は Unity -> Preferences -> General -> Script Changes While Playing から行えます。

|項目|内容|
|-|-|
|Recompile And Continue Playing|コンパイル後、ゲームを再開します<br>（大抵、エラーが出てまともに動きません）|
|Recompile After Finished Playing|ゲーム終了後、コンパイルします|
|Stop Playing And Recompile|自動でゲームを終了して、コンパイルします|

## [🆕Create Objects at Origin](https://www.google.com/search?q=Create+Objects+at+Origin)
Create Objects at Origin を有効にすると、Editorでゲームオブジェクトを新規作成した際の座標を必ず(0, 0, 0)にできます。
使う際は Edit -> Preferences -> Scene View -> Create Objects at Origin から行えます。

# ⚠️注意が必要なもの
Editor の挙動に影響が出るため、扱う際は機能を理解して忘れないようにしましょう。

## [⏩Enter Play Mode Settings](https://www.google.co.jp/search?q=Unity+Enter+Play+Mode+Settings)
Editor上でゲームの再生をするときに行われる初期化処理を省略して、ゲームの起動時間を圧倒的に短縮します。
使う際は Edit -> Project Settings -> Editor -> Enter Play Mode Settings -> Enter Play Mode Options を有効にして下さい（public な変数が自動で初期化されなくなる等の副作用があるので注意）。

## [🔁Auto Refrech](https://docs.unity3d.com/current/Documentation/Manual/Preferences.html)
ファイルのインポートや変更後のリフレッシュ処理を手動化する事で、望まない処理待ちを防げます。
使う際は Edit -> Preferences -> Asset Pipeline -> Auto Refresh を無効にして下さい。手動のリフレッシュ処理は Ctri + R で行えます。
[エディタ再生前にリフレッシュするスクリプト](https://osdn.net/users/kudou_slot/pastebin/6070)を追加すれば、リフレッシュ忘れを防げます。

## [🔒CompileLocker](https://qiita.com/su10/items/c494fb3c2b735c79887f)
スクリプト書き換え後のコンパイル処理を手動化する事で、望まない処理待ちを防げます。
Auto Refresh を無効にする必要があります。

https://qiita.com/su10/items/c494fb3c2b735c79887f

CompileLocker には、ショートカットキーの重複問題があります。ショートカットの変更は Editor -> ShortCuts から行える他、スクリプトから直接変更も可能です。私は Compile に「#&c (Shift + Alt + c)」、ForceCompile に「%#&c (Ctrl + Shift + Alt + c)」を割り当てています。

CompileLocker クラスに追加する事で便利になるコードを紹介します。

``` C#
    // コンパイル忘れ防止
    [InitializeOnLoadMethod]
    private static void InitReloadAssemblies()
    {
        EditorApplication.playModeStateChanged += (PlayModeStateChange state) =>
        {
            if (state == PlayModeStateChange.ExitingEditMode) ReloadAssemblies();
        };
    }
    //コンパイル後に再生
    [MenuItem(MenuItemPath + "Compile And Play #&p", false)]
    private static void CompileAndPlay()
    {
        ReloadAssemblies();
        EditorApplication.isPlaying = true;
    }
```

## [🗂️Assembly Definition](https://docs.unity3d.com/ja/current/Manual/ScriptCompilationAssemblyDefinitionFiles.html)

Assembly Definition（asmdef）とは、プログラムのコンパイル範囲を区切って、コンパイル処理を削減する機能です。大規模プロジェクトやライブラリ向けの機能です。
asmdef の作成は、Project ビューにあるフォルダを右クリック -> Create -> Assembly Definition から行えます。
asmdef はアセンデフと読みます（非公式）。

**詳細**

* asmdef 以下の階層にあるスクリプトは、その asmdef に属します。
* asmdef に属したスクリプトは、asmdef に属していないスクリプトを参照できません。
* Auto Referenced を無効にすると、コンパイル処理から除外されますが、asmdef に属していないスクリプトが参照できなくなります。
* Auto Referenced を有効にすると、常にコンパイル処理に含まれるようになりますが、asmdef に属していないスクリプトが参照できるようになります。
* Assembly Definition References に参照したい asmdef を追加すれば、参照可能になります。

# 小手先テクニック

## [🏃ゲームスピード](https://www.google.com/search?q=Unity+Time.scale)
キー入力でゲームスピードを変えられる便利コンポーネントを用意すれば、テストプレイにかかる時間を短縮できます。
![TimeDebugger.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307985/2bf2f37b-c6e9-d6e5-f107-9ac0b6c0dfe0.png)

## 🧰便利コンポーネント
振動するだけのコンポーネントや、シーン移動するだけのコンポーネントなどを作っておくと、単純な実装箇所を楽に実装できます。
![Utility Component.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307985/22c0ef24-9f8a-519f-3cf6-93943a24a3bd.png)![SimpleHapicVibration.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307985/1450fdf1-fa6d-9ec5-05d7-25a1fe16f750.png)

## 📂ディレクトリ
画像のようなフォルダを用意して、新規プロジェクトにD&Dすれば、フォルダを生成する手間が減らせます。
![Directory Template.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307985/3e4721cb-919e-5431-1dc8-0cb1563b521d.png)

## ⚙️初期値変更

* Tools -> Demigiant -> DOTween Utility Panel から、DoTween のデフォルトの Easing や LoopType を変更できます。
* Project Settings -> TextMeshPro -> Settings から、TextMeshPro 生成時のフォントやサイズを変更できます（Preset でも可）。

## ⌨️Visual Studio の便利機能

|機能|使い方|
|-|-|
|メソッドなどを折り畳む・展開する|Ctrl + M, Ctrl + M|
|メソッドなどを全て折り畳む・展開する|Ctrl + M, Ctrl + L|
|クイックアクションとリファクタリング|右クリック, クイックアクションとリファクタリング|
|変数やメソッドの定義へ移動|右クリック, 定義へ移動|
|変数やメソッドの実装に移動|右クリック, 実装に移動|
|変数やメソッドのすべての参照を検索|右クリック, 全ての参照を検索|
|ブックマークの追加・削除|Ctrl + K, Ctrl + K|
|ブックマークウィンドウの表示|Ctrl + K, Ctrl + W|

定義へ移動 などはF12でも実行できますが、私は手を大きく動かすのが面倒なのでマウス操作で行っています。