不知道是不是我在协程函数里用多了'yield return new WaitForSeconds'
I do not know if I used too much 'yield return new WaitForSeconds' in the coroutine function
** Unity5.6.5f1 / C#
我使用协程来 运行 动画。
与其在更新函数中创建多个 if 语句,不如
我认为协程会更好。
但是我觉得我用了'yield return new WaitForSeconds'太多了,
这样写协程很常见吗?
private IEnumerator AnimationControl()
{
yield return new WaitForSeconds(41f);
objAni.gameObject.SetActive(true);
obj2Ani.gameObject.SetActive(true);
obj3Ani.gameObject.SetActive(true);
objAni.Play("Stay");
obj2Ani.Play("Stay");
obj3Ani.Play("Stay");
yield return new WaitForSeconds(5.667f);
objAni.Play("Run");
obj2Ani.Play("Run");
obj3Ani.Play("Action");
yield return new WaitForSeconds(3.666f);
objAni.Play("Fire01");
yield return new WaitForSeconds(2.334f);
obj3Ani.Play("Panic");
obj2Ani.gameObject.SetActive(false);
yield return new WaitForSeconds(8.333f);
objAni.Play("Fire02");
yield return new WaitForSeconds(6.333f);
objAni.Play("Fire03");
yield return new WaitForSeconds(6.1337f);
obj3Ani.Play("Stay");
objAni.Play("Stay");
yield return new WaitForSeconds(3.2003f);
obj3Ani.Play("Surprise02");
objAni.Play("Surprise");
yield return new WaitForSeconds(3.333f);
obj3Ani.Play("Run");
objAni.Play("Run");
yield return new WaitForSeconds(6f);
objAni.Play("Stay");
yield return new WaitForSeconds(1.667f);
objAni.Play("Run");
yield return new WaitForSeconds(2.333f);
obj3Ani.gameObject.SetActive(false);
yield return new WaitForSeconds(0.667f);
objAni.gameObject.SetActive(false);
yield return new WaitForSeconds(1.333f);
textObj.SetActive(false);
yield return new WaitForSeconds(2.667f);
endingObj.SetActive(true);
allObj.SetActive(false);
}
感谢阅读。
这就是coroutine的用途,就是顺序执行很多代码,甚至随时等待。这并不过分。我看到的唯一问题是每次都创建新的 WaitForSeconds
。如果您知道要等待的时间或者您对时间进行了硬编码,请在函数外部声明 WaitForSeconds
然后让出它们。这实际上取决于您调用 AnimationControl
函数的频率。
例如,
private IEnumerator AnimationControl()
{
yield return new WaitForSeconds(41f);
objAni.gameObject.SetActive(true);
obj2Ani.gameObject.SetActive(true);
obj3Ani.gameObject.SetActive(true);
objAni.Play("Stay");
obj2Ani.Play("Stay");
obj3Ani.Play("Stay");
yield return new WaitForSeconds(5.667f);
objAni.Play("Run");
obj2Ani.Play("Run");
obj3Ani.Play("Action");
}
变成
WaitForSeconds wTime1 = new WaitForSeconds(41f);
WaitForSeconds wTime2 = new WaitForSeconds(5.667f);
private IEnumerator AnimationControl()
{
yield return wTime1;
objAni.gameObject.SetActive(true);
obj2Ani.gameObject.SetActive(true);
obj3Ani.gameObject.SetActive(true);
objAni.Play("Stay");
obj2Ani.Play("Stay");
obj3Ani.Play("Stay");
yield return wTime2;
objAni.Play("Run");
obj2Ani.Play("Run");
obj3Ani.Play("Action");
}
如果你真的想减少 WaitForSeconds
代码,你可以围绕它做一个包装器 class。这个 class 应该持有等待的时间甚至更好, WaitForSeconds
实例然后使用 Action
表示等待后要执行的代码。创建此 class
的 List
,对其进行循环,等待,然后执行 Action
变量中的代码。
包装器class:
public class AnimControlInfo
{
public WaitForSeconds waitTime;
public Action action;
}
创建它的列表:
List<AnimControlInfo> animInfo = new List<AnimControlInfo>();
初始化List
使其可以在AnimationControl
函数中使用:
void InitControlAnimInfo()
{
AnimControlInfo aI1 = new AnimControlInfo();
aI1.waitTime = new WaitForSeconds(41f);
aI1.action = delegate
{
objAni.gameObject.SetActive(true);
obj2Ani.gameObject.SetActive(true);
obj3Ani.gameObject.SetActive(true);
objAni.Play("Stay");
obj2Ani.Play("Stay");
obj3Ani.Play("Stay");
};
AnimControlInfo aI2 = new AnimControlInfo();
aI2.waitTime = new WaitForSeconds(5.667f);
aI2.action = delegate
{
objAni.Play("Run");
obj2Ani.Play("Run");
obj3Ani.Play("Action");
};
//Add to List
animInfo.Add(aI1);
animInfo.Add(aI2);
}
然后你的新 AnimationControl
函数等待并播放动画或 activate/de-activate GameObects:
private IEnumerator AnimationControl()
{
//Loop over the List, wait then do action
for (int i = 0; i < animInfo.Count; i++)
{
yield return animInfo[i].waitTime;
if (animInfo[i].action != null)
animInfo[i].action();
}
}
AnimationControl
函数中的代码量已减少。它还减少了 WaitForSeconds
class.
的过度使用
** Unity5.6.5f1 / C#
我使用协程来 运行 动画。
与其在更新函数中创建多个 if 语句,不如
我认为协程会更好。
但是我觉得我用了'yield return new WaitForSeconds'太多了,
这样写协程很常见吗?
private IEnumerator AnimationControl()
{
yield return new WaitForSeconds(41f);
objAni.gameObject.SetActive(true);
obj2Ani.gameObject.SetActive(true);
obj3Ani.gameObject.SetActive(true);
objAni.Play("Stay");
obj2Ani.Play("Stay");
obj3Ani.Play("Stay");
yield return new WaitForSeconds(5.667f);
objAni.Play("Run");
obj2Ani.Play("Run");
obj3Ani.Play("Action");
yield return new WaitForSeconds(3.666f);
objAni.Play("Fire01");
yield return new WaitForSeconds(2.334f);
obj3Ani.Play("Panic");
obj2Ani.gameObject.SetActive(false);
yield return new WaitForSeconds(8.333f);
objAni.Play("Fire02");
yield return new WaitForSeconds(6.333f);
objAni.Play("Fire03");
yield return new WaitForSeconds(6.1337f);
obj3Ani.Play("Stay");
objAni.Play("Stay");
yield return new WaitForSeconds(3.2003f);
obj3Ani.Play("Surprise02");
objAni.Play("Surprise");
yield return new WaitForSeconds(3.333f);
obj3Ani.Play("Run");
objAni.Play("Run");
yield return new WaitForSeconds(6f);
objAni.Play("Stay");
yield return new WaitForSeconds(1.667f);
objAni.Play("Run");
yield return new WaitForSeconds(2.333f);
obj3Ani.gameObject.SetActive(false);
yield return new WaitForSeconds(0.667f);
objAni.gameObject.SetActive(false);
yield return new WaitForSeconds(1.333f);
textObj.SetActive(false);
yield return new WaitForSeconds(2.667f);
endingObj.SetActive(true);
allObj.SetActive(false);
}
感谢阅读。
这就是coroutine的用途,就是顺序执行很多代码,甚至随时等待。这并不过分。我看到的唯一问题是每次都创建新的 WaitForSeconds
。如果您知道要等待的时间或者您对时间进行了硬编码,请在函数外部声明 WaitForSeconds
然后让出它们。这实际上取决于您调用 AnimationControl
函数的频率。
例如,
private IEnumerator AnimationControl()
{
yield return new WaitForSeconds(41f);
objAni.gameObject.SetActive(true);
obj2Ani.gameObject.SetActive(true);
obj3Ani.gameObject.SetActive(true);
objAni.Play("Stay");
obj2Ani.Play("Stay");
obj3Ani.Play("Stay");
yield return new WaitForSeconds(5.667f);
objAni.Play("Run");
obj2Ani.Play("Run");
obj3Ani.Play("Action");
}
变成
WaitForSeconds wTime1 = new WaitForSeconds(41f);
WaitForSeconds wTime2 = new WaitForSeconds(5.667f);
private IEnumerator AnimationControl()
{
yield return wTime1;
objAni.gameObject.SetActive(true);
obj2Ani.gameObject.SetActive(true);
obj3Ani.gameObject.SetActive(true);
objAni.Play("Stay");
obj2Ani.Play("Stay");
obj3Ani.Play("Stay");
yield return wTime2;
objAni.Play("Run");
obj2Ani.Play("Run");
obj3Ani.Play("Action");
}
如果你真的想减少 WaitForSeconds
代码,你可以围绕它做一个包装器 class。这个 class 应该持有等待的时间甚至更好, WaitForSeconds
实例然后使用 Action
表示等待后要执行的代码。创建此 class
的 List
,对其进行循环,等待,然后执行 Action
变量中的代码。
包装器class:
public class AnimControlInfo
{
public WaitForSeconds waitTime;
public Action action;
}
创建它的列表:
List<AnimControlInfo> animInfo = new List<AnimControlInfo>();
初始化List
使其可以在AnimationControl
函数中使用:
void InitControlAnimInfo()
{
AnimControlInfo aI1 = new AnimControlInfo();
aI1.waitTime = new WaitForSeconds(41f);
aI1.action = delegate
{
objAni.gameObject.SetActive(true);
obj2Ani.gameObject.SetActive(true);
obj3Ani.gameObject.SetActive(true);
objAni.Play("Stay");
obj2Ani.Play("Stay");
obj3Ani.Play("Stay");
};
AnimControlInfo aI2 = new AnimControlInfo();
aI2.waitTime = new WaitForSeconds(5.667f);
aI2.action = delegate
{
objAni.Play("Run");
obj2Ani.Play("Run");
obj3Ani.Play("Action");
};
//Add to List
animInfo.Add(aI1);
animInfo.Add(aI2);
}
然后你的新 AnimationControl
函数等待并播放动画或 activate/de-activate GameObects:
private IEnumerator AnimationControl()
{
//Loop over the List, wait then do action
for (int i = 0; i < animInfo.Count; i++)
{
yield return animInfo[i].waitTime;
if (animInfo[i].action != null)
animInfo[i].action();
}
}
AnimationControl
函数中的代码量已减少。它还减少了 WaitForSeconds
class.