首页 > 解决方案 > 统一处理协程

问题描述

我在 4 中制作了 4 个动画GameObjects (Rockgroup_x),我想在 2 秒后随机启动一个动画,然后在 2 秒后启动下一个随机动画等。所有的动画都经过测试并且可以工作。首先,我将所有这些设置GameObjects为非活动状态,因此您一开始不会看到它们,当我需要它们时,我将它们在函数中激活Rocksplants()并等待 2 秒,然后重新开始。但coroutine它不正确。我只看到游戏循环播放 RockGroup_2 GameObject 的动画。我做错了什么,我怎样才能做到这一点coroutine?有人可以帮我吗。

错误信息:

NullReferenceException:对象引用未设置为对象 RocksPlants+c__Iterator0.MoveNext () 的实例(在 Assets/ChosenAssets/Scripts/RocksPlants.cs:25)

(第 25 行:游戏对象 Rockgroup_02;)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RocksPlants : MonoBehaviour {
    IEnumerator Rocksplants(){

        GameObject Rockgroup_01;
        GameObject Rockgroup_02;
        GameObject Rockgroup_03;
        GameObject Rockgroup_04;

        Rockgroup_01 = GameObject.Find("RockGroup_1");
        Rockgroup_02 = GameObject.Find("RockGroup_2");
        Rockgroup_03 = GameObject.Find("RockGroup_3");
        Rockgroup_04 = GameObject.Find("RockGroup_4");

        Rockgroup_01.SetActive(false);
        Rockgroup_02.SetActive(false); //line 25
        Rockgroup_03.SetActive(false);
        Rockgroup_04.SetActive(false);

        int rndrockgroupright = Random.Range (1, 5);

        if (rndrockgroupright == 1) {
            Rockgroup_01.SetActive (true);
            yield return new WaitForSeconds (2);
        } else if (rndrockgroupright == 2) {
            Rockgroup_02.SetActive (true);
            yield return new WaitForSeconds (2);
        } else if (rndrockgroupright == 3) {
            Rockgroup_03.SetActive (true);
            yield return new WaitForSeconds (2);
        } else if (rndrockgroupright == 4) {  
            Rockgroup_04.SetActive (true);
            yield return new WaitForSeconds (2);
        }   
    }

    // Use this for initialization
    void Start () {

    }

    // Update is called once per frame
    void Update () {
        StartCoroutine (Rocksplants());
    }
}

标签: c#unity3d

解决方案


我认为游戏对象的分配不应该在协程方法中完成。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RocksPlants : MonoBehaviour {

        GameObject Rockgroup_01;
        GameObject Rockgroup_02;
        GameObject Rockgroup_03;
        GameObject Rockgroup_04;

    IEnumerator Rocksplants(){





        Rockgroup_01.SetActive(false);
        Rockgroup_02.SetActive(false); //line 25
        Rockgroup_03.SetActive(false);
        Rockgroup_04.SetActive(false);

        int rndrockgroupright = Random.Range (1, 5);

        if (rndrockgroupright == 1) {
            Rockgroup_01.SetActive (true);
            yield return new WaitForSeconds (2);
        } else if (rndrockgroupright == 2) {
            Rockgroup_02.SetActive (true);
            yield return new WaitForSeconds (2);
        } else if (rndrockgroupright == 3) {
            Rockgroup_03.SetActive (true);
            yield return new WaitForSeconds (2);
        } else if (rndrockgroupright == 4) {  
            Rockgroup_04.SetActive (true);
            yield return new WaitForSeconds (2);
        }   
    }

    // Use this for initialization
    void Start () {
        Rockgroup_01 = GameObject.Find("RockGroup_1");
        Rockgroup_02 = GameObject.Find("RockGroup_2");
        Rockgroup_03 = GameObject.Find("RockGroup_3");
        Rockgroup_04 = GameObject.Find("RockGroup_4");
    }

    // Update is called once per frame
    void Update () {
        StartCoroutine (Rocksplants());
    }
}

推荐阅读