Coroutine错误加载场景时的行为
好的,我有这个协程:
IEnumerator ShowCharTraits() { while(!hasPlayerChosen) { yield return null; traitPanel.SetActive(true); } hasPlayerChosen = false; traitPanel.SetActive(false); // Debug.Log("Got called! job done"); }
它是从我的GameManager
的唤醒方法GameManager
:
players = GameObject.FindGameObjectsWithTag("Player"); foreach (GameObject g in players) { ui_Controller.StartShowCharTraits(); g.GetComponent().isTurn = false; }
StartShowCharTraits()是一个执行此操作的简单方法:
public void StartShowCharTraits() { StartCoroutine("ShowCharTraits"); }
现在,我检查了标签,没有空引用exception,实际上没有抛出任何错误或警告。 如果我在编辑器中加载场景然后播放它一切正常。 traitPanel.SetActive(true);
被叫,我的小组出现了。 但是当我使用SceneManager.LoadScene(1);
从另一个场景加载我的场景时SceneManager.LoadScene(1);
从未达到上述行。 任何想法为什么会这样?
假设您想在Unity项目中拥有一个“像单身人士”的中心位置。 例,
SoundEffects LapTimer Scores SocialMediaConnections
你所做的就是这个。
-
制作你的脚本SoundEffects.cs
-
回想一下, 每个 Unity项目都必须有一个“预加载”场景。 (不可能没有)
-
在预加载场景中,有一个名为“holder”的空游戏对象。 确保它标记为“DontDestroyOnLoad”
-
将SoundEffects.cs附加到该持有者
你完成了。
没有更多的东西。
你结束了。
它就是“那么简单”
因此,在任何特定场景中碰巧附加到任何特定对象的任何特定脚本可能需要访问“SoundEffects”……
为此,只需在Awake中执行此操作:
SoundEffects soundEffects = Object.FindObjectOfType();
然后在该脚本中的任何地方使用soundEffects
,例如soundEffects.PlayBoom(13)
等。
所以在Awake()
Laps laps = Object.FindObjectOfType(); Social social = Object.FindObjectOfType(); AI ai = Object.FindObjectOfType();
管他呢。
团结很简单。 非常简单。 就这么简单。
-
写你的脚本,
LapTimer.cs
或其他什么 -
把它放在你预装场景中的一个持有者对象上(在哪里可能呢?)
没有“3”,这就是全部。 这简直太荒谬了。
注意…
在团结的早期,有人不幸在某个QA板上提到了“单身人士”。 (你不能在ECS系统中拥有“单身人士”,这是毫无意义的。)当时,这引发了关于如何在Unity中制造“单身式的东西”的大量讨论,这会混淆混乱。 不幸的是,从那天到现在,你让人们学习Unity,他们看到网络上随处可见的“单身人士”,这会导致无休止的混乱。
再一次,请注意,“管理者”的概念在Unity中简直不可思议 – 如上所述。 这是微不足道的。 这简直太容易了。
注意,上面我提到你可能想要语法糖果来避免令人难以置信的打字工作Laps laps = Object.FindObjectOfType
遗憾的是Unity / c#中没有宏 ,所以你需要另一种方式。
您所做的只是使用“网格”脚本http://answers.unity3d.com/answers/1124859/view.html ,这在Unity中已经流行多年。
但老实说,使用Scores scores = Object.FindObjectOfType
我现在通常只是这样做。
好的我怎么解释这个。 我有一个作为数据持有者的单身人士。 在使用游戏管理器开发场景时,我已将单例附加到包含一堆脚本的gamemanger对象。 现在,当我制作主菜单时,我的ofc添加了我的单身,所以我可以将信息带到游戏场景,因此我的整个游戏管理器对象被删除了。 这是DataHolder的罪魁祸首:
void Awake() { if (instance == null) instance = this; else if (instance != this) Destroy(gameObject);//This right here. DontDestroyOnLoad(gameObject); }
所以我将该行更改为Destroy(gameObject.GetComponent(instance.GetType()));