0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

0
Posted at

はじめに

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";


        //==================================================
        // Private-SerializeField
        //==================================================


        //==================================================
        // Private
        //==================================================


        //==================================================
        // Public
        //==================================================


        //==================================================
        // Public-Propaty
        //==================================================


        //::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
        // Unity Functions
        //::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

        //::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
        // Private Functions
        //::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

        //::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
        // Public Functions
        //::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
        /// <summary>
        /// Hierarcyウィンドウで右クリックしたときにMcChangeSceneWipwを生成できるように
        /// </summary>
        /// <param name="pMenuCommand"></param>
        [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 // これが Action の pResourceFile に渡る
            );
        }

        //::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
        // 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を行い好きなフォルダ以下にプレハブを生成する

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

image.png
図1

コードの流れ

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

となっています

image.png
図2

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?