当前位置:网站首页>【已解决】Unity Coroutinue 协程未有效执行的问题
【已解决】Unity Coroutinue 协程未有效执行的问题
2022-08-05 03:01:00 【野奔在山外的猫】
开发平台:Unity
编程平台:Visual Studio 2020以上
使用语言:C#
问题描述
在调用 频繁被激活/禁用 的对象时,该对象挂载的协程(Coroutine)仅在首次进入 Runtime 模式下执行。后续禁用再激活操作导致该协程内容不可正确运行的问题。
public RectMask2D Mask2D;
public Vector4 Forward;
public void Start()
{
StartCoroutinue(DOLineMove);
}
public IEnumerator DOLineMove()
{
yield return Mask2D.padding -= Forward;
StartCoroutinue(DOLineMove());
}
问题分析
协程 的运行前提是 所挂载的 GameObject 对象保持 Active 状态。注意:协程 在执行或执行自我迭代的过程中,其挂载的 GameObject 对象必须保持 Active 状态)。在 Unity 生命周期中,初始化阶段为 Awake 、 OnEnable 、Start 三个周期阶段。大致如下:
- Awake 阶段用于捕获脚本挂载对象上的 Component 信息。
- OnEnable 阶段用于事件监听注册行为。
- Start 阶段执行入口程序。

当 Editor 首次进入 Runtime 模式时, Initialization 阶段方法将依次被执行。故无论在哪一阶段调用 StartCoroutinue(string methodName) 均有效调用该 IEnumerator 类型。问题显而易见的出现在以下层面:
- 内部调用
StopCoroutinue(string methodName)或StopAllCoroutine()不规范导致。
该两种方法禁用脚本内启用的协程对象。一个仅禁用特定对象,另一个则禁用脚本内所有对象。不规范的使用逻辑容易造成该问题出现。 - 脚本对象 或 脚本对象本身 被来源不明的程序自动禁用与再重启导致协程非正常运行。
例如:Awake 阶段应正确执行协程方法。但同 Awake 周期阶段中,另一脚本内修改(·SetActive()或enable)状态导致。该情况下,协程将未正常运行。结合 Runtime 模式下 Unity 程序执行周期,下次启用后将直接从OnEnable阶段进行。当然,频繁的禁用再启用也会出现问题。(这肯定是人写的BUG)
解决方案:定点排查 谁 在篡改(或是 频繁的)脚本的状态?
排查往往是件麻烦的事情,与项目的代码量息息相关。少则很快解决,多则耗时几小时,甚至一个礼拜都不在话下。或许正是那起初不认为有问题的框架下,在后续的开发中逐渐暴露出隐患问题。最佳的方式是设计遵循 按需加载进场景,而非保留至场景中,激活、禁用。如果已经来不及拯救,那么接下就是唯一可能的有效方法。
1)使用 快速查找 功能逐一排查

Visual Studio 提供 快速查找 的编辑。通常情况下这一功能用于查询关键词。当然,在排查中也有相当作用。因为与禁用、启用相关,搜索代码中 SetAtive() / enable 中关联的内容,逐一确认排查。(耗时 是不可避免的)
2)使用 浏览定义 快速定位引用

在程序可执行任意位置处添加 this.gameObject.SetActive(false) 或 this.enable(true) ,右键关键字 SetActive 或 enable 选择 查看所有引用。Visual Studio 将给予所有使用该关键字的引用语句。可方便快速排查。注意!
- 进行浏览定义时,请确保打开的是该项目的所有程序集。而非个体。
- 部分情况下,存在开发者使用自封装的
GameObjectUtil.Disable(GameObject obj)等之类的方法。在这种情况,还需查看该方法被调用的对象与位置信息逐一排查。
边栏推荐
- Likou - preorder traversal, inorder traversal, postorder traversal of binary tree
- HDU 1114:Piggy-Bank ← 完全背包问题
- Review 51 MCU
- OpenGL 工作原理
- 毕设-基于SSM房屋租赁管理系统
- Why did they choose to fall in love with AI?
- 22-07-31周总结
- Countdown to 2 days|Cloud native Meetup Guangzhou Station, waiting for you!
- 注意潍坊开具发票一般需要注意
- 使用二维码传输文件的小工具 - QFileTrans 1.2.0.1
猜你喜欢

使用二维码传输文件的小工具 - QFileTrans 1.2.0.1

2022-08-04:输入:去重数组arr,里面的数只包含0~9。limit,一个数字。 返回:要求比limit小的情况下,能够用arr拼出来的最大数字。 来自字节。

tree table lookup

How OpenGL works

论治理与创新,2022 开放原子全球开源峰会 OpenAnolis 分论坛圆满落幕

The design idea of DMicro, the Go microservice development framework

dmp (dump) dump file

链表的简单描述及代码的简单实现

腾讯云【Hiflow】新时代自动化工具

Matlab drawing 3
随机推荐
数据增强Mixup原理与代码解读
[Storage] Dawning Storage DS800-G35 ISCSI maps each LUN to the server
mysql tree structure query problem
[In-depth study of 4G/5G/6G topic-51]: URLLC-16-"3GPP URLLC related protocols, specifications, and technical principles in-depth interpretation"-11-High reliability technology-2-Link adaptive enhancem
Ant Sword Advanced Module Development
Lexicon - the maximum depth of a binary tree
链表的简单描述及代码的简单实现
线上MySQL的自增id用尽怎么办?
word分栏小记
VSCode Change Default Terminal 如何修改vscode的默认terminal
21天学习挑战赛(2)图解设备树的使用
private封装
The Tanabata copywriting you want has been sorted out for you!
Error: Not a signal or slot declaration
Details such as compiling pretreatment
虚拟内存原理与技术
How to simulate the background API call scene, very detailed!
Snapback - same tree
dmp(dump)转储文件
mysql can't Execute, please solve it