using UniRx; using UnityEngine; /// /// Leviathan 视频 NPC:待机循环、成功/大三消各一段一次性视频,资源在本组件上拖拽(不必再依赖解码器上的 bytesFile)。 /// public class EventMatchNpcLeviathanPresenter : EventMatchNpcPresenter { [SerializeField] LeviathanVideoDecoderBase decoder; [SerializeField] TextAsset idleVideo; [SerializeField] TextAsset successVideo; [SerializeField] TextAsset successMoreVideo; void Awake() { if (decoder == null) decoder = GetComponent(); } void Start() { if (decoder == null) return; decoder.Stop(); PlayIdleInternal(); } void OnDestroy() { if (decoder != null) decoder.OnPlayCompleted -= OnSuccessClipCompleted; } /// /// 多线程解码时 OnPlayCompleted 可能来自解码线程,需回到主线程再 Stop/PlayVideo。 /// void OnSuccessClipCompleted() { if (decoder != null) decoder.OnPlayCompleted -= OnSuccessClipCompleted; MainThreadDispatcher.Post(_ => ApplySuccessFinishedOnMainThread(), null); } void ApplySuccessFinishedOnMainThread() { if (this == null) return; PlayIdleInternal(); } void PlaySuccessClipInternal(TextAsset clip) { decoder.OnPlayCompleted -= OnSuccessClipCompleted; decoder.Stop(); decoder.SetLooping(false); decoder.OnPlayCompleted += OnSuccessClipCompleted; int ret = decoder.PlayVideo(clip, decoder.AlphaType, multithreadedDecode: true); if (ret != 0) { decoder.OnPlayCompleted -= OnSuccessClipCompleted; PlayIdleInternal(); } } public override void PlayMatchReaction(bool isSuccessMore) { TextAsset clip = isSuccessMore ? successMoreVideo : successVideo; if (decoder == null || clip == null) { PlayIdleInternal(); return; } // 已在播成功/大三消等非待机视频时,不打断、不重切 if (decoder.IsPlaying && idleVideo != null && decoder.bytesFile != null && decoder.bytesFile != idleVideo) return; decoder.OnPlayCompleted -= OnSuccessClipCompleted; PlaySuccessClipInternal(clip); } void PlayIdleInternal() { if (decoder == null || idleVideo == null) return; decoder.Stop(); decoder.SetLooping(true); decoder.PlayVideo(idleVideo, decoder.AlphaType, multithreadedDecode: true); } }