2016-05-17 28 views
3

好了錯誤的行爲,所以我有這個協程:協程時的場景被載入

IEnumerator ShowCharTraits() 
    { 

     while(!hasPlayerChosen) 
     { 
      yield return null; 
      traitPanel.SetActive(true); 
     } 
     hasPlayerChosen = false; 
     traitPanel.SetActive(false); 
    // Debug.Log("Got called! job done"); 

    } 

它被稱爲像這樣從清醒方法在我GameManager

players = GameObject.FindGameObjectsWithTag("Player"); 
       foreach (GameObject g in players) 
       { 
        ui_Controller.StartShowCharTraits(); 
        g.GetComponent<PlayerToken>().isTurn = false; 
       } 

StartShowCharTraits()是一個簡單的方法是這樣的:

public void StartShowCharTraits() 
    { 
     StartCoroutine("ShowCharTraits"); 
    } 

現在,我檢查了標籤,沒有空引用excep實際上沒有錯誤或警告被拋出。如果我在編輯器中加載場景,然後播放它,一切正常。 traitPanel.SetActive(true);被調用,我的面板出現。但是,當我使用SceneManager.LoadScene(1);從另一個場景加載我的場景時,上面提到的線條永遠不會到達。任何想法爲什麼發生這種情況?

+0

你能告訴哪一行不被調用?你可以至少做一個debug.log檢查是否工作 – LumbusterTick

+0

我知道哪些特定的行沒有被調用。我已經回答了我自己的問題。問題讓我們在另一個地方說。 –

+0

我給你一個令人興奮的答案@uripopov! – Fattie

回答

3

說你想有一箇中心地方,是「像一個單身」在一個統一的項目。例如,

SoundEffects 
LapTimer 
Scores 
SocialMediaConnections 

你所要做的就是這樣。

  1. 使你的腳本SoundEffects.cs

  2. 回想統一項目必須一個 「預加載」 的場景。 (這是不可能的)

  3. 在預加載場景中,有一個名爲「holder」的空遊戲對象。請確保它被標記爲 「DontDestroyOnLoad」

  4. 連接SoundEffects.cs到持有人

大功告成。

沒有什麼比它更多的了。

你完成了。

它「只是簡單的」

因此,任何特定的腳本,這恰好是連接到任何特定的對象,在任何特定的場景,可能需要訪問「SoundEffects」 ...

要做到這一點,只要做到這一點清醒:

SoundEffects soundEffects = Object.FindObjectOfType<SoundEffects>(); 

就用soundEffects在腳本中任何,例如soundEffects.PlayBoom(13)等等等等

所以在清醒()

Laps laps = Object.FindObjectOfType<Laps>(); 
    Social social = Object.FindObjectOfType<Social>(); 
    AI ai = Object.FindObjectOfType<AI>(); 

或其他。

統一很簡單。 令人難以置信的簡單。就是這麼簡單。

  1. 寫腳本,LapTimer.cs或任何

  2. 把它放在支架對象在預緊場景(它還能在哪裏呢?)

沒有 「3」這就是全部。這簡直太可笑了。

注意...

在統一初期,有人不幸提到的「單身」在QA板的地方。 (你不能在ECS系統中擁有「單身人士」,這是毫無意義的)。當時,這引發了關於如何在Unity中製造「單身貴族」的巨大討論,這種混亂局面令人困惑。不幸的是,從那一天起,你們可以讓人們學習Unity,他們看到網上提及的「單身人士」,並導致無盡的混亂。

請再次注意,「管理者」的概念在Unity中非常簡單 - 上面解釋過。這是微不足道的。它不是那麼容易。


注意,上面我提到你可能想語法糖果避免輸入Laps laps = Object.FindObjectOfType<Laps>();

令人難以置信的苦差事有非常遺憾的是沒有宏在Unity/C#所以你需要另一種方式。

您只需要使用「Grid」腳本http://answers.unity3d.com/answers/1124859/view.html,這在Unity中已經流行多年。

但說實話,使用Scores scores = Object.FindObjectOfType<Scores>();非常簡單,我通常現在就這麼做。

+0

感謝greaet的回答一如既往。我已經這樣做了。我的第一個場景中有一個對象是DontDestroyOnLoad()。這個問題來自於它附加的Dataholder看起來是否還有其他實例,並在它進入場景時將其銷燬。這導致另一個持有特定場景腳本的對象被銷燬,因爲可悲的是它有一個DataHolder實例附加在它的測試中。所以發生的是一個腳本的Awake()調用chars的協程並在運行喚醒從DataHodler刪除整個對象 –

+0

我的主菜單場景是這樣做的。問題是我忘記了另一個場景中的遊戲對象上的DataHolder組件。該遊戲對象正從主菜單場景中的DataHolder中銷燬。同一個gameobject爲場景提供腳本。這就是爲什麼一切都破滅 –

+0

從主菜單來回走並不是這裏的問題。我已經通過更改DataHolder的Awake()解決了我的問題,我不知道如何解釋發生的事情比我已經有的更好。 –

-1

好的,我該如何解釋這一點。我有一個作爲數據持有者的單身人士。在與遊戲經理開發場景的過程中,我將單例附加到了包含一堆腳本的gamemanger對象。現在,當我做主菜單時,我添加了我的單例,所以我可以將信息傳遞給遊戲場景,因此我的整個遊戲管理器對象被刪除。這是時,DataHolder罪魁禍首:

void Awake() 
    { 
     if (instance == null) 
      instance = this; 
     else if (instance != this) 
      Destroy(gameObject);//This right here. 

     DontDestroyOnLoad(gameObject); 
    } 

所以我改變該行Destroy(gameObject.GetComponent(instance.GetType()));

+0

單身? Unity團隊中沒有單身人士。你不能擁有它們。 – Fattie

+0

在C#中可以嗎?我在我的MusicController中使用了一個。 http://ghettocode.blogspot.com/2016/04/creating-musiccontroller-module-in。html – ApolloSoftware

+0

@JoeBlow等待不會發現我的腳本確保只有一個DataHolder對象實例將其設置爲單例? –