我向预制件添加了脚本。然后,将预制件放入场景中,然后将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备份。
答案 0 :(得分:1)
您不能在预制件中包含场景引用。这不可能。它仅适用于本身是资产中的预制件的GameObject引用,也适用于同一预制层级中的引用。
但是存在一些解决方法
使用依赖项注入(例如Zenject)
一个ScriptableObject,用于在场景开始时设置参考,并参考ScriptableObject
。
[CreateAssetMenu(filename = "new GameObjectReference", menuName = "ScriptableObject/GameObjectReference")]
public GameObjectReference : ScriptableObject
{
public GameObject value;
}
通过在资产→{Create
→ScriptableObject
→GameObjectReference
然后将您的脚本字段更改为
[SerializeField] private GameObjectReference bossSpawnZone1;
,并且在使用它的任何地方都使用bossSpawnZone1.value
。
由于ScriptableObject实例本身位于资产中,因此现在可以使用。
最后,您需要像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>();