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);
}
}