using System.Collections; using System.Collections.Generic; using TMPro; using UnityEngine; public class Avatar : MonoBehaviour { [SerializeField] Sprite chipImage; [SerializeField] GameObject messageBoxPrefab; [SerializeField] AudioClip botVoice; [SerializeField] float culldownTime = 2; [SerializeField] AnimationClip chipSpawnClip; public Animator Animator => animator ?? GetComponent(); public Sprite ChipImage => chipImage; public float ChipSpawnTime => chipSpawnClip.length; private AudioSource audioSource; private Animator animator; private GameObject currentMessageBox; private bool useVoice = true; private bool nowTyping = false; private CellState team; #region REPLICAS_LISTS [Header("Появление")] [Range(0, 1)] public float appearChance = 1; [SerializeField] List appearReplicas; private List appearReplicasTemp; [Header("Мой ход начался")] [Range(0, 1)] public float playerTurnChance = 1; [SerializeField] List MyTurnStartReplicas; private List MyTurnStartReplicasTemp; [Header("Мой ход закончился")] [Range(0, 1)] public float botTurnChance = 1; [SerializeField] List MyTurnEndsReplicas; private List MyTurnEndsReplicasTemp; [Header("Я выиграл")] [Range(0, 1)] public float playerWinChance = 1; [SerializeField] List WinReplicas; private List WinReplicasTemp; [Header("Я проиграл")] [Range(0, 1)] public float botWinChance = 1; [SerializeField] List LoseReplicas; private List LoseReplicasTemp; [Header("Ничья (редко)")] [Range(0, 1)] public float drawChance = 1; [SerializeField] List drawReplicas; private List drawReplicasTemp; [Header("Новый раунд после победы")] [Range(0, 1)] public float afterWinChance = 1; [SerializeField] List afterWinReplicas; private List afterWinReplicasTemp; [Header("Новый раунд после поражения")] [Range(0, 1)] public float afterLoseChance = 1; [SerializeField] List afterLoseReplicas; private List afterLoseReplicasTemp; [Header("5 побед")] [Range(0, 1)] public float totalWinChance = 1; [SerializeField] List totalWinReplicas; private List totalWinReplicasTemp; [Header("полное поражение")] [Range(0, 1)] public float totalLoseChance = 1; [SerializeField] List totalLoseReplicas; private List totalLoseReplicasTemp; #endregion public void Initialize(CellState team) { this.team = team; SettingsManager.OnSettingsChanged.AddListener(pullSettings); audioSource = GetComponent(); pullSettings(); } //биндинги пойдут корочу в контроллер private void pullSettings() { useVoice = SettingsManager.GetBool("EnableVoices", true); audioSource.volume = SettingsManager.GetFloat("SoundsVolume", 0.5f); } private bool Message(ref List replicasTemp, List replicas, bool priority, float chance) { //Поступило неприоритетное сообщение и бокс занят if (nowTyping && !priority) return false; //В источнике не заполнены реплики if (replicas == null || replicas.Count == 0) return false; if (replicasTemp == null || replicasTemp.Count == 0) replicasTemp = new List(replicas); //Проверяем вероятность bool condition = Random.Range(0f, 1f) < chance; if (!condition) return false; //сообщение приоритетное и кто то ДО занял бокс if (nowTyping) { StopAllCoroutines(); Destroy(currentMessageBox); } nowTyping = true; //подготовка бокса currentMessageBox = Instantiate(messageBoxPrefab, transform); TextMeshProUGUI label = currentMessageBox.transform.GetComponentInChildren(); //Подготовка сообщения int replicaIndex = Random.Range(0, replicasTemp.Count); //Забираем реплику из списка Replica replica = replicasTemp[replicaIndex]; replicasTemp.RemoveAt(replicaIndex); if (replica.clip && useVoice) { audioSource.clip = replica.clip; audioSource.Play(); } StartCoroutine(ShowText(replica, label)); return true; } private IEnumerator ShowText(Replica replica, TextMeshProUGUI label) { bool emptyReplicaText = string.IsNullOrEmpty(replica.text); bool emptyRepliceClip = replica.clip == null; // нет текста - дропаем if (emptyReplicaText) { Destroy(label.transform.parent.gameObject); yield break; } label.text = ""; int replicaTextLength = replica.text.Length; float typingDelay = replica.clip.length / replica.text.Length; string fullText = replica.text; for (int symbolsAmount = 0; symbolsAmount <= fullText.Length; symbolsAmount++) { label.text = fullText.Substring(0, symbolsAmount); yield return new WaitForSeconds(typingDelay); } yield return new WaitForSeconds(culldownTime); nowTyping = false; Destroy(label.transform.parent.gameObject); } }