2017-01-09 19 views
1

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

当场景开始时,你有一些被破坏的物体吗?为什么在场景开始之前创建和销毁某些东西? –

+0

其隐藏的对象游戏,找到的对象被破坏然后你移动到另一个场景,你可以回到前一个场景多数民众赞成为什么有对象需要保持销毁 –

+0

甚至没有注意到你严格复制粘贴代码@ m-rogalski在[你以前的问题]中提供了你(http://stackoverflow.com/questions/41547533/how-to-pass-the-destroyed-state-of-an-object-in-unity):也许你可以简单地问他,而不是开始一个新的问题...... – Kardux

回答

3

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

要在启动时运行,应在代码: void Awake {//Your code here}void Start{//Your code here}功能。

只要实例化类,就会调用Start,并在场景启动时调用Awake。取决于你想在调用堆栈中的位置,但在你的情况下,我认为它会做基本相同的事情。

+0

不确定你的答案是否足够清楚这一点,所以我更喜欢在这里强调:所有来自场景的'Awake()'方法总是会在任何'Start ()'方法。'Awake()'是类实例化的时刻(如果在一个活动的GameObject上禁用了脚本,会发生这种情况),而只有在第一次“看到”在一个活动的GameObject上启用的脚本时调用“Start您可以查看[this](https://docs.unity3d.com/Manual/ExecutionOrder.html)以更好地理解Unity执行顺序。 – Kardux

+0

我如何让它运行而不点击任何东西? –

+2

如果您将GameObject与场景中附带的脚本一起放置并运行场景,则您在“Start()”方法中编写的所有代码都将运行。 –

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问,为什么创建对象(在场景加载),以便之后删除它们:您可以执行反转操作(仅实例化所需的)。

希望这会有所帮助,

0

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

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

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

使脚本变为静态意味着它将在所有场景中甚至在加载任何场景之前都处于活动状态。

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

+0

@Alex和我已经说过的东西:) – Kardux

+1

是的,我会评论,但我不能-_-。尽管如此,Alex对Start和Awake的描述并不完全正确,我也不认为在这种情况下使用静态类是最好的解决方案(因为它是可以避免的)。 –

相关问题