Unity Editor执行脚本时卡顿无报错问题求助
Unity Editor执行脚本卡顿问题排查与解决
执行脚本时编辑器出现卡顿(仍可响应),无任何警告或错误提示,修改其他else if分支后问题依旧。相关代码片段如下:
public partial class UseItem() { ... else if (this.item[this.itemSelected] == 5) { Ray ray3 = Camera.main.ScreenPointToRay(new Vector3((float)(Screen.width / 2), (float)(Screen.height / 2), 0f)); RaycastHit raycastHit3; if (Physics.Raycast(ray3, out raycastHit3)) { if (raycastHit3.collider.name == "BSODAMachine" && Vector3.Distance(playerTransform.position, raycastHit3.transform.position) <= 10f) { ResetItem(); raycastHit3.collider.gameObject.name = "EmptyMachine"; raycastHit3.collider.gameObject.transform.GetChild(0).gameObject.GetComponent<MeshRenderer>().material = OutOfBsoda; raycastHit3.collider.gameObject.GetComponent<AudioSource>().Play(); while (raycastHit3.collider.gameObject.GetComponent<AudioSource>().isPlaying) { } CollectItem(4); } ... }
问题根源
代码中的空while循环会阻塞Unity主线程,直到音频播放完毕。Unity主线程负责处理渲染、输入、脚本逻辑等核心操作,被持续占用时就会出现编辑器卡顿现象。
解决方法
用Unity的协程(Coroutine)替代同步阻塞的while循环,让音频等待逻辑在后台执行,不占用主线程:
- 替换原有的while循环部分:
// 先缓存AudioSource引用,避免重复调用GetComponent AudioSource audioSource = raycastHit3.collider.gameObject.GetComponent<AudioSource>(); audioSource.Play(); // 启动协程等待音频结束后执行收集逻辑 StartCoroutine(WaitForAudioFinish(audioSource));
- 实现对应的协程方法:
private IEnumerator WaitForAudioFinish(AudioSource audioSource) { // 等待音频播放结束 yield return new WaitWhile(() => audioSource.isPlaying); // 音频结束后执行收集操作 CollectItem(4); }
额外优化建议
- 避免频繁调用
GetComponent,提前缓存组件引用可以减少性能开销; - 字符串比较
raycastHit3.collider.name == "BSODAMachine"效率较低,建议改用标签(Tag),通过raycastHit3.collider.CompareTag("BSODAMachine")判断,或者给目标物体添加专属脚本作为标识; - 用
Vector3.SqrMagnitude替代Vector3.Distance做距离判断:(playerTransform.position - raycastHit3.transform.position).sqrMagnitude <= 100f(10的平方),减少开方运算的性能消耗。
内容的提问来源于stack exchange,提问作者Kostya Salo
相关产品推荐
相关产品推荐

