UnityのPresetの紹介

# UnityのPresetの紹介

---

## はじめに：
ゲーム開発ときに、プロジェクトによって、アセットの設定が多様と思います。（アセットImportとか、GameObjectのComponentのDefault設定など）、その設定タスクでは、基本は複雑ではないですが、やる時間がかかるし、同じ事を繰り返すとやる気がないとかの気持ちが生まれましたね、

その処理を便利化するため、Unityが[Preset]PresetというEditor機能を開発しました。

そのPresetの管理はEditorの[Preset Manager]Preset Managerで管理されます。

Presetに関して、ほとんどUnityのOfficalページに書いてありますが、この記事では実際に触ってみた記事として書いております。

---

## UnityのBuild inタイプのインポート設定をPresetとして保存する

普段ではAssetのインポート設定はコードAssetImporterを使って、設定をカスタマイズします。Presetを使ったら、そのコードを書かなくてもアセットのインポート設定をセットできます。更に、Presetはアセットなので、そのインポート設定のPresetをパッケージ化して、他のプロジェクトに持っていくことも可能です。

今回はPixel系のゲームの画像インポート設定で試してみました。

Pixel系なら、画像をインポートする際に、設定しなければならない項目があります：
![PixelTextureImportSetting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2156015/959103b6-e963-42ab-2c61-50c45c21373f.png)



**一般的な扱い方はEditorスクリプトで、PostProcessorで処理しますね。**

```csharp
using System.Linq;
using UnityEditor;
using UnityEngine;

namespace App.Editor.Presets {
    public class TextureImportPostProcess : AssetPostprocessor {
        public static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets,
            string[] movedFromAssetPaths) {

            var paths = importedAssets.Union(movedAssets);
            foreach (var p in paths) {
                var importer = (TextureImporter)AssetImporter.GetAtPath(p);
                var setting = new TextureImporterSettings();
                setting.spritePixelsPerUnit = 16;
                setting.spriteMeshType = SpriteMeshType.FullRect;
                importer.spriteImportMode = SpriteImportMode.Multiple;
                importer.wrapMode = TextureWrapMode.Clamp;
                importer.filterMode = FilterMode.Point;
                importer.SaveAndReimport();
            }
        }
    }
}
```

**Presetを仕様すると、コード１行も必要ないです！！！Σ(ﾟДﾟ)**

1. Presetを作成する：

| Step | 処理                                                                                                                                       |
|------|------------------------------------------------------------------------------------------------------------------------------------------|
| 1    | ンポートしたSpriteを選択して、上記のPixel系の設定セットする。Inspectorで、右上のところあるの調整アイコンにクリックするとPresetWindowが開けます<br>![OpenTextureImporterIcon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2156015/46fb3108-d68a-f138-62ba-31eadc8139b7.png)
    |
| 2    | 開かれたのWindowsにあるの[Save Current to...]ボタンをクリックして、[Preset]を保存する場所を選択する<br>![SaveCurrentPreset.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2156015/06e43417-f10d-1820-f577-b1fe5fc9298f.png)
 <br>ここまででは、Presetの作成が完了されました。 |


2. Presetを使う方法：

任意のSpriteに、Presetを適用する：

| Step | 処理                                                     |
|------|--------------------------------------------------------|
| 1    | Spriteを選択して、①と同じ手順で、Preset設定Windowを開きます。         |
| 2    | 適用したいPresetにダブルクリックすると設定が完了しました。![UsePreset.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2156015/c329e53c-9d30-ed23-e92a-ec2788ae91f5.png)
 |

デフォルトPresetを設定する：

| Step | 処理                                                     |
|------|--------------------------------------------------------|
| 1    | Presetアセットを選択する。Inspectorの上にあるの[Add to xxxImporter Default]ボタンをクリックすると設定が完了されます。この設定で今後、どのSpriteがインポートされるも設定されたPresetの設定を自動で適用されます。![AddPresetToDefault.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2156015/b464e414-1355-c25f-cdea-2a77485b718d.png)
|

---

## カストマイズコンポーネントのPresetをPresetとして保存する

Editor上の話、Componentの設定を再利用したいケースは絶対あると思います。例：
1. コーピー元オブジェクトとペースト先オブジェクトの構成が違う: Componentのメニューを開いて、UnityのCopy/Paste　Component Value(Paste As New Component)機能を使う。
2. コーピー元オブジェクトとペースト先オブジェクトの構成が同じ: GameObjectをPrefab化して、PrefabのNested Prefab機能を使う。

上記の①シナリオで、Presetが生まれる前に、もし設定物が多いなら、Componentをコーピーして、ペースト操作繰り返し、又はスクリプトで（MonoBehaviourのReset関数とか）設定しなければならないですね(~_~;)

やはりベストのやり方ではないですね。（もちろんPresetみたいなEditor拡張を書けよいですが、コストも発生しちゃいますね）

Presetを使いましたら、上記のシナリオが簡単で達成できます（コード１行も必要ない）：
   1. ComponentをPresetアセットとして保存する：
![SaveComponentPreset.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2156015/6ea8a8d6-919d-f49e-2629-0ca9980d5a8c.png)

   2. ComponentのPresetをDefaultとして設定します：
![AddComponentPresetToDefault.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2156015/7fabc0d8-f928-3890-9d55-6f6a83ab136f.png)


上記の設定で完了しました。これから、GameObjectにPhysicsObjectというComponentを追加しましたら、上記のPresetが自動で適用されます。これで、開発が早くなりましたね。

___

## Preset Manager

Preset ManagerはプロジェクトのPresetを全部管理しています。

Preset ManagerはEdit > Project Setting > Preset Managerに置いてあります。

![PresetManager.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2156015/a1702424-0cfb-d565-24d3-a4e8e6da0d5d.png)


DefaultのPresetを追加や削除はここで設定できます

___

## まとめ
Presetが本当に便利なツールです。これをうまく利用できましたら、Workflowや自動化が改善できると思います。


[Preset]:https://docs.unity3d.com/Manual/Presets.html
[Preset Manager]:https://docs.unity3d.com/Manual/class-PresetManager.html