using System; using System.Collections; using System.Threading.Tasks; using DG.Tweening; using UnityEngine; using UnityEngine.UI; using UnityStandardAssets.Characters.FirstPerson; using Cysharp.Threading.Tasks; using DefaultNamespace.ProcessMode; using Framework.Manager; public class RetiredAssetOutboundManager : MonoBehaviour { public static RetiredAssetOutboundManager Instance; [Header("相机设置")] public GameObject camera1; // 固定相机 public GameObject firstcamera2; // 第一人称相机 [Header("场景对象")] public GameObject che; // 车辆对象 [Header("UI设置")] public Image backimage; // 黑屏Image private bool isStart = false; private void Awake() { Instance = this; } // private async void Start() // { // await StartProcess(); // } /// /// 启动整个流程 /// public async UniTask StartProcess() { if (isStart) return; isStart = true; Debug.Log("=== 开始退出退役资产出库作业流程 ==="); // 初始化状态:第一人称激活 InitializeState(); // 阶段1:瞬间黑屏切换到camera1(不需要淡入) Debug.Log("阶段1:瞬间黑屏切换到固定相机视角"); await InstantFadeOut(() => SwitchToCamera1()); // 阶段2:等待20秒 Debug.Log("阶段2:等待20秒"); await UniTask.Delay(200); // 阶段3:完整的淡入淡出切换回第一人称 Debug.Log("阶段3:淡入淡出切换回第一人称视角"); await FadeInOut(() => SwitchToFirstPerson()); if (MotionFramework.MotionEngine.GetModule()._currentMode == ProcessMode.教学模式 ) { TutorialGuideManager.Instance.NextGuideIn(); } Debug.Log("=== 流程执行完毕 ==="); } /// /// 初始化场景状态 /// private void InitializeState() { firstcamera2.SetActive(true); camera1.SetActive(false); che.SetActive(false); backimage.gameObject.SetActive(false); Debug.Log("初始化完成:第一人称相机激活"); } /// /// 瞬间黑屏过场动画(用于第一次切换) /// /// 在黑屏期间执行的切换动作 private async UniTask InstantFadeOut(System.Action switchAction) { Debug.Log("开始瞬间黑屏过场动画"); // 激活黑屏Image并瞬间设置为黑色 backimage.gameObject.SetActive(true); backimage.color = new Color(0, 0, 0, 1f); // 瞬间黑屏 Debug.Log("瞬间黑屏完成"); // 短暂延迟后执行切换 await UniTask.Delay(200); switchAction?.Invoke(); await UniTask.Delay(500); // 保持黑屏0.5秒 // 淡出到透明 Debug.Log("开始淡出到透明"); backimage.DOFade(0f, 1.5f).SetEase(Ease.OutQuad); await UniTask.Delay(1500); Debug.Log("淡出完成"); // 淡出完成后关闭黑屏Image backimage.gameObject.SetActive(false); } /// /// 完整的淡入淡出过场动画(用于第二次切换) /// /// 在黑屏期间执行的切换动作 private async UniTask FadeInOut(System.Action switchAction) { Debug.Log("开始完整的淡入淡出过场动画"); // 激活黑屏Image并设置为透明 backimage.gameObject.SetActive(true); backimage.color = new Color(0, 0, 0, 0f); // 从透明开始 // 淡入黑屏 Debug.Log("开始淡入黑屏"); backimage.DOFade(1f, 1.5f).SetEase(Ease.InQuad); await UniTask.Delay(1500); Debug.Log("淡入完成"); // 在黑屏期间执行切换 switchAction?.Invoke(); await UniTask.Delay(500); // 保持黑屏0.5秒 // 淡出到透明 Debug.Log("开始淡出到透明"); backimage.DOFade(0f, 1.5f).SetEase(Ease.OutQuad); await UniTask.Delay(1500); Debug.Log("淡出完成"); // 淡出完成后关闭黑屏Image backimage.gameObject.SetActive(false); } /// /// 切换到固定相机视角 /// private void SwitchToCamera1() { // 禁用第一人称控制器 var fpsController = firstcamera2.GetComponent(); if (fpsController != null) { fpsController.enabled = false; } // 切换相机和激活车辆 firstcamera2.SetActive(false); camera1.SetActive(true); che.SetActive(true); Debug.Log("已切换到固定相机,激活车辆"); } /// /// 切换回第一人称视角 /// private void SwitchToFirstPerson() { // 切换相机和关闭车辆 camera1.SetActive(false); che.SetActive(false); firstcamera2.SetActive(true); // 设置第一人称相机位置 firstcamera2.transform.SetLocalPositionAndRotation( new Vector3(6, 1, -12), Quaternion.Euler(0, 0, 0) ); // 重新启用第一人称控制器 var fpsController = firstcamera2.GetComponent(); if (fpsController != null) { fpsController.enabled = true; fpsController.InitController(); } Debug.Log("已切换回第一人称,设置位置并启用控制器"); } /// /// 外部调用接口 /// public async void Show() { await StartProcess(); } /// /// 黑屏过场动画(统一的渐变效果) /// /// 在黑屏期间执行的切换动作 private async UniTask FadeTransition(System.Action switchAction) { Debug.Log("开始黑屏过场动画"); // 激活黑屏Image并设置为透明 backimage.gameObject.SetActive(true); backimage.color = new Color(0, 0, 0, 0f); // 从透明开始 // 淡入黑屏 - 使用UniTaskCompletionSource等待动画完成 Debug.Log("开始淡入黑屏"); var fadeInComplete = new UniTaskCompletionSource(); backimage.DOFade(1f, 1.5f) .SetEase(Ease.InQuad) .OnComplete(() => fadeInComplete.TrySetResult()); await fadeInComplete.Task; Debug.Log($"淡入完成,当前Alpha值: {backimage.color.a}"); // 在黑屏期间执行切换 switchAction?.Invoke(); await UniTask.Delay(500); // 保持黑屏0.5秒 Debug.Log("切换完成"); // 淡出到透明 - 使用UniTaskCompletionSource等待动画完成 Debug.Log("开始淡出到透明"); var fadeOutComplete = new UniTaskCompletionSource(); backimage.DOFade(0f, 1.5f) .SetEase(Ease.OutQuad) .OnComplete(() => fadeOutComplete.TrySetResult()); await fadeOutComplete.Task; Debug.Log($"淡出完成,当前Alpha值: {backimage.color.a}"); // 确保Alpha值为0后再关闭黑屏Image Debug.Log("Image渐变完成,准备关闭"); backimage.gameObject.SetActive(false); Debug.Log("黑屏Image已关闭"); } }