/
Tracnuk
/
Test_9
Обзор
Документация
Войти
/
Tracnuk
/
Test_9
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Assets/Scripts/TurnManager.cs
172 строки
5 KB
Tracnuk
add moving units with color path and choosing them with color helps(not working Ai enemy)
25 окт 2025, 11:43
25 окт 2025, 11:43
eb318db
Код
Авторство
О чём код?
using System.Collections; using System.Collections.Generic; using UnityEngine; public class TurnManager : MonoBehaviour { public static TurnManager Instance; public enum TurnState { PlayerTurn, EnemyTurn, SelectingUnit } public TurnState currentState; public List<StealthEnemy> enemies = new List<StealthEnemy>(); public List<UnitController> playerUnits = new List<UnitController>(); private UnitController currentlySelectedUnit; private int currentUnitIndex = 0; private HashSet<UnitController> movedUnits = new HashSet<UnitController>(); void Awake() { if (Instance == null) { Instance = this; } else { Destroy(gameObject); } } void Start() { FindAllEnemies(); FindAllPlayerUnits(); StartPlayerTurn(); } void FindAllEnemies() { enemies.Clear(); StealthEnemy[] foundEnemies = FindObjectsOfType<StealthEnemy>(); enemies.AddRange(foundEnemies); Debug.Log($"Найдено врагов: {enemies.Count}"); } void FindAllPlayerUnits() { playerUnits.Clear(); UnitController[] foundUnits = FindObjectsOfType<UnitController>(); playerUnits.AddRange(foundUnits); Debug.Log($"Найдено игровых юнитов: {playerUnits.Count}"); } public void StartPlayerTurn() { currentState = TurnState.PlayerTurn; currentUnitIndex = 0; movedUnits.Clear(); Debug.Log("=== ХОД ИГРОКА ==="); Debug.Log($"Управление {playerUnits.Count} персонажами"); StartUnitSelection(); } void StartUnitSelection() { currentState = TurnState.SelectingUnit; if (playerUnits.Count > 0 && currentUnitIndex < playerUnits.Count) { SelectUnit(playerUnits[currentUnitIndex]); } else { EndPlayerTurn(); } } void SelectUnit(UnitController unit) { foreach (UnitController playerUnit in playerUnits) { playerUnit.SetPlayerControl(false); playerUnit.Deselect(); } currentlySelectedUnit = unit; unit.SetPlayerControl(true); unit.SelectUnit(); Debug.Log($"✅ Выбран персонаж: {unit.name} ({currentUnitIndex + 1}/{playerUnits.Count})"); } public void OnUnitFinishedAction() { if (currentlySelectedUnit != null) { movedUnits.Add(currentlySelectedUnit); } currentUnitIndex++; StartUnitSelection(); } // Проверяем походил ли уже юнит в этом раунде public bool HasUnitMoved(UnitController unit) { return movedUnits.Contains(unit); } // Получаем индекс юнита в очереди public int GetUnitIndex(UnitController unit) { return playerUnits.IndexOf(unit); } public void OnUnitClicked(UnitController clickedUnit) { if (currentState == TurnState.SelectingUnit && playerUnits.Contains(clickedUnit)) { int clickedIndex = playerUnits.IndexOf(clickedUnit); if (clickedIndex >= currentUnitIndex && !movedUnits.Contains(clickedUnit)) { currentUnitIndex = clickedIndex; SelectUnit(clickedUnit); } else if (movedUnits.Contains(clickedUnit)) { Debug.Log("Этот персонаж уже походил в этом раунде"); } else { Debug.Log("Сначала нужно походить предыдущими персонажами"); } } } public void EndPlayerTurn() { Debug.Log("Все персонажи походили - завершаем ход игрока"); foreach (UnitController unit in playerUnits) { unit.SetPlayerControl(false); unit.Deselect(); } StartEnemyTurn(); } public void StartEnemyTurn() { currentState = TurnState.EnemyTurn; Debug.Log("=== ХОД ВРАГОВ ==="); StartCoroutine(ProcessEnemyTurns()); } IEnumerator ProcessEnemyTurns() { foreach (StealthEnemy enemy in enemies.ToArray()) { if (enemy != null && enemy.gameObject.activeInHierarchy) { yield return StartCoroutine(enemy.TakeEnemyTurn()); yield return new WaitForSeconds(0.5f); } } StartPlayerTurn(); } }