【Unity Editor 확장】 자산이 저장된 경로를 얻습니다.

12107 단어 Unity 확장Unity

개요


  • ScriptableObject 나 Prefab과 같은 특정 경로에 넣을 수 있습니다.
  • 에디터 확장을 사용하여 에셋 경로를 검색하고 사용하는 방법을 확인합니다.

    ScriptableObect 샘플


    using UnityEngine;
    #if UNITY_EDITOR
    using UnityEditor;
    #endif
    
    //CreateAssetMenu属性をつけるとメニューからScriptableObjectを作成できるようになる
    [CreateAssetMenu(menuName = "ScriptableObject/SamplePathScriptableObject", fileName = "SamplePathScriptableObject.asset")]
    public class SamplePathScriptableObject : ScriptableObject
    {
        public string SampleString;
    
        public int SampleInt;
    }
    
    #if UNITY_EDITOR
    //CustomEditor属性でInspectorのEditor拡張が行える
    [CustomEditor(typeof(SamplePathScriptableObject))]
    public class SamplePathScriptableObjectInspector : Editor
    {
        public override void OnInspectorGUI()
        {
            //元のInspectorを表示する
            base.OnInspectorGUI();
    
            //InstanceIDからObjectを取得する
            var obj = EditorUtility.InstanceIDToObject(target.GetInstanceID());
    
            //取得したObjectからアセットのパスを取得する(拡張子あり)
            var path = AssetDatabase.GetAssetPath(obj);
    
            if (string.IsNullOrEmpty(path))
            {
                return;
            }
    
            //HelpBoxでパスを表示する
            EditorGUILayout.HelpBox(path, MessageType.Info);
        }
    }
    #endif
    
    

    메뉴에서 ScriptableObject를 만들면 ScriptableObject 프로젝트 내에서 경로가 Inspector에 표시됩니다.




    Prefab 샘플


    using UnityEngine;
    #if UNITY_EDITOR
    using UnityEditor;
    #endif
    
    public class SamplePrefab : MonoBehaviour
    {
        [SerializeField]
        string SampleString;
    
        [SerializeField]
        int SampleInt;
    }
    
    #if UNITY_EDITOR
    [CustomEditor(typeof(SamplePrefab))]
    public class SamplePrefabObjectInspector : Editor
    {
        public override void OnInspectorGUI()
        {
            base.OnInspectorGUI();
    
            var obj = EditorUtility.InstanceIDToObject(target.GetInstanceID());
    
            var path = AssetDatabase.GetAssetPath(obj);
    
            if (string.IsNullOrEmpty(path))
            {
                return;
            }
    
            EditorGUILayout.HelpBox(path, MessageType.Info);
        }
    }
    #endif
    

    Prefab의 경우에도 마찬가지로 자산 경로를 볼 수 있습니다.


    응용편 특정 패스 이외에 놓았을 경우에 경고를 낸다



    반드시 특정 위치에 설치하고 싶은 자산의 경우, 이번 기능을 응용하여 체크 기구를 실장할 수 있습니다.
    using UnityEngine;
    #if UNITY_EDITOR
    using UnityEditor;
    #endif
    
    [CreateAssetMenu(menuName = "ScriptableObject/SamplePathScriptableObject", fileName = "SamplePathScriptableObject.asset")]
    public class SamplePathScriptableObject : ScriptableObject
    {
        /// <summary>
        /// アセットの正しい保存パス
        /// </summary>
        public const string ASSET_PATH = "Assets/Resources/ScriptableObject/SamplePathScriptableObject.asset";
    
        public string SampleString;
    
        public int SampleInt;
    }
    
    #if UNITY_EDITOR
    [CustomEditor(typeof(SamplePathScriptableObject))]
    public class SamplePathScriptableObjectInspector : Editor
    {
        public override void OnInspectorGUI()
        {
            base.OnInspectorGUI();
    
            var obj = EditorUtility.InstanceIDToObject(target.GetInstanceID());
    
            var path = AssetDatabase.GetAssetPath(obj);
    
            if (string.IsNullOrEmpty(path))
            {
                return;
            }
    
            if(path != SamplePathScriptableObject.ASSET_PATH)
            {
                var message = $"アセットのパスが間違っています\n{SamplePathScriptableObject.ASSET_PATH}に保存してください";
                EditorGUILayout.HelpBox(message, MessageType.Error);
            }
    
    
        }
    }
    #endif
    
    



    이번에는 Inspector에 에러를 내는 것만이었지만, 좀 더 명확하게 에러를 내고 싶은 경우는 다이얼로그를 표시하거나 Debug.Assert 를 사용하는 것도 좋을 것입니다.
  • 좋은 웹페이지 즐겨찾기