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

如何等待Canvas淡入淡出完成后再执行游戏保存操作?

Unity中等待Canvas淡出后执行保存逻辑的实现方案

下面是几种实用的实现方式,都是Unity开发中常用的异步等待/回调模式:

方法一:协程+回调函数

修改你的Description脚本,让淡出逻辑支持回调,或者封装成可等待的协程,确保保存操作在淡出完成后触发:

步骤1:更新Description脚本

using UnityEngine;
using System.Collections;

public class Description : MonoBehaviour
{
    public CanvasGroup canvasGroup;
    public float fadeDuration = 0.5f;

    // 封装淡出逻辑为带回调的协程
    public IEnumerator FadeOutCoroutine(System.Action onFadeComplete)
    {
        float elapsedTime = 0f;
        float startAlpha = canvasGroup.alpha;

        while (elapsedTime < fadeDuration)
        {
            elapsedTime += Time.deltaTime;
            canvasGroup.alpha = Mathf.Lerp(startAlpha, 0f, elapsedTime / fadeDuration);
            yield return null;
        }

        canvasGroup.alpha = 0f;
        // 淡出完成后执行传入的回调
        onFadeComplete?.Invoke();
    }
}

步骤2:修改SavingGame的调用逻辑

在SavingGame中启动协程,把保存方法作为回调传入:

using UnityEngine;

public class SavingGame : MonoBehaviour
{
    public Description description;

    // 供UI按钮调用的入口方法
    public void StartSaveProcess()
    {
        StartCoroutine(description.FadeOutCoroutine(Save));
    }

    public void Save()
    {
        // 这里写你的截图、游戏文件保存逻辑
        Debug.Log("开始执行保存操作");
        // ...
    }
}

方法二:事件/委托机制

通过事件通知的方式,让Description在淡出完成时广播事件,SavingGame订阅事件后执行保存:

步骤1:在Description中定义事件

using UnityEngine;
using System.Collections;

public class Description : MonoBehaviour
{
    public CanvasGroup canvasGroup;
    public float fadeDuration = 0.5f;
    // 定义淡出完成事件
    public System.Action OnFadeOutComplete;

    // 供UI按钮触发淡出的方法
    public void TriggerFadeOut()
    {
        StartCoroutine(FadeOutRoutine());
    }

    private IEnumerator FadeOutRoutine()
    {
        float elapsedTime = 0f;
        float startAlpha = canvasGroup.alpha;

        while (elapsedTime < fadeDuration)
        {
            elapsedTime += Time.deltaTime;
            canvasGroup.alpha = Mathf.Lerp(startAlpha, 0f, elapsedTime / fadeDuration);
            yield return null;
        }

        canvasGroup.alpha = 0f;
        // 触发事件通知外部
        OnFadeOutComplete?.Invoke();
    }
}

步骤2:在SavingGame中订阅事件

using UnityEngine;

public class SavingGame : MonoBehaviour
{
    public Description description;

    private void OnEnable()
    {
        // 订阅淡出完成事件
        description.OnFadeOutComplete += Save;
    }

    private void OnDisable()
    {
        // 取消订阅,避免内存泄漏
        description.OnFadeOutComplete -= Save;
    }

    // 供UI按钮调用的入口方法
    public void StartSaveProcess()
    {
        description.TriggerFadeOut();
    }

    public void Save()
    {
        // 执行保存逻辑
        Debug.Log("执行保存操作");
        // ...
    }
}

方法三:Animator动画完成事件(若用Animator实现淡入淡出)

如果你的Canvas淡入淡出是用Unity Animator组件实现的,可以直接在动画片段中添加完成事件:

  1. 打开淡出动画片段,在时间轴末尾右键选择Add Event
  2. 选中事件,在Inspector中选择Description脚本的通知方法
  3. 在通知方法中触发保存操作

示例代码:

public class Description : MonoBehaviour
{
    public SavingGame savingGame;

    // 供Animator事件调用的方法
    public void NotifyFadeComplete()
    {
        savingGame.Save();
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 14:45:37