using UdonSharp; using UnityEngine; using VRC.SDKBase; using VRC.Udon; using VRC.Udon.Common.Interfaces; public class Door : UdonSharpBehaviour { [SerializeField] private Animator doorAnimator; [SerializeField] private AudioSource doorAudioSource; [UdonSynced] private bool isOpen = false; [Header("Audio Clips")] [SerializeField] private AudioClip doorOpenClip; [SerializeField] private AudioClip doorCloseClip; [SerializeField] private AudioClip doorLockedClip; public void Start() { int layer = LayerMask.NameToLayer("Walkthrough"); if (Networking.IsOwner(gameObject)) { gameObject.layer = layer; // Set layer for all children Transform[] children = gameObject.GetComponentsInChildren(); for (int i = 0; i < children.Length; i++) { children[i].gameObject.layer = layer; } } } private void ToggleOpen() { if (Networking.IsOwner(gameObject)) { isOpen = !isOpen; doorAnimator.SetBool("isOpen", isOpen); RequestSerialization(); } else { SendCustomNetworkEvent(NetworkEventTarget.All, nameof(TryLocked)); } } public override void OnDeserialization() { doorAnimator.SetBool("isOpen", isOpen); } public void HandleInteraction() { ToggleOpen(); } public void PlayOpenSound() { doorAudioSource.PlayOneShot(doorOpenClip); } public void PlayCloseSound() { doorAudioSource.PlayOneShot(doorCloseClip); } public void PlayLockedSound() { doorAudioSource.PlayOneShot(doorLockedClip); } public void TryLocked() { doorAnimator.SetTrigger("tryLocked"); } }