|
|
@@ -1,125 +1,201 @@
|
|
|
using UnityEngine;
|
|
|
using UnityEngine.UI;
|
|
|
using UnityEngine.Video;
|
|
|
+using UnityEngine.SceneManagement;
|
|
|
|
|
|
-public class StandbyVideoManager : MonoBehaviour
|
|
|
+namespace MyInfraredInsertcoin
|
|
|
{
|
|
|
- public RawImage videoDisplay; // UI上的RawImage
|
|
|
- public VideoPlayer videoPlayer; // VideoPlayer 组件
|
|
|
- public GameObject uiPanel; // UI 界面的根面板
|
|
|
- public float standbyTime = 10f; // 待机时间(秒)
|
|
|
- public RenderTexture renderTexture; // 用于渲染视频的 RenderTexture
|
|
|
+ public class StandbyVideoManager : MonoBehaviour
|
|
|
+ {
|
|
|
+ public RawImage videoDisplay; // UI上的RawImage
|
|
|
+ public VideoPlayer videoPlayer; // VideoPlayer 组件
|
|
|
+ public GameObject uiPanel; // UI 界面的根面板
|
|
|
+ public float standbyTime = 180f; // 待机时间(秒)
|
|
|
+ public RenderTexture renderTexture; // 用于渲染视频的 RenderTexture
|
|
|
|
|
|
- private bool isVideoPlaying = false;
|
|
|
- private float lastInputTime;
|
|
|
+ private bool isVideoPlaying = false;
|
|
|
+ private float lastInputTime;
|
|
|
|
|
|
- public static StandbyVideoManager _ins;
|
|
|
+ // 控制外部是否启用用户输入检测
|
|
|
+ public bool isUserInputEnabled = true;
|
|
|
|
|
|
- public static void Create()
|
|
|
- {
|
|
|
- if (_ins) return;
|
|
|
+ private bool isHomeScene = false; // 标记是否在 Home 场景
|
|
|
|
|
|
- GameObject o = Instantiate(Resources.Load<GameObject>("StandbyVideoManager"));
|
|
|
- DontDestroyOnLoad(o);
|
|
|
- _ins = o.GetComponent<StandbyVideoManager>();
|
|
|
+ public static StandbyVideoManager _ins;
|
|
|
|
|
|
- //添加一个父物体
|
|
|
- o.transform.SetParent(ViewMgr.Instance.transform.Find("1").transform);
|
|
|
- CanvasScaler canvasScaler = o.GetComponent<CanvasScaler>();
|
|
|
- if (canvasScaler != null)
|
|
|
+ public static void Create()
|
|
|
{
|
|
|
- Destroy(canvasScaler);
|
|
|
+ if (_ins) return;
|
|
|
+
|
|
|
+ GameObject o = Instantiate(Resources.Load<GameObject>("StandbyVideoManager"));
|
|
|
+ DontDestroyOnLoad(o);
|
|
|
+ _ins = o.GetComponent<StandbyVideoManager>();
|
|
|
+
|
|
|
+ // 添加一个父物体
|
|
|
+ o.transform.SetParent(ViewMgr.Instance.transform.Find("1").transform);
|
|
|
+ CanvasScaler canvasScaler = o.GetComponent<CanvasScaler>();
|
|
|
+ if (canvasScaler != null)
|
|
|
+ {
|
|
|
+ Destroy(canvasScaler);
|
|
|
+ }
|
|
|
+ Canvas canvas = o.GetComponent<Canvas>();
|
|
|
+ canvas.overrideSorting = true;
|
|
|
+
|
|
|
+ RectTransform rectTransform = o.GetComponent<RectTransform>();
|
|
|
+ rectTransform.anchorMin = Vector2.zero; // 左下角对齐父级
|
|
|
+ rectTransform.anchorMax = Vector2.one; // 右上角对齐父级
|
|
|
+ rectTransform.offsetMin = Vector2.zero; // 移除左下角偏移
|
|
|
+ rectTransform.offsetMax = Vector2.zero; // 移除右上角偏移
|
|
|
+ rectTransform.localScale = Vector3.one; // 确保缩放为 1
|
|
|
+
|
|
|
+ // 激活 videoDisplay 并开始播放视频
|
|
|
+ _ins.PlayStandbyVideo();
|
|
|
}
|
|
|
|
|
|
- RectTransform rectTransform = o.GetComponent<RectTransform>();
|
|
|
- rectTransform.anchorMin = Vector2.zero; // 左下角对齐父级
|
|
|
- rectTransform.anchorMax = Vector2.one; // 右上角对齐父级
|
|
|
- rectTransform.offsetMin = Vector2.zero; // 移除左下角偏移
|
|
|
- rectTransform.offsetMax = Vector2.zero; // 移除右上角偏移
|
|
|
- rectTransform.localScale = Vector3.one; // 确保缩放为 1
|
|
|
-
|
|
|
- // 激活 videoDisplay 并开始播放视频
|
|
|
- _ins.TriggerStandbyMode();
|
|
|
- }
|
|
|
+ void Awake()
|
|
|
+ {
|
|
|
+ // 订阅场景加载事件
|
|
|
+ SceneManager.sceneLoaded += OnSceneLoaded;
|
|
|
+ }
|
|
|
|
|
|
- void Start()
|
|
|
- {
|
|
|
- // 确保 RawImage 的纹理是设置为 RenderTexture
|
|
|
- videoDisplay.texture = renderTexture;
|
|
|
+ void OnDisable()
|
|
|
+ {
|
|
|
+ // 取消订阅场景加载事件
|
|
|
+ SceneManager.sceneLoaded -= OnSceneLoaded;
|
|
|
+ }
|
|
|
|
|
|
- // 确保 VideoPlayer 的 targetTexture 正确设置
|
|
|
- videoPlayer.targetTexture = renderTexture;
|
|
|
+ private void OnSceneLoaded(Scene scene, LoadSceneMode mode)
|
|
|
+ {
|
|
|
+ ResetIdleTimer();
|
|
|
+ // 如果加载的场景是 "Home" 场景,标记为 true
|
|
|
+ if (scene.name == "Home")
|
|
|
+ {
|
|
|
+ isHomeScene = true;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ isHomeScene = false;
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- // 初始时隐藏视频
|
|
|
- // videoDisplay.gameObject.SetActive(false);
|
|
|
- videoPlayer.loopPointReached += OnVideoEnd; // 监听视频播放完毕
|
|
|
- videoPlayer.isLooping = true; // 设置视频循环播放
|
|
|
+ void Start()
|
|
|
+ {
|
|
|
+ // 确保 RawImage 的纹理是设置为 RenderTexture
|
|
|
+ videoDisplay.texture = renderTexture;
|
|
|
|
|
|
- ResetIdleTimer(); // 初始化计时器
|
|
|
- }
|
|
|
+ // 确保 VideoPlayer 的 targetTexture 正确设置
|
|
|
+ videoPlayer.targetTexture = renderTexture;
|
|
|
+ videoPlayer.loopPointReached += OnVideoEnd; // 监听视频播放完毕
|
|
|
+ videoPlayer.isLooping = true; // 设置视频循环播放
|
|
|
|
|
|
- public void PlayStandbyVideo()
|
|
|
- {
|
|
|
- // 先确保 videoDisplay 可见
|
|
|
- videoDisplay.gameObject.SetActive(true); // 显示视频
|
|
|
- videoPlayer.Play();
|
|
|
- isVideoPlaying = true;
|
|
|
- }
|
|
|
+ // 获取视频的宽高比并应用到 AspectRatioFitter
|
|
|
+ AspectRatioFitter aspectFitter = videoDisplay.GetComponent<AspectRatioFitter>();
|
|
|
+ float aspectRatio = (float)videoPlayer.width / videoPlayer.height;
|
|
|
+ aspectFitter.aspectRatio = aspectRatio;
|
|
|
|
|
|
- public void StopVideo()
|
|
|
- {
|
|
|
- videoPlayer.Stop();
|
|
|
- videoDisplay.gameObject.SetActive(false); // 隐藏视频
|
|
|
- isVideoPlaying = false;
|
|
|
- ResetIdleTimer();
|
|
|
- }
|
|
|
+ ResetIdleTimer(); // 初始化计时器
|
|
|
+ }
|
|
|
|
|
|
+ // 进入待机视频
|
|
|
+ public void PlayStandbyVideo()
|
|
|
+ {
|
|
|
+ uiPanel.SetActive(true); // 显示视频
|
|
|
+ videoPlayer.Play();
|
|
|
+ isVideoPlaying = true;
|
|
|
+ }
|
|
|
|
|
|
- void Update()
|
|
|
- {
|
|
|
- DetectUserInput();
|
|
|
+ // 停止视频并重置定时器
|
|
|
+ public void StopAndReset()
|
|
|
+ {
|
|
|
+ videoPlayer.Stop();
|
|
|
+ uiPanel.SetActive(false); // 隐藏视频
|
|
|
+ isVideoPlaying = false;
|
|
|
+ ResetIdleTimer();
|
|
|
+ }
|
|
|
|
|
|
- // 判断是否达到待机时间
|
|
|
- if (!isVideoPlaying && Time.time - lastInputTime > standbyTime)
|
|
|
+ void Update()
|
|
|
{
|
|
|
- PlayStandbyVideo();
|
|
|
+ // 只有在 Home 场景下才检测待机时间
|
|
|
+ if (isHomeScene)
|
|
|
+ {
|
|
|
+ // 判断是否达到待机时间,进入待机视频
|
|
|
+ if (!isVideoPlaying && Time.time - lastInputTime > standbyTime)
|
|
|
+ {
|
|
|
+ PlayStandbyVideo();
|
|
|
+ }
|
|
|
+
|
|
|
+ // 模拟调用 DetectPointerMovement 检测光标移动
|
|
|
+ if (Input.GetAxis("Mouse X") != 0 || Input.GetAxis("Mouse Y") != 0)
|
|
|
+ {
|
|
|
+ DetectPointerMovement(new Vector2(Input.mousePosition.x, Input.mousePosition.y));
|
|
|
+ }
|
|
|
+
|
|
|
+ // 模拟调用 SetUserInputEnabled 检测按键按下
|
|
|
+ //if (Input.anyKeyDown)
|
|
|
+ //{
|
|
|
+ // StopVideo();
|
|
|
+ //}
|
|
|
+ }
|
|
|
+
|
|
|
}
|
|
|
|
|
|
- // 监听鼠标或键盘输入退出视频
|
|
|
- if (isVideoPlaying && (Input.anyKeyDown || Input.GetAxis("Mouse X") != 0 || Input.GetAxis("Mouse Y") != 0))
|
|
|
+ // 重置待机计时器
|
|
|
+ private void ResetIdleTimer()
|
|
|
{
|
|
|
- StopVideo();
|
|
|
+ lastInputTime = Time.time;
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
- // 检测用户交互重置计时器
|
|
|
- private void DetectUserInput()
|
|
|
- {
|
|
|
- if (Input.anyKeyDown || Input.GetAxis("Mouse X") != 0 || Input.GetAxis("Mouse Y") != 0)
|
|
|
+ // 视频播放结束后自动回到UI
|
|
|
+ private void OnVideoEnd(VideoPlayer vp)
|
|
|
{
|
|
|
- ResetIdleTimer();
|
|
|
+ // 仅当视频没有被手动停止时才执行
|
|
|
+ if (isVideoPlaying)
|
|
|
+ {
|
|
|
+ videoPlayer.Play(); // 重新开始播放
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
- // 重置待机计时器
|
|
|
- private void ResetIdleTimer()
|
|
|
- {
|
|
|
- lastInputTime = Time.time;
|
|
|
- }
|
|
|
+ #region 光标移动,触发关闭视频video
|
|
|
+ private Vector2 lastPoint = Vector2.zero; // 记录上一次光点位置
|
|
|
+ private float movementThreshold = 10f; // 设定的移动触发阈值
|
|
|
|
|
|
- // 视频播放结束后自动回到UI
|
|
|
- private void OnVideoEnd(VideoPlayer vp)
|
|
|
- {
|
|
|
- // 仅当视频没有被手动停止时才执行
|
|
|
- if (isVideoPlaying)
|
|
|
+ // 检测光点(光标)移动并调用 EnableUserInput
|
|
|
+ /// <summary>
|
|
|
+ /// 输入当前移动的ui点
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="currentPoint"></param>
|
|
|
+ public void DetectPointerMovement(Vector2 currentPoint)
|
|
|
{
|
|
|
- videoPlayer.Play(); // 重新开始播放
|
|
|
+ if (lastPoint == Vector2.zero)
|
|
|
+ {
|
|
|
+ lastPoint = currentPoint; // 初始化位置
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 计算光点移动的距离
|
|
|
+ float distance = Vector2.Distance(lastPoint, currentPoint);
|
|
|
+
|
|
|
+ if (distance > movementThreshold)
|
|
|
+ {
|
|
|
+ StopVideo();
|
|
|
+ lastPoint = currentPoint; // 更新上次光点位置
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
-
|
|
|
- // 手动调用进入待机状态
|
|
|
- public void TriggerStandbyMode()
|
|
|
- {
|
|
|
- PlayStandbyVideo();
|
|
|
+ /// <summary>
|
|
|
+ /// 外部手动调用停止视频
|
|
|
+ /// </summary>
|
|
|
+ public void StopVideo()
|
|
|
+ {
|
|
|
+ // 监听退出视频
|
|
|
+ if (isVideoPlaying)
|
|
|
+ {
|
|
|
+ StopAndReset(); // 调用优化后的停止并重置函数
|
|
|
+ }
|
|
|
+ else {
|
|
|
+
|
|
|
+ ResetIdleTimer();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ #endregion
|
|
|
}
|
|
|
}
|