using UdonSharp; using UnityEngine; using VRC.SDK3.Video.Components.Base; using VRC.SDKBase; using VRC.Udon; [UdonBehaviourSyncMode(BehaviourSyncMode.Manual)] public class RandomVideoPlayer : UdonSharpBehaviour { [SerializeField] private MultiRoundVideoPlayer _VideoPlayer; [UdonSynced, FieldChangeCallback(nameof(VideoIndex))] private int _VideoIndex = -1; [UdonSynced, FieldChangeCallback(nameof(PlayVideo))] private bool _VideoIsPlaying; public VRCUrl[] VideoPool; public VRCUrl[] VideoPoolFallback; public void LoadRandomVideo() { int RandomIndex = -1; for (int i = 0; i < 3; i++) { RandomIndex = Random.Range(0, VideoPool.Length); if (RandomIndex >= 0 && RandomIndex != VideoIndex) break; } VideoIndex = RandomIndex; } private void _PlayVideo_Private() { _VideoPlayer.Play(); transform.position = new Vector3(transform.position.x, 0.0f, transform.position.z); } private void _StopVideo_Private() { transform.position = new Vector3(transform.position.x, -1000.0f, transform.position.z); VideoIndex = -1; _VideoPlayer.Stop(); } public void VideoEnded() { transform.position = new Vector3(transform.position.x, -1000.0f, transform.position.z); PlayVideo = false; } public int VideoIndex { set { _VideoIndex = value; if (VideoIndex >= 0) { _VideoPlayer.LoadURL(VideoPool[_VideoIndex]); } RequestSerialization(); } get => _VideoIndex; } public bool PlayVideo { set { _VideoIsPlaying = value; if (_VideoIsPlaying) _PlayVideo_Private(); else _StopVideo_Private(); RequestSerialization(); } get => _VideoIsPlaying; } }