Den*_*nis -1 c# coroutine unity-game-engine
我正在制作一个 2d 游戏,我需要淡入和淡出一些元素。
IEnumerator FadeOut(Renderer rend, float speed)
{
while (rend.material.color.a > 0)
{
Color objectColor = rend.material.color;
float fadeAmount = objectColor.a - (speed * Time.deltaTime);
objectColor = new Color(objectColor.r, objectColor.g, objectColor.b, fadeAmount);
rend.material.color = objectColor;
yield return null;
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的 FadeOut 协程(FadeIn脚本正是这个协程,但相反)。问题是它会出现错误。例如,如果我多次进入和退出需要淡出的区域,则整个游戏只会混合黑色(或太亮)。我通过使用StopAllCoroutines函数解决了这个问题。协程调用之一:
StopAllCoroutines();
StartCoroutine(FadeOut(tilemap,1f));
Run Code Online (Sandbox Code Playgroud)
我宁愿不使用 StopAllCoroutines,因为我在同一游戏中使用多个协程,进入淡入淡出区域只会关闭一半的系统。
我尝试使用StopCoroutine("name")(但据我所知,它与较新版本的 unity 不兼容)。我还在 StackOverflow 上找到了另一个帖子
来自线程的代码:
routines[col] = StartCoroutine((DamageEverySecond(health, damageRate)));
[...]
StopCoroutine(routine);
Run Code Online (Sandbox Code Playgroud)
不幸的是,这并不能解决我的问题,因为有多个实例同时运行。
我怎么解决这个问题?
那
来自线程的代码
Run Code Online (Sandbox Code Playgroud)routines[col] = StartCoroutine((DamageEverySecond(health, damageRate))); [...] StopCoroutine(routine);
该代码不使用.."name"它而是使用一个Coroutine由 and 返回的实例StartCoroutine,这正是您想要做的:
private Coroutine fadeOutRoutine;
Run Code Online (Sandbox Code Playgroud)
然后当你开始一个你做的事情,例如
fadeOutRoutine = StartCoroutine(FadeOut(tilemap,1f));
Run Code Online (Sandbox Code Playgroud)
你可以使用停止它
StopCoroutine(fadeOutRoutine);
Run Code Online (Sandbox Code Playgroud)
或者如果有很多你可以做的例行公事
private List<Coroutine> fadeOutRoutines;
Run Code Online (Sandbox Code Playgroud)
然后当你开始一个你做的事情,例如
fadeOutRoutines.Add(StartCoroutine(FadeOut(tilemap,1f)));
Run Code Online (Sandbox Code Playgroud)
您可以使用以下命令停止特定的(例如最后启动的)例程
var index = fadeOutRoutines.Count - 1;
StopCoroutine(fadeOutRoutines[index]);
fadeOutRoutines.RemoveAt(index);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1462 次 |
| 最近记录: |