using UdonSharp; using UnityEngine; using VRC.SDK3.Components; using VRC.SDKBase; using VRC.Udon; using VRC.Udon.Common.Interfaces; namespace myro.arcade { [UdonBehaviourSyncMode(BehaviourSyncMode.Continuous)] //Continuous because that script is attached to a VRCObjectSync component [RequireComponent(typeof(JoystickLoop))] public class Joystick : UdonSharpBehaviour { public UdonSharpBehaviour MainGameInstance; public GameObject HoloJoystick; [Header("Left and right side of the screen, used to track the position of the joystick")] public Transform LeftScreen; public Transform RightScreen; private VRCObjectSync _objectSync; private VRCPickup _pickup; private JoystickLoop _joystickLoop; void Start() { _objectSync = GetComponent(); _pickup = GetComponent(); CheckForInitialisation(); } private void CheckForInitialisation() { if (!_joystickLoop) { _joystickLoop = GetComponent(); _joystickLoop.SetLeftAndRightTransform(LeftScreen, RightScreen); _joystickLoop.enabled = false; } } public override void OnPickup() { MainGameInstance.SendCustomEvent("PlayerPickedUpJoystick"); SendCustomNetworkEvent(NetworkEventTarget.All, nameof(OnPickupEvent)); } public void OnPickupEvent() { _joystickLoop.enabled = true; HoloJoystick.SetActive(true); } public override void OnDrop() { _joystickLoop.enabled = false; MainGameInstance.SendCustomEvent("PlayerDroppedJoystick"); SendCustomNetworkEvent(NetworkEventTarget.All, nameof(OnDropEvent)); RespawnJoystick(); } public void OnDropEvent() { HoloJoystick.SetActive(false); } public override void OnPickupUseDown() { MainGameInstance.SendCustomEvent("OnPress"); } public override void OnPickupUseUp() { MainGameInstance.SendCustomEvent("OnRelease"); } public void ForceDrop() { if (Networking.IsOwner(gameObject)) { _pickup.Drop(); } } public float GetPositionXRatio() { CheckForInitialisation(); return _joystickLoop.GetRatio(); } public void RespawnJoystick() { if (_objectSync != null) { _objectSync.Respawn(); } } public void RespawnJoystickIfNotHolding() { if (!_pickup.IsHeld) { RespawnJoystick(); } } public void RequestJoystickRespawn() { SendCustomNetworkEvent(NetworkEventTarget.Owner, nameof(RespawnJoystickIfNotHolding)); } } }