StandbyVideoManager.cs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. using UnityEngine;
  2. using UnityEngine.UI;
  3. using UnityEngine.Video;
  4. public class StandbyVideoManager : MonoBehaviour
  5. {
  6. public RawImage videoDisplay; // UI上的RawImage
  7. public VideoPlayer videoPlayer; // VideoPlayer 组件
  8. public GameObject uiPanel; // UI 界面的根面板
  9. public float standbyTime = 10f; // 待机时间(秒)
  10. private bool isVideoPlaying = false;
  11. private float lastInputTime;
  12. public static StandbyVideoManager _ins;
  13. public static void Create()
  14. {
  15. if (_ins) return;
  16. GameObject o = Instantiate(Resources.Load<GameObject>("StandbyVideoManager"));
  17. DontDestroyOnLoad(o);
  18. _ins = o.GetComponent<StandbyVideoManager>();
  19. //添加一个父物体
  20. o.transform.SetParent(ViewMgr.Instance.transform.Find("1").transform);
  21. CanvasScaler canvasScaler = o.transform.Find("Canvas").GetComponent<CanvasScaler>();
  22. if (canvasScaler != null)
  23. {
  24. Destroy(canvasScaler);
  25. }
  26. RectTransform rectTransform = canvasScaler.GetComponent<RectTransform>();
  27. rectTransform.anchorMin = Vector2.zero; // 左下角对齐父级
  28. rectTransform.anchorMax = Vector2.one; // 右上角对齐父级
  29. rectTransform.offsetMin = Vector2.zero; // 移除左下角偏移
  30. rectTransform.offsetMax = Vector2.zero; // 移除右上角偏移
  31. rectTransform.localScale = Vector3.one; // 确保缩放为 1
  32. _ins.TriggerStandbyMode();
  33. }
  34. void Start()
  35. {
  36. videoDisplay.gameObject.SetActive(false); // 初始时隐藏视频
  37. videoPlayer.loopPointReached += OnVideoEnd; // 监听视频播放完毕
  38. videoPlayer.isLooping = true; // 设置视频循环播放
  39. ResetIdleTimer(); // 初始化计时器
  40. }
  41. void Update()
  42. {
  43. DetectUserInput();
  44. // 判断是否达到待机时间
  45. if (!isVideoPlaying && Time.time - lastInputTime > standbyTime)
  46. {
  47. PlayStandbyVideo();
  48. }
  49. // 监听鼠标或键盘输入退出视频
  50. if (isVideoPlaying && (Input.anyKeyDown || Input.GetAxis("Mouse X") != 0 || Input.GetAxis("Mouse Y") != 0))
  51. {
  52. StopVideo();
  53. }
  54. }
  55. // 检测用户交互重置计时器
  56. private void DetectUserInput()
  57. {
  58. // 用户输入重置计时器
  59. if (Input.anyKeyDown || Input.GetAxis("Mouse X") != 0 || Input.GetAxis("Mouse Y") != 0)
  60. {
  61. ResetIdleTimer();
  62. }
  63. }
  64. // 重置待机计时器
  65. private void ResetIdleTimer()
  66. {
  67. lastInputTime = Time.time;
  68. }
  69. // 进入待机视频
  70. public void PlayStandbyVideo()
  71. {
  72. videoDisplay.gameObject.SetActive(true); // 显示视频
  73. videoPlayer.Play();
  74. isVideoPlaying = true;
  75. }
  76. // 停止视频,回到 UI
  77. public void StopVideo()
  78. {
  79. videoPlayer.Stop();
  80. videoDisplay.gameObject.SetActive(false); // 隐藏视频
  81. isVideoPlaying = false;
  82. ResetIdleTimer();
  83. }
  84. // 视频播放结束后自动回到UI
  85. private void OnVideoEnd(VideoPlayer vp)
  86. {
  87. // 仅当视频没有被手动停止时才执行
  88. if (isVideoPlaying)
  89. {
  90. videoPlayer.Play(); // 重新开始播放
  91. }
  92. }
  93. // 手动调用进入待机状态
  94. public void TriggerStandbyMode()
  95. {
  96. PlayStandbyVideo();
  97. }
  98. }