この投稿では、プロジェクトに新たなPrefabをEidtor拡張のコードから生成する方法を紹介します。
これはEditorUtilityクラスとPrefabUtilityを使うことで、簡単に実現できます。
空のGameObjectのPrefabを生成する
Editorディレクトリを作り、次のようなPrefabCreator.cs
を用意します。
MenuItem
属性の機能により、メニューからAssets>Create>New Prefab
を選択することでCreatePrefabメソッドが呼ばれ、空のGameObjectのPrefabが生成されます。
using UnityEngine;
using UnityEditor;
public static class PrefabCreator
{
[MenuItem("Assets/Create/New Prefab")]
public static void CreatePrefab ()
{
string name = "target";
string outputPath = "Assets/Prefab.prefab";
GameObject gameObject = EditorUtility.CreateGameObjectWithHideFlags (name, HideFlags.HideInHierarchy);
PrefabUtility.CreatePrefab (outputPath, gameObject);
Editor.DestroyImmediate (gameObject);
}
}
コード中のPrefabUtility.CreatePrefabは、出力するパスとPrafabにしたいGameObjectを引数に取って、Prefabをプロジェクト中に生成するメソッドです。(実際には第3引数を持ちます。後述)パスは、Assets/
から始まって、拡張子は.prefab
である必要があります。
GameObject gameObject = EditorUtility.CreateGameObjectWithHideFlags (name, HideFlags.HideInHierarchy);
ちょっと補足
少しだけ補足します。
下記のコードは、RigidbodyコンポーネントとBoxColliderコンポーネントが付与されたPrefabをプロジェクト中に生成するコードです。
[MenuItem("Assets/Create/New Prefab With Components")]
public static void CreatePrefabWithComponents ()
{
string name = "target";
string outputPath = "Assets/WithComponents.prefab";
GameObject gameObject = EditorUtility.CreateGameObjectWithHideFlags (
name,
HideFlags.HideInHierarchy,
typeof(Rigidbody), typeof(BoxCollider)
);
gameObject.rigidbody.isKinematic = true;
(gameObject.collider as BoxCollider).size = 5.0F * Vector3.one;
PrefabUtility.CreatePrefab (outputPath, gameObject, ReplacePrefabOptions.ReplaceNameBased);
Editor.DestroyImmediate (gameObject);
}
EditorUtility.CreateGameObjectWithHideFlagsは3個の引数を持つメソッドです。第3引数はSystem.Type型を可変長引数としてとります。第3引数に可変長引数として渡したSystem.Type型のコンポーネントが生成されたGameObjectに付与されます。上記のコードだと2個のSytem.Type型を渡しています。そのため、上記のコードではRigidbody型とBoxCollider型が付与されています。
PrefabUtility.CreatePrefabも3個の引数を持つメソッドです。第3引数としてReplacePrefabOptions型をとり、これはオプショナル引数(他の言語ではデフォルト引数とも)になっています。第3引数により名前が衝突した際の挙動を設定できます。上記のコードでは、名前が衝突した際、上書きするようにしています。
上記のコードでは、Rigidbodyコンポーネント・BoxColliderコンポーネントという組み込みのコンポーネントを付与したPrefabを生成していますが、もちろん自作のコンポーネントを付与することも可能です。