134 lines
3.8 KiB
C#
134 lines
3.8 KiB
C#
|
|
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<LetterCard>();
|
|
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<LetterCard>();
|
|
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;
|
|
}
|
|
}
|
|
}
|