c# - 统一处理协程
问题描述
我在 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());
}
}
解决方案
我认为游戏对象的分配不应该在协程方法中完成。
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());
}
}
推荐阅读
- java - CDI:静态记录器与注入?
- twitter-bootstrap - 位置 :after 和 :before 位于引导导航固定顶部之后
- time-complexity - 为什么我们不喜欢用 Big-O 表示法指定常数因子?
- ansible - 如何从ansible yaml中的库存文件访问组变量
- python - 无法为 tf.matmul 或 tf.squared_difference 获得正确的形状
- javascript - React Component - 多次重新加载数据
- java - java - 处理从库中抛出的异常,停止打印到标准输出
- python - OneHotEncoder 前后结果不同
- java - 如何获取 Recycler View 的子节点?
- java - 优化:Oj 算法 (java) 与 SCIP (python)