using UdonSharp; using UnityEngine; using VRC.Udon.Common.Interfaces; [UdonBehaviourSyncMode(BehaviourSyncMode.Manual)] public class GlassShatter : UdonSharpBehaviour { [SerializeField] private AudioManager _AudioManager; [SerializeField] private Collider[] _Colliders; [UdonSynced, FieldChangeCallback(nameof(Shattered))] private bool _Shattered = false; private bool _Prepared = false; public void HostEnabled() { foreach (Collider GlassCollider in _Colliders) { GlassCollider.gameObject.SetActive(true); } } public void HostDisabled() { foreach (Collider GlassCollider in _Colliders) { GlassCollider.gameObject.SetActive(false); } } public void PrepareEnter() { if (!Shattered) { _Prepared = true; } } public void PrepareExit() { _Prepared = false; } public void ShatterEnter() { if (_Prepared && !Shattered) { Shattered = true; _Shatter_Synced(); RequestSerialization(); } } public void ShatterExit() { Shattered = false; } private void _Shatter_Synced() { if (Shattered) { _AudioManager.PlaySFXAtPitch(SFXEventType.GlassShatter, Random.Range(0.9f, 1.1f)); } } public bool Shattered { set { _Shattered = value; _Shatter_Synced(); } get => _Shattered; } }