131 lines
2.7 KiB
C#

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;
}
}
}