using System.Collections; using System.Collections.Generic; using System.Linq; using UnityEngine; public class CreditUIController : MonoBehaviour { [SerializeField] private PlayerList m_allPlayers; [SerializeField] private GameObject m_playerPrefab; [SerializeField] private RectTransform winnerPos; [SerializeField] private RectTransform losePos; [SerializeField] private float waitTime = 1; [SerializeField] private float creditDisplayTime = 1; [SerializeField] public List m_CreditReferences; [SerializeField] public List m_Credits; private int Count; private void Start() { StartCoroutine(DisplaySlow(waitTime)); StartCoroutine(DisplayCredits(creditDisplayTime)); } [ContextMenu("display All players")] private void DisplayAllPlayers() { int max = m_allPlayers.AllPlayers.Select(p => p.Score).Max(); int min = m_allPlayers.AllPlayers.Select(p => p.Score).Min(); foreach (var data in m_allPlayers.AllPlayers) { DisplayScore(data, max, min); } } private IEnumerator DisplaySlow(float timebetween = 1) { int max = m_allPlayers.AllPlayers.Select(p => p.Score).Max(); int min = m_allPlayers.AllPlayers.Select(p => p.Score).Min(); foreach (var data in m_allPlayers.AllPlayers.OrderBy(p => p.Score)) { yield return new WaitForSeconds(timebetween); DisplayScore(data, max, min); } } private IEnumerator DisplayCredits(float displayTime) { float totalTime = displayTime / m_CreditReferences.Count; while (true) { CreditReferences reference = m_CreditReferences[Count%m_CreditReferences.Count]; CreditData data = m_Credits[Count % m_Credits.Count]; Count++; reference.Title.text = data.Title; reference.Credit.text = data.Credit; yield return new WaitForSeconds(totalTime); } } private void DisplayScore(PlayerData player, int maxScore, int minScore) { player.Input.SwitchCurrentActionMap("JoinMenu"); float ratio = 0.5f; if (maxScore != minScore) ratio = (float)(player.Score - minScore) / (maxScore - minScore); Vector3 pos = Vector3.Lerp(losePos.position, winnerPos.position, ratio); pos.x = Random.Range((Screen.width / 4f), Screen.width); GameObject newPlayer = Instantiate(m_playerPrefab); newPlayer.transform.parent = (m_playerPrefab.transform.parent); newPlayer.transform.position = pos; newPlayer.transform.Rotate(Vector3.forward, Random.Range(-20.0f, 20.0f)); if (Random.Range(0, 2) > 0) { newPlayer.transform.localScale.Scale(new Vector3(-1, 1, 1)); newPlayer.GetComponentInChildren().transform.localScale.Scale(new Vector3(-1, 1, 1)); } newPlayer.GetComponent().Initialise(player); newPlayer.GetComponentInChildren().text = player.Score.ToString(); newPlayer.SetActive(true); } [System.Serializable] public struct CreditReferences { public TMPro.TextMeshProUGUI Title; public TMPro.TextMeshProUGUI Credit; } [System.Serializable] public struct CreditData { public string Title; public string Credit; } }