Coroutine错误加载场景时的行为

时间:2016-05-17 12:53:22

标签: c# unity3d

好的,我有这个协程:

subscriptions model =
  Mouse.clicks (\_ -> Click)

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

中的清醒方法就是这样调用的
GameManager

StartShowCharTraits()是一个执行此操作的简单方法:

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

现在,我检查了标签,没有空引用异常,实际上没有抛出任何错误或警告。如果我在编辑器中加载场景然后播放它一切正常。 public void StartShowCharTraits() { StartCoroutine("ShowCharTraits"); } 被叫,我的小组出现了。但是,当我使用traitPanel.SetActive(true);从另一个场景加载场景时,从未到达上述线。任何想法为什么会发生这种情况?

2 个答案:

答案 0 :(得分:3)

假设您想在Unity项目中拥有一个“像单身人士”的中心位置。例如,

SoundEffects
LapTimer
Scores
SocialMediaConnections

你所做的就是这个。

  1. 制作剧本SoundEffects.cs

  2. 回想一下每个 Unity项目必须一个“预加载”场景。 (不可能没有)

  3. 在预加载场景中,有一个名为“holder”的空游戏对象。确保它标记为“DontDestroyOnLoad”

  4. 将SoundEffects.cs附加到该持有者

  5. 你已经完成了。

    没有更多内容。

    你已经完成了。

    它就是“那么简单”

    因此,在任何特定场景中碰巧附加到任何特定对象的任何特定脚本可能需要访问“SoundEffects”......

    要做到这一点,只需在Awake中执行此操作:

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

    然后只需在该脚本中的任何位置使用soundEffects,例如soundEffects.PlayBoom(13)等等。

    所以在Awake()

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

    或其他什么。

    Unity很简单。 非常简单。就这么简单。

    1. 编写脚本,LapTimer.cs或其他

    2. 将它放在预装场景中的持有者对象上(可能还有什么地方?)

    3. 没有“3”,这就是全部。这简直太荒谬了。

      请注意......

        

      在团结的早期,有人不幸地在某个QA板上提到了“单身人士”。 (你不能在ECS系统中拥有“单身人士”,这是毫无意义的。)当时,这引发了关于如何在Unity中制造“单身式的东西”的大量讨论,这会混淆混乱。不幸的是,从那天开始,你会让人们学习Unity,他们会在网上看到“单身人士”,这会导致无休止的混乱。

      请再次指出,“管理者”的想法在Unity中简直不可思议 - 如上所述。这是微不足道的。这简直太容易了。

      注意,上面我提到你可能想要语法糖果以避免令人难以置信的打字工作Laps laps = Object.FindObjectOfType<Laps>();

      Unity / c#中非常不幸没有宏,所以你需要另一种方式。

      您所做的只是使用在Unity中流行多年的“网格”脚本http://answers.unity3d.com/answers/1124859/view.html

      但老实说,使用Scores scores = Object.FindObjectOfType<Scores>();这么简单,我现在通常只是这样做。

答案 1 :(得分:-1)

好的我怎么解释这个。我有一个作为数据持有者的单身人士。在使用游戏管理器开发场景时,我已将单例附加到包含大量脚本的游戏管理器对象。现在,当我制作主菜单时,我将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()));