using UdonSharp; using UnityEngine; using VRC.SDKBase; using VRC.Udon; public class NumberStand : UdonSharpBehaviour { public GameObject[] bigNumberPoints; public GameObject[] smallNumberPoints; public GameObject[] bigNumberCards; public GameObject[] smallNumberCards; public TMPro.TextMeshProUGUI targetNumberText; [UdonSynced] public int targetNumber; public int[] bigNumbers = { 25, 50, 75, 100 }; public int[] smallNumbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; private int _spinCount = 0; private bool _isSpinning = false; public void Start() { if (Networking.IsOwner(gameObject)) { ResetCards(); } } public void GenerateTargetNumber() { targetNumber = Random.Range(101, 1000); UpdateTargetNumberDisplay(); RequestSerialization(); } public void UpdateTargetNumberDisplay() { _spinCount = 10; if (!_isSpinning) { SpinStep(); } } public void SpinStep() { if (targetNumberText == null) return; if (_spinCount > 0) { _isSpinning = true; targetNumberText.text = Random.Range(101, 1000).ToString(); _spinCount--; SendCustomEventDelayedSeconds(nameof(SpinStep), 0.1f); } else { _isSpinning = false; targetNumberText.text = targetNumber.ToString(); } } private int _lastTargetNumber; public override void OnDeserialization() { if (targetNumber != _lastTargetNumber) { _lastTargetNumber = targetNumber; UpdateTargetNumberDisplay(); } } public void ResetCards() { // Reset Big Numbers for (int i = 0; i < bigNumberPoints.Length && i < bigNumberCards.Length; i++) { if (bigNumberCards[i] != null && bigNumberPoints[i] != null) { bigNumberCards[i].transform.position = bigNumberPoints[i].transform.position; bigNumberCards[i].transform.rotation = bigNumberPoints[i].transform.rotation; LetterCard card = bigNumberCards[i].GetComponent(); if (card != null && bigNumbers.Length > 0) { // Reshuffle if we are starting a new pass through the numbers if (i % bigNumbers.Length == 0) { ShuffleIntArray(bigNumbers); } card.SetLetter(bigNumbers[i % bigNumbers.Length].ToString()); } } } // Reset Small Numbers for (int i = 0; i < smallNumberPoints.Length && i < smallNumberCards.Length; i++) { if (smallNumberCards[i] != null && smallNumberPoints[i] != null) { smallNumberCards[i].transform.position = smallNumberPoints[i].transform.position; smallNumberCards[i].transform.rotation = smallNumberPoints[i].transform.rotation; LetterCard card = smallNumberCards[i].GetComponent(); if (card != null && smallNumbers.Length > 0) { // Reshuffle if we are starting a new pass through the numbers if (i % smallNumbers.Length == 0) { ShuffleIntArray(smallNumbers); } card.SetLetter(smallNumbers[i % smallNumbers.Length].ToString()); } } } } private void ShuffleIntArray(int[] arr) { for (int i = 0; i < arr.Length; i++) { int temp = arr[i]; int randomIndex = Random.Range(i, arr.Length); arr[i] = arr[randomIndex]; arr[randomIndex] = temp; } } }