using UdonSharp; using UnityEngine; using VRC.SDK3.Components; using VRC.SDKBase; using VRC.Udon.Common; public enum CardAnchorMode { None, AtSpawn, InHeldPosition } [UdonBehaviourSyncMode(BehaviourSyncMode.Manual)] public class ChoiceCard : UdonSharpBehaviour { [UdonSynced] public int ChoiceNumber = 0; [Space] [SerializeField] private ChoiceCardGroup CardGroup = null; [Space] [SerializeField] private VRCPickup _Pickup; [SerializeField] private VRCObjectSync _ObjectSync; [Space] [SerializeField] private UdonSharpBehaviour CardInteractObject; [SerializeField] private MeshRenderer _Mesh; [SerializeField] private Transform _SpawnPosition; [SerializeField] private Transform _HeldPosition; [UdonSynced] private CardAnchorMode _AnchorMode = CardAnchorMode.None; public override void OnOwnershipTransferred(VRCPlayerApi Player) { if (Utilities.IsValid(_Pickup)) { Networking.SetOwner(Player, _Pickup.gameObject); } base.OnOwnershipTransferred(Player); } public override void OnDeserialization(DeserializationResult Result) { _SetPosition_Synced(); base.OnDeserialization(Result); } public void ChoiceCardPickedUp() { CardGroup.ChoiceCardPickedUp(ChoiceNumber); _ObjectSync.enabled = true; } public void ChoiceCardInteract() { CardGroup.ChoiceCardInteract(ChoiceNumber); _ObjectSync.enabled = false; } public new void DisableInteractive(bool Disable) { CardInteractObject.DisableInteractive = (Networking.IsOwner(gameObject) && !Networking.LocalPlayer.IsUserInVR()) ? Disable : true; } public void SetPickupable(bool Pickupable) { _Pickup.pickupable = (Networking.IsOwner(gameObject) && Networking.LocalPlayer.IsUserInVR()) ? Pickupable : false; } public void SetColourMaterial(Material Colour) { _Mesh.sharedMaterial = Colour; } public void SetToHeldPosition() { _Pickup.Drop(); _ObjectSync.enabled = false; _Pickup.InteractionText = "Reveal"; _AnchorMode = CardAnchorMode.InHeldPosition; _SetPosition_Synced(); RequestSerialization(); } public void ResetPosition() { _Pickup.Drop(); _Pickup.InteractionText = "Choose"; _AnchorMode = CardAnchorMode.AtSpawn; _SetPosition_Synced(); RequestSerialization(); } private void _SetPosition_Synced() { _ObjectSync.enabled = false; switch (_AnchorMode) { case CardAnchorMode.None: case CardAnchorMode.AtSpawn: _Pickup.transform.SetParent(_SpawnPosition, false); _Pickup.transform.localPosition = Vector3.zero; _Pickup.transform.localRotation = Quaternion.identity; break; case CardAnchorMode.InHeldPosition: _Pickup.transform.SetParent(_HeldPosition, false); _Pickup.transform.localPosition = Vector3.zero; _Pickup.transform.localRotation = Quaternion.identity; break; } } }