using System; using Cysharp.Threading.Tasks; using DG.Tweening; using Stary.Evo; using Stary.Evo.AudioCore; using Stary.Evo.UIFarme; using UnityEngine; using UnityEngine.UI; using UnityEngine.Video; using YooAsset; public class VideoPanel : BasePanel { private Transform area; private RawImage intro; private GameObject prospect; private GameObject bg; private Animator _animator; private VideoPlayer videoPlayer; private AudioSource audioSource; private RenderTexture renderTexture; public VideoPanel() { } public override UITweenType TweenType => UITweenType.Fade; public override void Initialize(GameObject panelGo) { base.Initialize(panelGo); area = activePanel.transform.Find("Area"); intro = area.Find("Intro").GetComponent(); prospect = area.Find("prospect").gameObject; bg = area.Find("bg").gameObject; videoPlayer = area.GetComponentInChildren(); audioSource = area.GetComponentInChildren(); _animator = area.GetComponentInChildren(); } public override void OnEnter(Action complete = null) { base.OnEnter(complete); this.RegisterEvent(ModeType.VideoStart, OnStartMove); this.RegisterEvent(ModeType.VideoEnd, OnStopMove); } public override void OnExit(float delay = 0) { base.OnExit(delay); this.UnRegisterEvent(ModeType.VideoStart, OnStartMove); this.UnRegisterEvent(ModeType.VideoEnd, OnStopMove); } private void OnStartMove(VideoInfo info) { if (info.filename.Equals("")) { Debug.LogError("UnityEvo:视频文件名为空,必须传文件名才能执行"); return; } if (info.position != null) { activePanel.transform.position = info.position.SetVector3Ctor(); } if (info.rotation != null) { activePanel.transform.rotation = Quaternion.Euler(info.rotation.SetVector3Ctor()); } if (info.scale != null) { activePanel.transform.DOScale(info.scale.SetVector3Ctor(), 0.5f); } OnStartMove(info.filename, info.videoframeName, info.callback, info.isFixedSize); } private async void OnStartMove(string fileName, string videoframeName, Action callback, bool isFixedSize) { if (isFixedSize) { _animator.gameObject.SetActive(false); bg.SetActive(false); prospect.SetActive(false); } else { _animator.gameObject.SetActive(true); bg.SetActive(true); prospect.SetActive(true); } var mainpackage = YooAssets.TryGetPackage("Main"); var videoframeHandle = mainpackage.LoadAssetAsync(videoframeName); await videoframeHandle.Task; bg.GetComponent().sprite = videoframeHandle.GetAssetObject(); //新增renderTexture创建 if (videoPlayer.isPlaying) { videoPlayer.Stop(); //释放renderTexture if (renderTexture != null) { renderTexture.Release(); renderTexture = null; } } var videHandle = YooAssets.LoadAssetAsync(fileName); await videHandle.Task; Debug.Log("UnityEvo:开始播放视频:" + fileName); VideoClip videoClip = videHandle.GetAssetObject(); renderTexture = new RenderTexture((int)videoClip.width, (int)videoClip.height, 24); videoPlayer.targetTexture = renderTexture; intro.texture = renderTexture; intro.SetNativeSize(); var musicHandle = YooAssets.LoadAssetAsync(fileName + "_mp3"); await musicHandle.Task; videoPlayer.source = VideoSource.VideoClip; videoPlayer.clip = videoClip; Debug.Log("UnityEvo:开始播放视频的音频:" + fileName + "_mp3"); AudioClip audioClip = musicHandle.GetAssetObject(); audioSource.clip = audioClip; //等待视频加载完成 videoPlayer.Prepare(); videoPlayer.prepareCompleted += (source) => { _animator.Play("vid_maskAni", 0, 0); //预加载 if (videoPlayer.isPrepared) { videoPlayer.Play(); audioSource.Play(); } }; videoPlayer.loopPointReached += (source) => { OnStopMove(); callback?.Invoke(); }; videoPlayer.errorReceived += (source, error) => { Debug.LogError($"视频播放失败:{error}"); }; } private void OnStopMove() { Debug.Log("UnityEvo:视频播放完成"); AudioCoreManager.SetMusicVolume(2f, 1f); _animator.Play("vid_maskDefault", 0, 0); if (renderTexture != null) { renderTexture.Release(); renderTexture = null; } if (audioSource.isPlaying) { audioSource.Stop(); } PanelSystem.PopQueue(); } public struct VideoInfo { public string filename; public string videoframeName; public Vector3Ctor position; public Vector3Ctor rotation; public Vector3Ctor scale; public Action callback; public bool isFixedSize; } }