Unity场景加载延迟失效求助:进入Portal后直接跳转场景
问题分析
你的代码里场景立即跳转的核心原因大概率是**menuCounter的初始值未正确设置为0**(如果在Inspector面板里把它设成了小于0.2的数值,Update会直接触发场景加载)。另外,代码存在几个不合理的地方:
- Update里频繁调用
GameObject.Find,性能差且容易引发空引用错误 - 用一堆区间判断实现淡入效果,逻辑冗余且容易出现帧率适配问题
- 淡入逻辑针对的是名为"Sprite"的对象,而非玩家自身,不符合你要的"玩家淡入Portal"需求
解决方案
改用协程处理流程逻辑,缓存组件引用避免重复查找,用平滑的透明度插值实现淡入效果:
using UnityEngine; using UnityEngine.SceneManagement; using TMPro; using System.Collections; public class Portal : MonoBehaviour { public int nextSceneLoad; // 在Inspector面板直接拖拽赋值,避免Find [SerializeField] private Movement playerMovement; [SerializeField] private Rigidbody2D playerRb; [SerializeField] private SpriteRenderer playerSprite; [SerializeField] private TextMeshProUGUI stageClearText; [SerializeField] private AudioSource stageClearSound; [SerializeField] private AudioSource musicControl; private void Start() { nextSceneLoad = SceneManager.GetActiveScene().buildIndex + 1; // 初始化胜利文本为隐藏状态 stageClearText.enabled = false; stageClearSound.enabled = false; } private void OnTriggerEnter2D(Collider2D other) { if (other.CompareTag("Player")) { if (SceneManager.GetActiveScene().buildIndex == 4) { Debug.Log("所有关卡已完成"); // 这里添加最终胜利界面逻辑 return; } // 解锁下一关 if (nextSceneLoad > PlayerPrefs.GetInt("levelAt")) { PlayerPrefs.SetInt("levelAt", nextSceneLoad); } // 启动流程协程 StartCoroutine(PortalSequence()); } } private IEnumerator PortalSequence() { // 1. 禁用玩家控制,显示胜利界面,播放音效 playerMovement.enabled = false; playerRb.bodyType = RigidbodyType2D.Static; stageClearText.enabled = true; stageClearSound.Play(); musicControl.enabled = false; // 2. 显示胜利界面2秒 yield return new WaitForSeconds(2f); // 3. 玩家淡入(逐渐透明),持续1秒 float fadeDuration = 1f; float elapsedTime = 0f; Color originalColor = playerSprite.color; while (elapsedTime < fadeDuration) { elapsedTime += Time.deltaTime; float alpha = Mathf.Lerp(1f, 0f, elapsedTime / fadeDuration); playerSprite.color = new Color(originalColor.r, originalColor.g, originalColor.b, alpha); yield return null; } // 4. 延迟0.5秒后加载下一场景 yield return new WaitForSeconds(0.5f); SceneManager.LoadScene(nextSceneLoad); } }
关键修改说明
- 组件缓存:通过Inspector拖拽赋值所有需要的组件,彻底移除
GameObject.Find,提升性能和稳定性 - 协程流程:把胜利界面显示、玩家淡入、场景加载的顺序用协程串联,逻辑清晰且容易调整时间参数
- 平滑淡入:用
Mathf.Lerp实现线性透明度变化,适配不同帧率,避免区间判断的冗余问题 - 初始状态控制:在Start里初始化胜利文本的隐藏状态,避免意外显示
内容的提问来源于stack exchange,提问作者Kona79
相关产品推荐
相关产品推荐

