141 lines
4.0 KiB
C#
141 lines
4.0 KiB
C#
using System;
|
|
using System.Collections;
|
|
using UnityEngine;
|
|
using UnityEngine.Video;
|
|
|
|
namespace Thousandto.UpdateForm.Movie
|
|
{
|
|
#if UNITY_STANDALONE_WIN
|
|
/// <summary>
|
|
/// 影片播放器
|
|
/// </summary>
|
|
public class PCMoviePlayer : IMoviePlayer
|
|
{
|
|
private string _fileName = null;
|
|
private VideoPlayer _videoPlayer = null;
|
|
private AudioSource _audioSource = null;
|
|
private Renderer _renderer = null;
|
|
private bool _isPlay = false;
|
|
private GameObject _filmGo;
|
|
private MovieAction _finishedCallBack;
|
|
|
|
public PCMoviePlayer()
|
|
{
|
|
_filmGo = InitFilmGo();
|
|
_videoPlayer = _filmGo.AddComponent<VideoPlayer>();
|
|
_audioSource = _filmGo.AddComponent<AudioSource>();
|
|
|
|
_videoPlayer.playOnAwake = false;
|
|
_videoPlayer.renderMode = VideoRenderMode.MaterialOverride;
|
|
_videoPlayer.targetMaterialRenderer = _filmGo.GetComponent<Renderer>();
|
|
_videoPlayer.audioOutputMode = VideoAudioOutputMode.AudioSource;
|
|
_videoPlayer.SetTargetAudioSource(0, _audioSource);
|
|
|
|
_renderer = _filmGo.GetComponent<Renderer>();
|
|
_renderer.enabled = false;
|
|
|
|
_videoPlayer.loopPointReached += OnVideoFinished;
|
|
}
|
|
|
|
public void Play(string fileName, MovieAction finishedCallBack)
|
|
{
|
|
if (!_isPlay)
|
|
{
|
|
_isPlay = true;
|
|
_fileName = fileName;
|
|
_finishedCallBack = finishedCallBack;
|
|
_filmGo.SetActive(true);
|
|
LoadAndPlayVideo();
|
|
}
|
|
}
|
|
|
|
public void Stop()
|
|
{
|
|
_isPlay = false;
|
|
Reset();
|
|
}
|
|
|
|
private void LoadAndPlayVideo()
|
|
{
|
|
string videoPath = Application.streamingAssetsPath + "/" + _fileName;
|
|
if (!System.IO.File.Exists(videoPath))
|
|
{
|
|
Debug.LogError($"Video file not found at {videoPath}");
|
|
Finished();
|
|
return;
|
|
}
|
|
|
|
_videoPlayer.url = "file://" + videoPath;
|
|
_videoPlayer.Prepare();
|
|
_videoPlayer.prepareCompleted += OnVideoPrepared;
|
|
}
|
|
|
|
private void OnVideoPrepared(VideoPlayer source)
|
|
{
|
|
if (_isPlay)
|
|
{
|
|
_renderer.enabled = true;
|
|
_videoPlayer.Play();
|
|
_audioSource.Play();
|
|
}
|
|
}
|
|
|
|
private void OnVideoFinished(VideoPlayer source)
|
|
{
|
|
Finished();
|
|
}
|
|
|
|
private void Reset()
|
|
{
|
|
_isPlay = false;
|
|
|
|
if (_videoPlayer.isPlaying)
|
|
{
|
|
_videoPlayer.Stop();
|
|
}
|
|
|
|
if (_audioSource.isPlaying)
|
|
{
|
|
_audioSource.Stop();
|
|
}
|
|
|
|
_renderer.enabled = false;
|
|
_filmGo.SetActive(false);
|
|
}
|
|
|
|
private void Finished()
|
|
{
|
|
Reset();
|
|
_finishedCallBack?.Invoke();
|
|
}
|
|
|
|
private GameObject InitFilmGo()
|
|
{
|
|
var go = GameObject.CreatePrimitive(PrimitiveType.Plane);
|
|
go.name = "[MoviePlayerGo]";
|
|
go.AddComponent<AudioSource>();
|
|
go.transform.position = Vector3.zero;
|
|
go.transform.eulerAngles = Vector3.zero;
|
|
|
|
float curAspect = (float)Screen.width / (float)Screen.height;
|
|
go.transform.localScale = new Vector3(curAspect, 1, 1);
|
|
|
|
var cameraGo = new GameObject("[MovieCamera]");
|
|
cameraGo.transform.parent = go.transform;
|
|
cameraGo.transform.localPosition = new Vector3(0, 10 * Mathf.Sin(Mathf.PI / 3f), 0);
|
|
cameraGo.transform.localEulerAngles = new Vector3(90, 180, 0);
|
|
cameraGo.transform.localScale = Vector3.one;
|
|
|
|
var cam = cameraGo.AddComponent<Camera>();
|
|
cam.backgroundColor = Color.black;
|
|
cam.depth = 20;
|
|
cam.farClipPlane = 20;
|
|
|
|
cameraGo.AddComponent<AudioListener>();
|
|
|
|
return go;
|
|
}
|
|
}
|
|
#endif
|
|
}
|