我正在做一个学校项目。一旦场景开始,我需要检查场景中被破坏的物体。问题是我不知道如何加载它或在哪里附加c#脚本。
public static class DestroyedObject {
static List<GameObject> objs = new List<GameObject>();
public static void Add(GameObject obj)
{
if(!objs.Contains(obj))
objs.Add(obj);
}
}
答案 0 :(得分:2)
如果您希望在启动场景时运行它,则需要将其附加到GameObject。创建为空并将其作为组件附加。
要在start上运行的代码应位于:
void Awake {//Your code here}
或void Start{//Your code here}
函数。
实例化类后立即调用Start,并在场景启动时调用Awake。取决于你想要它在调用堆栈中的位置,但在你的情况下,我认为它将基本上做同样的事情。
答案 1 :(得分:1)
我认为您正在寻找的是一种“保存”已删除对象的方法:您只需让您的类继承自MonoBehaviour
并调用DontDestroyOnLoad()
,以便您的对象包含脚本将存在于场景之间。
public static class DestroyedObject : MonoBehaviour
{
public static DestroyedObject Instance;
private static List<GameObject> objs = new List<GameObject>();
private void Awake()
{
if (!Instance)
{
Instance = this;
}
else
{
DestroyImmediate(gameObject);
}
DontDestroyOnLoad(gameObject);
}
public static void Add(GameObject obj)
{
if(!objs.Contains(obj))
objs.Add(obj);
}
public static List<GameObject> GetDestroyedObjects()
{
return objs;
}
}
然后,您只需使用DestroyedObject.Instance.Add()
或DestroyedObject.Instance.GetDestroyedObjects()
访问您的脚本(有些人不喜欢这种设计模式,但事实证明它在使用Unity时非常有效)。
同样正如@Sergey所问,为什么要创建对象(在场景加载时)以便以后删除它们:你可以进行逆转操作(只实例化所需的对象)。
希望这有帮助,
答案 2 :(得分:0)
你能描述一下你想要实现的目标吗?因为看起来你的方式不是最好的方式;)。
如果你想知道的是如何在场景开始时执行脚本:创建一个继承MonoBehaviour的脚本(不需要静态类),将它附加到场景中的游戏对象,就是这样!
如果你想在场景开始后立即执行代码(加载游戏对象),请将代码放入Awake()或Start()。您可以在此处阅读有关这些功能的执行顺序:https://docs.unity3d.com/Manual/ExecutionOrder.html
使脚本成为静态意味着它将在所有场景中激活,甚至在任何场景加载之前都会激活。
此外,我不建议使用静态类,除非你真的需要它们。