Files
PacManUdon/Assets/Scripts/StatusDisplay.cs
2025-12-26 18:14:48 +01:00

173 lines
5.5 KiB
C#

namespace Marro.PacManUdon
{
using UdonSharp;
using UnityEngine;
using VRC.SDKBase;
using VRC.Udon;
using TMPro;
public class StatusDisplay : UdonSharpBehaviour
{
[SerializeField] private Transform scoreDisplayGroup;
[SerializeField] private TMP_Text label1UPText;
[SerializeField] private TMP_Text score1UPText;
[SerializeField] private TMP_Text labelHighScoreText;
[SerializeField] private TMP_Text scoreHighScoreText;
[SerializeField] private TMP_Text debugText;
[SerializeField] private TMP_Text debugText2;
[SerializeField] private TMP_Text gameOverText;
[SerializeField] private TMP_Text player1Text;
[SerializeField] private TMP_Text readyText;
[SerializeField] private Transform levelDisplayDigitsContainer;
[SerializeField] private Transform extraLifeIndicatorsContainer;
private Animator[] levelDisplayDigitAnimators;
private Renderer[] levelDisplayDigitRenderers;
private GameObject[] extraLifeIndicators;
private bool label1UPVisible;
private bool label1UPTextBlinking;
private float labelBlinkToggleInterval = 0.26666667f;
private float labelBlinkTimer;
public void Initialize()
{
// Level Display
levelDisplayDigitAnimators = levelDisplayDigitsContainer.GetComponentsInChildren<Animator>();
levelDisplayDigitRenderers = levelDisplayDigitsContainer.GetComponentsInChildren<Renderer>();
// Extra Lifes Display
Transform[] extraLifeIndicatorTransforms = extraLifeIndicatorsContainer.GetComponentsInChildren<Transform>();
extraLifeIndicators = new GameObject[extraLifeIndicatorTransforms.Length - 1];
for (int i = 1; i < extraLifeIndicatorTransforms.Length; i++) // We skip the first found components as it is the container and not an actual indicator
{
extraLifeIndicators[i - 1] = extraLifeIndicatorTransforms[i].gameObject;
}
// Debug.Log($"{gameObject} extraLifeIndicators.Length: {extraLifeIndicators.Length}");
}
public void Reset()
{
SetLabel1UPTextBlinking(false);
}
void Update()
{
if (label1UPTextBlinking)
{
labelBlinkTimer += Time.deltaTime;
if (labelBlinkTimer > labelBlinkToggleInterval)
{
labelBlinkTimer -= labelBlinkToggleInterval;
SetLabel1UPTextVisible(!label1UPVisible);
}
}
}
public void Set1UPScore(int score)
{
if (score == 0)
{
score1UPText.text = "00";
}
else
{
score1UPText.text = score.ToString();
}
}
public void SetHighScore(int score)
{
if (score == 0)
{
scoreHighScoreText.text = "";
}
else
{
scoreHighScoreText.text = score.ToString();
}
}
public void SetDebugText(int debugTextLine, string text)
{
if (debugTextLine == 1)
{
debugText.text = text;
}
else if (debugTextLine == 2)
{
debugText2.text = text;
}
}
public void SetScoreDisplayVisible(bool visible)
{
scoreDisplayGroup.gameObject.SetActive(visible);
}
public void SetExtraLivesDisplayVisible(bool visible)
{
extraLifeIndicatorsContainer.gameObject.SetActive(visible);
}
public void SetLevelDisplayVisible(bool visible)
{
foreach (Renderer renderer in levelDisplayDigitRenderers)
{
renderer.enabled = visible;
}
}
public void SetGameOverTextVisible(bool visible)
{
gameOverText.gameObject.SetActive(visible);
}
public void SetReadyTextVisible(bool visible)
{
readyText.gameObject.SetActive(visible);
}
public void SetPlayer1TextVisible(bool visible)
{
player1Text.gameObject.SetActive(visible);
}
void SetLabel1UPTextVisible(bool visible)
{
label1UPVisible = visible;
label1UPText.gameObject.SetActive(visible);
}
public void SetLabel1UPTextBlinking(bool blinking)
{
SetLabel1UPTextVisible(false);
labelBlinkTimer = 0;
label1UPTextBlinking = blinking;
if (blinking == false)
{
SetLabel1UPTextVisible(true);
}
}
public bool SetExtraLives(int extraLives)
{
// Debug.Log($"{gameObject} SetExtraLives: {extraLives}");
for (int extraLifeIndicatorIndex = 0; extraLifeIndicatorIndex < extraLifeIndicators.Length; extraLifeIndicatorIndex++)
{
extraLifeIndicators[extraLifeIndicatorIndex].SetActive(extraLifeIndicatorIndex < extraLives);
}
return true;
}
public void SetLevel(int level)
{
for (int i = 0; i < levelDisplayDigitAnimators.Length; i++)
{
levelDisplayDigitAnimators[i].SetFloat("FruitType", PacManConstants.FruitTypeToValue(PacManConstants.GetFruitTypeForLevel(level - i)));
}
}
}
}