当前位置:网站首页>【已解决】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)
等之类的方法。在这种情况,还需查看该方法被调用的对象与位置信息逐一排查。
边栏推荐
- 云原生(三十二) | Kubernetes篇之平台存储系统介绍
- How Jin Cang database correctness verification platform installation file
- Regular expression to match a certain string in the middle
- 【 genius_platform software platform development 】 : seventy-six vs the preprocessor definitions written cow force!!!!!!!!!!(in the other groups conding personnel told so cow force configuration to can
- sql server 安装提示用户名不存在
- Hash table lookup (hash table)
- 甘特图来啦,项目管理神器,模板直接用
- Countdown to 2 days|Cloud native Meetup Guangzhou Station, waiting for you!
- Programmer's Tanabata Romantic Moment
- QT: The Magical QVarient
猜你喜欢
Simple description of linked list and simple implementation of code
21天学习挑战赛(2)图解设备树的使用
mysql can't Execute, please solve it
How Jin Cang database correctness verification platform installation file
人人都在说的数据中台,你需要关注的核心特点是什么?
dmp (dump) dump file
The usage of try...catch and finally in js
剑指offer专项突击版第20天
Everyone in China said data, you need to focus on core characteristic is what?
VSCode Change Default Terminal how to modify the Default Terminal VSCode
随机推荐
Data storage practice based on left-order traversal
链表的简单描述及代码的简单实现
【Daily Training】1403. Minimum Subsequence in Non-Increasing Order
倒计时 2 天|云原生 Meetup 广州站,等你来!
语法基础(变量、输入输出、表达式与顺序语句)
Simple description of linked list and simple implementation of code
金仓数据库如何验证安装文件平台正确性
sql server 安装提示用户名不存在
[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
HDU 1114:Piggy-Bank ← 完全背包问题
你要的七夕文案,已为您整理好!
Solve the problem of port occupancy Port xxxx was already in use
627. Change of gender
How OpenGL works
Object.defineProperty monitors data changes in real time and updates the page
A small tool to transfer files using QR code - QFileTrans 1.2.0.1
云原生(三十二) | Kubernetes篇之平台存储系统介绍
1484. 按日期分组销售产品
通过模拟Vite一起深入其工作原理
tree table lookup