using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; /// /// This is attached to an empty game object in the battle scene. This class /// manages all aspects of the battle that occurs. /// public class BattleManager : MonoBehaviour { // The locations where enemies may appear within the scene. public GameObject[] EnemySpawnPoints; // The enemies that may be placed on the spawn points public GameObject[] EnemyPrefabs; // When enemies are placed they slide into place based on the curve public AnimationCurve SpawnAnimationCurve; // Reference to the actions that a player may perform public CanvasGroup theButtons; // The number of enemies in the scene private int enemyCount; // This enumeration defines the components of a turn enum BattlePhase { PlayerAttack, EnemyAttack } // Track which phase of the turn we are on private BattlePhase phase; // Use this for initialization void Start () { // Calculate how many enemies will be in the scene (battle) enemyCount = Random.Range(1, EnemySpawnPoints.Length); // Spawn the enemies in StartCoroutine(SpawnEnemies()); // Set the beginning battle phase - player always has initiative in this game phase = BattlePhase.PlayerAttack; } void Update() { // Control the display of the player action buttons. Only show when it is the // player's turn if (phase == BattlePhase.PlayerAttack) { theButtons.alpha = 1; theButtons.interactable = true; theButtons.blocksRaycasts = true; } else { theButtons.alpha = 0; theButtons.interactable = false; theButtons.blocksRaycasts = false; } } /// /// A player action. This action leaves the battle scene and returns to the world. /// public void RunAway() { GameState.justExitedBattle = true; NavigationManager.NavigateTo("Overworld"); } /// /// This method creates enemies from the prefabs and calls the method /// that moves the enemies to the spawn points. /// /// IEnumerator SpawnEnemies() { // Spawn enemies in over time for (int i = 0; i < enemyCount; i++) { var newEnemy = (GameObject)Instantiate(EnemyPrefabs[0]); newEnemy.transform.position = new Vector3(10, -1, 0); yield return StartCoroutine(MoveCharacterToPoint(EnemySpawnPoints[i], newEnemy)); newEnemy.transform.parent = EnemySpawnPoints[i].transform; } } /// /// Moves the character into position using an animation that slides the char into place. /// /// /// /// IEnumerator MoveCharacterToPoint(GameObject destination, GameObject character) { float timer = 0f; var StartPosition = character.transform.position; if (SpawnAnimationCurve.length > 0) { while (timer < SpawnAnimationCurve.keys[SpawnAnimationCurve.length - 1].time) { character.transform.position = Vector3.Lerp(StartPosition, destination.transform.position, SpawnAnimationCurve.Evaluate(timer)); timer += Time.deltaTime; yield return new WaitForEndOfFrame(); } } else { character.transform.position = destination.transform.position; } } }