BITKit/Packages/Runtime~/Unity/Common/Scripts/UX/VideoPlayer/UXVideoPlayer.cs

144 lines
4.7 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Video;
using BITKit;
using System.Threading.Tasks;
using UnityEngine.UIElements;
using Cysharp.Threading.Tasks;
namespace BITKit.UX
{
public class UXVideoPlayer : UXElement<VisualElement>, IProvider<VideoClip>
{
const string _minimizeContainer = "minimize-container";
const string _maximizeContainer = "maximize-container";
const string _closeButton = "close-button";
const string _maximizeButton = "maximize-button";
const string _minimizeButton = "minimize-button";
const string _videoName = "videoName-label";
const string _playerSlider = "player-slider";
const string _playButton = "play-button";
const string _totalTimeLabel = "totalTime-label";
const string _currentTimeLabel = "currentTime-label";
[Header(Constant.Header.Settings)]
public bool isMaximize;
public bool log;
public bool autoPlay;
[Header(Constant.Header.Components)]
public BITKit.Media.VideoPlayer videoPlayer;
[Header(Constant.Header.InternalVariables)]
Vector2 windowPosition;
VisualElement minimizeContainer;
VisualElement maximizeContainer;
public void Play(VideoClip clip)
{
videoPlayer.Stop();
Set(clip);
videoPlayer.player.Prepare();
videoPlayer.player.time = 0;
if (autoPlay)
{
videoPlayer.Play();
}
else
{
videoPlayer.Prepare();
}
foreach (var x in visualElement.Query<Label>(_videoName).ToList())
{
x.text = clip.name;
}
SetActive(true);
if (isMaximize)
{
Maximize();
}
else
{
Minimize();
}
}
public override void OnStart()
{
document.sortingOrder = 8;
base.OnStart();
minimizeContainer = visualElement.Q(_minimizeContainer);
maximizeContainer = visualElement.Q(_maximizeContainer);
foreach (var x in visualElement.Query<Button>(_minimizeButton).ToList())
{
x.clicked += Minimize;
}
foreach (var x in visualElement.Query<Button>(_maximizeButton).ToList())
{
x.clicked += Maximize;
}
foreach (var x in visualElement.Query<Button>(_closeButton).ToList())
{
x.clicked += Close;
}
foreach (var x in visualElement.Query<Button>(_playButton).ToList())
{
videoPlayer.onPlay.AddListener(SwitchToPlaying);
videoPlayer.onStartPlay.AddListener(SwitchToPlaying);
videoPlayer.onPause.AddListener(SwitchToStop);
videoPlayer.onStopPlay.AddListener(SwitchToStop);
x.clicked += videoPlayer.PlayOrPause;
void SwitchToPlaying()
{
x.AddToClassList("paused");
}
void SwitchToStop()
{
x.RemoveFromClassList("paused");
}
}
foreach (var x in visualElement.Query<Slider>(_playerSlider).ToList())
{
x.RegisterValueChangedCallback(x =>
{
videoPlayer.SetNormalizeTime(x.newValue);
});
videoPlayer.onTime.AddListener(x.SetValueWithoutNotify);
videoPlayer.onStopPlay.AddListener(() => x.SetValueWithoutNotify(0));
}
foreach (var x in visualElement.Query<Label>(_totalTimeLabel).ToList())
{
videoPlayer.onSetTotalTimeAsString.AddListener(y => x.text = y);
}
foreach (var x in visualElement.Query<Label>(_currentTimeLabel).ToList())
{
videoPlayer.onTimeAsString.AddListener(y => x.text = y);
}
Close();
}
VideoClip IProvider<VideoClip>.Get()
{
return videoPlayer.player.clip;
}
public void Set(VideoClip t)
{
videoPlayer.player.clip = t;
}
void Close()
{
videoPlayer.Stop();
SetActive(false);
}
void Minimize()
{
minimizeContainer.SetActive(true);
maximizeContainer.SetActive(false);
}
void Maximize()
{
minimizeContainer.SetActive(false);
maximizeContainer.SetActive(true);
}
}
}