You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
    }
}
关键修改说明
  1. 组件缓存:通过Inspector拖拽赋值所有需要的组件,彻底移除GameObject.Find,提升性能和稳定性
  2. 协程流程:把胜利界面显示、玩家淡入、场景加载的顺序用协程串联,逻辑清晰且容易调整时间参数
  3. 平滑淡入:用Mathf.Lerp实现线性透明度变化,适配不同帧率,避免区间判断的冗余问题
  4. 初始状态控制:在Start里初始化胜利文本的隐藏状态,避免意外显示

内容的提问来源于stack exchange,提问作者Kona79

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 05:05:21