如何等待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组件实现的,可以直接在动画片段中添加完成事件:
- 打开淡出动画片段,在时间轴末尾右键选择Add Event
- 选中事件,在Inspector中选择
Description脚本的通知方法 - 在通知方法中触发保存操作
示例代码:
public class Description : MonoBehaviour { public SavingGame savingGame; // 供Animator事件调用的方法 public void NotifyFadeComplete() { savingGame.Save(); } }
内容的提问来源于stack exchange,提问作者Daniel Lip
相关产品推荐
相关产品推荐

