using UdonSharp; using UnityEngine; using VRC.SDKBase; using VRC.Udon; using VRC.Udon.Common.Interfaces; [UdonBehaviourSyncMode(BehaviourSyncMode.Manual)] public class JailChain : UdonSharpBehaviour { [SerializeField] private GameManagerRound2 _GameManager; [Space] [SerializeField] private Transform _ChainPivot; [SerializeField] private Transform _ChainHome; [SerializeField] private Transform _PullTarget; [Space] [SerializeField] private Animator _JailChainAnimator; [Space] [Tooltip("Speed at which the chain returns to its neutral pose.")] [SerializeField] private float _ReturnSpeedMultiplier = 5.0f; [UdonSynced, FieldChangeCallback(nameof(Show))] private bool _Show = false; [UdonSynced] private bool _PullChain = false; [UdonSynced] private bool _HasBeenActivated = false; public override void PostLateUpdate() { if (_PullChain) { if (!_HasBeenActivated && transform.localPosition.z < _PullTarget.transform.localPosition.z) { _HasBeenActivated = true; RequestSerialization(); if (Networking.IsOwner(gameObject)) { _GameManager.SendCustomNetworkEvent(NetworkEventTarget.All, "PlayInJailAnimation"); } } } else { transform.localPosition = Vector3.Lerp(transform.localPosition, Vector3.zero, Time.deltaTime * _ReturnSpeedMultiplier); } _ChainPivot.LookAt(_ChainHome.transform); base.PostLateUpdate(); } public override void OnPickup() { _PullChain = true; RequestSerialization(); base.OnPickup(); } public override void OnDrop() { _PullChain = false; RequestSerialization(); base.OnDrop(); } public void Initialise() { _PullChain = false; _HasBeenActivated = false; transform.localPosition = Vector3.zero; _ChainPivot.localRotation = Quaternion.identity; Show = false; RequestSerialization(); } public bool Show { set { _Show = value; _JailChainAnimator.SetBool("Show", _Show); RequestSerialization(); } get => _Show; } }