SerializedField中的GameObject-OverRide-全部应用:预制件不会更新

时间:2019-04-30 20:50:43

标签: c# unity3d

我向预制件添加了脚本。然后,将预制件放入场景中,然后将GameObjects拖放到检查器中的相应字段中。然后,我单击“覆盖范围” >>“全部应用”。 (这很常见,我一直都这样做) 但是,当实例化游戏对象时,我用于“生成区域”的游戏对象不适用于我的预制件。 (场景中的预制件确实具有“空游戏对象”,但“项目”面板中没有主预制件) 我使用的是与实例化项目符号相同的方法,但由于某些未知原因,Project视图预制件将显示“ None(GameObject)”

代码如下:

[SerializeField]
private GameObject boss;
[SerializeField]
private float bossSpd;
[SerializeField]
private GameObject bossSpawnZone1; // This won't apply to my prefab in Project panel

private void Update()
{
    if(startBoss == true)//StartBoss occurs when a GameObject is touched by player on another script. Just OnTriggerEnter2D set var to true
    {
        GetTheBoss();
    }
}
void GetTheBoss()
{
    Instantiate(boss, bossSpawnZone1.transform.position, Quaternion.identity);
    startBoss = false;
}

我会包含照片,但我不知道如何在此处上传照片。以前从未使用过IMG URL。但是请相信我,我将空的gameobject(SpawnZone)插入了该字段。我还使用了替代来应用所有内容。但是,产卵区字段仍然为空。

我尝试过的事情:

1)删除脚本并重新添加脚本,然后再次填充字段。 2)将生成区域设为公共静态,并尝试在与该播放器有关的另一个脚本中使用GameObject.Find(“ PirateSpawnZone”)。 3)更改变量名称并保存脚本。 4)重新启动Unity /完全重新启动计算机,然后打开Unity备份。

1 个答案:

答案 0 :(得分:1)

您不能在预制件中包含场景引用。这不可能。它仅适用于本身是资产中的预制件的GameObject引用,也适用于同一预制层级中的引用。

但是存在一些解决方法

依赖注入

使用依赖项注入(例如Zenject

ScriptableObject参考

  1. 一个ScriptableObject,用于在场景开始时设置参考,并参考ScriptableObject

    [CreateAssetMenu(filename = "new GameObjectReference", menuName = "ScriptableObject/GameObjectReference")]
    public GameObjectReference : ScriptableObject
    {
        public GameObject value;
    }
    
  2. 通过在资产→{CreateScriptableObjectGameObjectReference

    中通过右键单击创建资产
  3. 然后将您的脚本字段更改为

    [SerializeField] private GameObjectReference bossSpawnZone1;
    

    ,并且在使用它的任何地方都使用bossSpawnZone1.value

    由于ScriptableObject实例本身位于资产中,因此现在可以使用。

  4. 最后,您需要像bossSpawnZone1这样的GameObject上的setter组件

    public GameObjectReferenceSetter : MonoBehaviour
    {
        [SerializeField] private GameObject scriptableAsset;
    
        private void Awake()
        {
            scriptableAsset.value = gameObject;
        }
    }
    

单一模式

仅具有二传手并提供public static引用(仅在整个场景/游戏中仅存在一个引用的情况下有效

public class SpawnZoneReference : MonoBehaviour
{
    public static GameObject instance;

    private void Awake ()
    {
        instance = gameObject;
    }
}

在脚本中使用

Instantiate(boss, SpawnZoneReference.instance.transform.position, Quaternion.identity);

或者仅使用某种特定类型(如

)非常相似
public class BossSpawnZone : MonoBehaviour { }

GameObject和您的脚本中执行

bossSpawnZone1 = FindObjectOfType<BossSpawnZone>();