如何确定游戏对象是场景中的预制资产还是预制实例?
我尝试制作一个自定义编辑器并做
public override void OnInspectorGUI()
{
if (EditorUtility.IsPersistent(this.target))
{
Debug.Log("is persisent");
}
else
{
Debug.Log("is not persistent");
}
}
但是,无论是在“项目”视图中选择预制资产还是在场景中选择预制实例,这两种情况都将打印“不是持久性的”
之所以这样做,是因为我想拥有一个带有Guid
字段的MonoBehaviour,如果MonoBehaviour是场景中游戏对象的一部分,则MonoBehaviour应该为其自身生成一个唯一的GUID。如果它是预制资产的一部分,则应将其Guid
字段留空(以便同一预制的每个实例都具有唯一的GUID)。
答案 0 :(得分:0)
我找到了一个解决方案,尽管我认为这不是理想的解决方案。
public override void OnInspectorGUI()
{
var component = this.target as MyScript;
if (component.gameObject.scene.name.Equals(UnityEngine.SceneManagement.SceneManager.GetActiveScene().name))
{
Debug.Log("editing the prefab instance in the scene");
}
else
{
Debug.Log("editing the prefab asset");
}
}
答案 1 :(得分:0)
我发现了一个似乎总是有效的解决方案
if (gameObject.scene.name == null || gameObject.scene.name == gameObject.name)
我个人从来没有像给预制件一样命名场景,所以它工作得很好,但我更愿意警告它会忽略与它们所在场景同名的对象。