2017-01-09 72 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的描述並不完全正確,我也不認爲在這種情況下使用靜態類是最好的解決方案(因爲它是可以避免的)。 –

相關問題