我怎样才能从它自己的代码中获得对预制资产的引用?

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

除此之外,无论如何,为通过 属性 公开的内容设置一个字段对我来说似乎有点多余 ;)