【Unity Editor 확장】 자산이 저장된 경로를 얻습니다.
개요
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
를 사용하는 것도 좋을 것입니다.
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
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
를 사용하는 것도 좋을 것입니다.
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
Reference
이 문제에 관하여(【Unity Editor 확장】 자산이 저장된 경로를 얻습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/broken55/items/a2e9f6bdc85817712078텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)