如何确定对象是预制资产还是该预制实例?

时间:2019-02-17 21:33:14

标签: unity3d

如何确定游戏对象是场景中的预制资产还是预制实例?

我尝试制作一个自定义编辑器并做

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)。

2 个答案:

答案 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)

我个人从来没有像给预制件一样命名场景,所以它工作得很好,但我更愿意警告它会忽略与它们所在场景同名的对象。