LoginSignup
23
19

More than 5 years have passed since last update.

プロジェクトに新たなPrefabを生成するためのEditor拡張コード

Last updated at Posted at 2015-01-11

この投稿では、プロジェクトに新たなPrefabをEidtor拡張のコードから生成する方法を紹介します。

これはEditorUtilityクラスとPrefabUtilityを使うことで、簡単に実現できます。

空のGameObjectのPrefabを生成する

Editorディレクトリを作り、次のようなPrefabCreator.csを用意します。

MenuItem属性の機能により、メニューからAssets>Create>New Prefabを選択することでCreatePrefabメソッドが呼ばれ、空のGameObjectのPrefabが生成されます。

空のGameObjectのプレファブを生成
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をプロジェクト中に生成するコードです。

空のGameObjectのプレファブを生成
[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を生成していますが、もちろん自作のコンポーネントを付与することも可能です。

関連リンク

関連投稿

23
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23
19