StandbyVideoManager.cs 3.4 KB

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