MimiCatLab
← ホームに戻る
Unity

Unity6でスクリプトからファイル作成後、そのままファイル名を変更する

エディタ拡張でファイルを作成したときそのまま名前を変更する方法

はじめに

Unity6になってスクリプトからPrefabVariantなどをしてファイルを生成してそのまま名前を変える方法が変わっていた(非推奨になった)ようなので備忘録として示しておきます。

コード全体

解説いらない人はここから自分の環境で必要な箇所だけ持っていってください

using System.IO;
using UnityEditor;
using UnityEditor.ProjectWindowCallback;
using UnityEngine;

namespace MimiCatHub.Editor
{
    /// <summary>
    /// @Author     :   Yukineko, Apr 2026
    /// @Brief      :   McSceneChangeWipeのエディタ用コード
    /// </summary>
    public class McSceneChangeWipeEditor : MonoBehaviour
    {
        //==================================================
        // Const
        //==================================================

        private const string BASE_SCENE_CHANGE_WIPW_PREFAB_PATH =
            "Assets/_MimiCatHub/Core/Runtime/SceneChange/Prefab/SceneChangeWipe.prefab";

        //::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
        // Public Functions
        //::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

        /// <summary>
        /// Hierarcyウィンドウで右クリックしたときにMcChangeSceneWipwを生成できるように
        /// </summary>
        [MenuItem("Assets/Create/MimiCatLab/UI/Scene/ChangeSceneWipe", false, 0)]
        public static void CreateButton()
        {
            // 複製するプレハブをロード
            var pBasePrefab =
                AssetDatabase.LoadAssetAtPath<GameObject>(BASE_SCENE_CHANGE_WIPW_PREFAB_PATH);

            if (pBasePrefab == null)
            {
                McDebug.LogError(
                    $"複製元のプレハブが見つからない! Path: {BASE_SCENE_CHANGE_WIPW_PREFAB_PATH}"
                );
                return;
            }

            // 作成場所を決める
            var pPath = AssetDatabase.GetAssetPath(Selection.activeObject);

            if (string.IsNullOrEmpty(pPath))
            {
                pPath = "Assets";
            }

            if (!Directory.Exists(pPath))
            {
                pPath = Path.GetDirectoryName(pPath);
            }

            var pFullPath =
                AssetDatabase.GenerateUniqueAssetPath($"{pPath}/SceneChangeWipe.prefab");

            // バリアント作成アクションを予約
            var pAction = ScriptableObject.CreateInstance<CreateVariantAction>();

            // 表示するアイコンの取得
            Texture2D pIcon =
                AssetDatabase.GetCachedIcon(BASE_SCENE_CHANGE_WIPW_PREFAB_PATH) as Texture2D;

            // 生成するファイルの名前の設定を行う
            ProjectWindowUtil.StartNameEditingIfProjectWindowExists(
                EntityId.None,
                pAction,
                pFullPath,
                pIcon,
                BASE_SCENE_CHANGE_WIPW_PREFAB_PATH
            );
        }

        //::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
        // private class
        //::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

        /// <summary>
        /// 名前入力が終わった後に呼ばれる処理
        /// </summary>
        private class CreateVariantAction : AssetCreationEndAction
        {
            public override void Action(EntityId entityId, string pPathName, string pResourceFile)
            {
                var pBasePrefab =
                    AssetDatabase.LoadAssetAtPath<GameObject>(pResourceFile);

                if (pBasePrefab == null)
                {
                    McDebug.LogError(
                        $"複製元のプレハブが見つからない! Path: {BASE_SCENE_CHANGE_WIPW_PREFAB_PATH}"
                    );
                    return;
                }

                // メモリ上にインスタンス化してバリアントとして保存
                var pInstance =
                    (GameObject)PrefabUtility.InstantiatePrefab(pBasePrefab);

                var pVariant =
                    PrefabUtility.SaveAsPrefabAsset(pInstance, pPathName);

                // メモリから破棄
                DestroyImmediate(pInstance);

                if (pVariant != null)
                {
                    AssetDatabase.SaveAssets();

                    // 作ったアセットを選択状態にする
                    ProjectWindowUtil.ShowCreatedAsset(pVariant);
                }
            }
        }
    }
}

簡単な解説

unity6になってESCの関係でInstanceIDまわりの処理が色々非推奨になり、その代わりにEntityIDを使うことが推奨になりました。

その影響でファイル名の変更方法も変わったのかと思います。

動作

  1. Projectウィンドウで特定のフォルダで右クリック(図1)
  2. 元々生成しておいたPrefabからPrefabVariantを行い好きなフォルダ以下にプレハブを生成する

といった機能を作成しました

図1

コードの流れ

  1. 複製元のプレハブ(ゲームオブジェクト)を取得
  2. 作成場所を決める(右クリックしたフォルダ以下)
  3. プレハブのヴァリアントを作成
  4. 指定したフォルダに保存
  5. StartNameEditingIfProjectWindowExistsを使用しているのでそのままファイル名の変更を行える(図2)

となっています

図2