using UdonSharp; using UnityEngine; using VRC.SDKBase; using VRC.Udon; [UdonBehaviourSyncMode(BehaviourSyncMode.None)] public class TriggerToggle : UdonSharpBehaviour { [SerializeField] private GameObject[] _ToggledObjects; [Tooltip("When true, object is active when player is inside trigger volume. If false, object is inactive when inside trigger volume.")] [SerializeField] private bool _ActiveOnTrigger = true; [Tooltip("Set number of seconds to delay toggle when entering trigger volume.")] [SerializeField] private float _EnterDelay = 0.0f; [Tooltip("Set number of seconds to delay toggle when exiting trigger volume.")] [SerializeField] private float _ExitDelay = 0.0f; public override void OnPlayerTriggerEnter(VRCPlayerApi Player) { if (Player.isLocal) { if (_EnterDelay > 0.01f) { SendCustomEventDelayedSeconds(nameof(EnableToggledObjects), _EnterDelay); } else { EnableToggledObjects(); } } base.OnPlayerTriggerEnter(Player); } public void EnableToggledObjects() { foreach (GameObject Object in _ToggledObjects) { Object.SetActive(_ActiveOnTrigger); } } public override void OnPlayerTriggerExit(VRCPlayerApi Player) { if (Player.isLocal) { if (_ExitDelay > 0.01f) { SendCustomEventDelayedSeconds(nameof(DisableToggledObjects), _ExitDelay); } else { DisableToggledObjects(); } } base.OnPlayerTriggerExit(Player); } public void DisableToggledObjects() { foreach (GameObject Object in _ToggledObjects) { Object.SetActive(!_ActiveOnTrigger); } } }