繁体   English   中英

如何使 ac# 脚本在场景开始时统一运行

[英]how to make a c# script run at scene start in unity

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

如果您希望它在开始场景时运行,则需要将其附加到GameObject 创建空并将其作为组件附加。

您要在启动时运行的代码应位于:

void Awake
{
    //Your code here
}

或者

void Start
{
    //Your code here
}

职能。

一旦类被实例化就会调用 Start 并且在场景开始时调用 Awake 。 取决于您希望它在调用堆栈中的哪个位置,但在您的情况下,我认为它基本上会做同样的事情。

我认为您正在寻找的是一种“保存”已删除对象的方法:您只需让您的类从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 所问的那样,为什么要创建对象(在场景加载时)以便之后删除它们:您可以执行反向操作(仅实例化所需的对象)。

希望这可以帮助,

你能描述一下你想要达到的总体目标吗? 因为看起来你的方式不是最好的方式;)。

如果您只想知道如何在场景开始时执行脚本:创建一个继承自 MonoBehaviour 的脚本(不需要静态类),将其附加到场景中的游戏对象,就是这样!

如果您想在场景开始(并且游戏对象已加载)时立即执行代码,请将您的代码放在 Awake() 或 Start() 中。 您可以在此处阅读这些函数的执行顺序: https : //docs.unity3d.com/Manual/ExecutionOrder.html

使脚本静态意味着它将在所有场景中处于活动状态,甚至在加载任何场景之前也是如此。

此外,除非您确实需要它们,否则我不建议使用静态类。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM