83 lines
1.8 KiB
C#
83 lines
1.8 KiB
C#
|
|
|
|
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<Transform>();
|
|
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");
|
|
}
|
|
}
|