unityzgy/Assets/ThirdPackages/VideoController/Scripts/VideoController.cs
ayuan9957 bf12e02276 feat: 多语言本地化系统 - 支持中/英/法/俄实时切换
- LocalizationManager: 新增翻译表(SetFormatted/SetDuration/LocalizeOperateMsg)
- LoginPanel: InputField placeholder本地化、字体颜色保持
- HistoryPanel: 用时数据本地化、placeholder本地化
- RecordDetailPanel: 操作详情消息本地化(LanguageChanged重建)
- AppraiseWindowBase: 评价等级本地化、操作消息重建
- EditorAppraiser: 所有评估消息改用InjectOperateMsgLocalized
- StudentOperateRecorder: 新增InjectOperateMsgLocalized方法
- LocalizationLanguageTestBar: 单例模式、ScreenSpaceOverlay筛选
- 字体切换时保留颜色和verticalOverflow
2026-07-16 10:05:59 +08:00

237 lines
6.2 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections;
using System.Diagnostics.Contracts;
using System.IO;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
using UnityEngine.Video;
using XFramework;
public class VideoController : MonoBehaviour, IDragHandler, IPointerClickHandler
{
[SerializeField] private VideoPlayer videoPlayer;
[SerializeField] private Image videoProgress;
[SerializeField] private Image playControllerImg;
[SerializeField] private Sprite playSprite;
[SerializeField] private Sprite pauseSprite;
[SerializeField] private Text VideoTotalTime;
[SerializeField] private Text VideoNowTime;
[SerializeField] private Text VideoNametext;
[SerializeField] private Slider audioSlider;
public RenderTexture RD;
private float videoTimeCount;
/// <summary>
/// 正在使用视频控件事件
/// </summary>
public event Action videoControlling;
/// <summary>
/// 视频暂停事件
/// </summary>
public event Action videoPause;
private bool isPause;
/// <summary>
/// 当前视频的播放状态
/// </summary>
/// <value></value>
public bool IsPause
{
get => isPause;
}
/// <summary>
/// 当前要播放视频的名称
/// </summary>
public string VideoName = string.Empty;
public string VideoPath = string.Empty;
public GameObject videoPanel;
//private void OnEnable()
//{
// if (this.VideoPath == string.Empty)
// {
// Debug.LogError("无效的视频路径");
// VideoNametext.text = "无效的视频路径!";
// return;
// }
// Init();
//}
/// <summary>
/// 播放视频
/// </summary>
/// <param name="path"></param>
/// <param name="name"></param>
public void PlayVideo(string path)
{
this.gameObject.SetActive(true);
if (path == string.Empty)
{
Debug.LogError("无效的视频路径");
VideoNametext.text = "无效的视频路径!";
return;
}
this.VideoPath = path;
this.VideoName = Path.GetFileName(path);
Init();
}
private void Start()
{
if (this.VideoName == string.Empty) return;
audioSlider.onValueChanged.AddListener(SetVideoAuido);
videoPlayer.loopPointReached += (vd) =>
{
playControllerImg.sprite = pauseSprite;
videoPause?.Invoke();
isPause = true;
};
videoPlayer.prepareCompleted += (v) =>
{
videoTimeCount = (float) videoPlayer.length;
VideoTotalTime.text = ((int) videoTimeCount / 60).ToString("D2") + ":" +
((int) (videoTimeCount) % 60).ToString("D2");
UpdateVideoTimeText();
playControllerImg.sprite = playSprite;
};
videoPlayer.Prepare();
}
/// <summary>
/// 对视频信息执行一些初始化
/// </summary>
private void Init()
{
videoPlayer.source = VideoSource.Url;
videoPlayer.url = VideoPath;
VideoNametext.text = VideoName;
}
/// <summary>
/// 打开并播放指定视频
/// </summary>
/// <param name="videoname">播放视频的名字视频放在StreamingAssets下</param>
public void OpenAndPlayByName(string videoname)
{
//如果为切换视频
// if (this.videoName!=string.Empty&&this.videoName.Equals(videoName)&&videoPanel.activeSelf)Init();
this.VideoName = videoname;
videoPanel.gameObject.SetActive(true);
}
/// <summary>
/// 关闭当前视频面板,释放视频资源
/// </summary>
public void CloseVideo()
{
RD.Release();
RD.DiscardContents();
videoPlayer.Stop();
videoProgress.fillAmount = 0;
videoPanel.gameObject.SetActive(false);
}
/// <summary>
/// 暂停、播放视频控制
/// </summary>
public void PlayController()
{
if (videoPlayer.isPlaying)
{
videoPlayer.Pause();
isPause = true;
playControllerImg.sprite = pauseSprite;
videoPause?.Invoke();
}
else
{
videoPlayer.Play();
isPause = false;
playControllerImg.sprite = playSprite;
videoControlling?.Invoke();
}
}
private void Update()
{
if (videoPlayer.frameCount > 0)
{
UpdateVideoTimeText();
}
}
//private string LoadVideoByStreamFolder(string videoName)
//{
// //string path = "file://" + Application.streamingAssetsPath + "/" + videoName + ".mp4";
// string path = StreamingAssetsManager.GetPath(videoName);
// return path;
//}
/// <summary>
/// 更新视频的播放时间
/// </summary>
private void UpdateVideoTimeText()
{
videoProgress.fillAmount = ((float) videoPlayer.frame / (float) videoPlayer.frameCount);
VideoNowTime.text = ((int) videoPlayer.time / 60).ToString("D2") + ":" +
((int) videoPlayer.time % 60).ToString("D2");
}
public void OnDrag(PointerEventData eventData)
{
TrySkip(eventData);
}
public void OnPointerClick(PointerEventData eventData)
{
TrySkip(eventData);
}
private void TrySkip(PointerEventData eventData)
{
Vector2 localPoint;
if (RectTransformUtility.ScreenPointToLocalPointInRectangle(videoProgress.rectTransform, eventData.position,
null, out localPoint))
{
float pct = Mathf.InverseLerp(videoProgress.rectTransform.rect.xMin,
videoProgress.rectTransform.rect.xMax,
localPoint.x);
SkipToTarget(pct);
}
}
private void SkipToTarget(float pct)
{
var frame = videoPlayer.frameCount * pct;
videoPlayer.frame = (long) frame;
videoPlayer.Play();
isPause = false;
videoControlling?.Invoke();
playControllerImg.sprite = playSprite;
}
private void SetVideoAuido(float v)
{
videoControlling?.Invoke();
if (videoPlayer.canSetDirectAudioVolume)
{
videoPlayer.SetDirectAudioVolume(0, v);
}
}
}