我怎样才能从它自己的代码中获得对预制资产的引用?
How can I get a reference of a prefab asset from the code in it self?
假设我有这个预制资产“P”并附有这段代码。
public GameObject selfReference;
[ContextMenu("GetReference")]
public void GetReference()
{
selfReference = gameObject;
}
注意:
'reference finding' 进程由 ContextMenu 触发,因此 它是在编辑模式 下完成的,而不是播放模式;
所有这一切都发生在预制资产“P”本身中,而不是它放置在场景中的一些随机实例。
所以我尝试了
selfReference = PrefabUtility.GetNearestPrefabInstanceRoot(gameObject);
但它不起作用,所以尝试通过路径加载它:
string _path = AssetDatabase.GetAssetPath(gameObject);
但它 returns 只有空字符串。
有什么帮助吗?
我只能假设 - 因为它对我有用 ;)
您的问题与未正确保存且未针对 undo/redo 处理的更改有关。
你可能应该这样做
public GameObject selfReference;
[ContextMenu(nameof(GetReference))]
public void GetReference()
{
#if UNITY_EDITOR
if(!Application.isPlaying)
{
UnityEditor.Undo.RecordObject(this, "fetched self-reference");
if (UnityEditor.PrefabUtility.IsPartOfAnyPrefab(this))
{
UnityEditor.PrefabUtility.RecordPrefabInstancePropertyModifications(this);
}
}
#endif
selfReference = gameObject;
}
除此之外,无论如何,为通过 属性 公开的内容设置一个字段对我来说似乎有点多余 ;)
假设我有这个预制资产“P”并附有这段代码。
public GameObject selfReference;
[ContextMenu("GetReference")]
public void GetReference()
{
selfReference = gameObject;
}
注意: 'reference finding' 进程由 ContextMenu 触发,因此 它是在编辑模式 下完成的,而不是播放模式; 所有这一切都发生在预制资产“P”本身中,而不是它放置在场景中的一些随机实例。
所以我尝试了
selfReference = PrefabUtility.GetNearestPrefabInstanceRoot(gameObject);
但它不起作用,所以尝试通过路径加载它:
string _path = AssetDatabase.GetAssetPath(gameObject);
但它 returns 只有空字符串。
有什么帮助吗?
我只能假设 - 因为它对我有用 ;)
您的问题与未正确保存且未针对 undo/redo 处理的更改有关。
你可能应该这样做
public GameObject selfReference;
[ContextMenu(nameof(GetReference))]
public void GetReference()
{
#if UNITY_EDITOR
if(!Application.isPlaying)
{
UnityEditor.Undo.RecordObject(this, "fetched self-reference");
if (UnityEditor.PrefabUtility.IsPartOfAnyPrefab(this))
{
UnityEditor.PrefabUtility.RecordPrefabInstancePropertyModifications(this);
}
}
#endif
selfReference = gameObject;
}
除此之外,无论如何,为通过 属性 公开的内容设置一个字段对我来说似乎有点多余 ;)