如何使c#脚本在场景中以统一的方式运行

时间:2017-01-09 13:32:21

标签: c# unity3d

我正在做一个学校项目。一旦场景开始,我需要检查场景中被破坏的物体。问题是我不知道如何加载它或在哪里附加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); 
    } 
}

3 个答案:

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

使脚本成为静态意味着它将在所有场景中激活,甚至在任何场景加载之前都会激活。

此外,我不建议使用静态类,除非你真的需要它们。