using UdonSharp; using UnityEngine; using VRC.SDKBase; using VRC.Udon.Common; public enum LightningRoundEffect { Thunder, LightningStrike, ThunderAndRain, MAX_EFFECTS } [UdonBehaviourSyncMode(BehaviourSyncMode.Manual)] public class LightningRoundEffectsController : UdonSharpBehaviour { [SerializeField] private AudioManager _AudioManager; [SerializeField] private Animator _Animator; [Space] [SerializeField] private GameObject _LightningBolt; [SerializeField] private ParticleSystem _PersonalRaincloud; [SerializeField] private Umbrella _Umbrella; [UdonSynced] private LightningRoundEffect _Effect; public override void OnOwnershipTransferred(VRCPlayerApi Player) { Networking.SetOwner(Player, _LightningBolt.gameObject); Networking.SetOwner(Player, _Umbrella.gameObject); base.OnOwnershipTransferred(Player); } public override void OnDeserialization(DeserializationResult Result) { _DeactivateRain(); _PlayLightningRoundAnimation_Synced(); base.OnDeserialization(Result); } public void Initialise() { _Umbrella.Respawn(); RequestSerialization(); } public void PlayLightningRoundAnimation() { _Effect = (LightningRoundEffect)Random.Range(0, (int)LightningRoundEffect.MAX_EFFECTS); _PlayLightningRoundAnimation_Synced(); RequestSerialization(); } private void _PlayLightningRoundAnimation_Synced() { switch (_Effect) { case LightningRoundEffect.Thunder: _LightningBolt.SetActive(false); break; case LightningRoundEffect.LightningStrike: _LightningBolt.SetActive(true); break; case LightningRoundEffect.ThunderAndRain: _LightningBolt.SetActive(false); _ActivateRain(); break; } _AudioManager.PlayMusic(MusicEventType.LightningRound); _Animator.SetBool("Lightning", true); SendCustomEventDelayedSeconds(nameof(ResetLightningRoundAnimation), 2.0f); } public void ResetLightningRoundAnimation() { _LightningBolt.SetActive(false); _Animator.SetBool("Lightning", false); } private void _ActivateRain() { _Umbrella.gameObject.SetActive(true); _PersonalRaincloud.Play(); } private void _DeactivateRain() { _Umbrella.gameObject.SetActive(false); _PersonalRaincloud.Stop(); } }