Skip to content
Snippets Groups Projects
EnemySpawnController.cs 3.34 KiB
Newer Older
  • Learn to ignore specific revisions
  • using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.UI;
    
    
    public class EnemySpawnController : MonoBehaviour, IRoundCallback
    
        [SerializeField] List<Opponent> enemyList;
        [SerializeField] List<Image> enemySprites;
    
        [SerializeField] GameObject dragObject;
    
        Dictionary<Opponent, Image> enemies = new Dictionary<Opponent, Image>();
    
        bool running = false;
    
    
        Opponent activeSpawn;
        GameObject enemyImage;
    
        BaseCameraController cameraController;
    
    
        private void Awake()
        {
            mana = -1;
    
            cameraController = Camera.main.GetComponent<BaseCameraController>();
    
    
            for (int i = 0; i < enemyList.Count; i++)
            {
    
                enemies.Add(enemyList[i], enemySprites[i]);
    
        private void Start()
        {
            RoundController.instance.roundCallbacks.Add(this);
            OnRoundEnd();
        }
    
    
        // Update is called once per frame
        void Update()
        {
    
            var actualMana = StatsManager.instance.GetMana();
            if (mana != actualMana)
    
                ChangeActiveState();
            }
    
            OnEnemyDrag();
    
        }
    
        void ChangeActiveState()
        {
    
            foreach (KeyValuePair<Opponent, Image> enemy in enemies)
    
            {
                if (enemy.Key.enemyCost > mana)
                {
    
                    enemy.Value.color = new Color(0.3f, 0.3f, 0.3f, 1f);
    
                    enemy.Value.color = new Color(1f, 1f, 1f, 1f);
    
                }
            }
        }
    
        void SetEnemyToSpawnObject(string enemyName)
        {
            foreach (Opponent enemy in enemyList)
            {
                if (enemy.Name == enemyName)
                {
                    activeSpawn = enemy;
                }
            }
        }
    
        public void OnEnemyMouseDown(string enemyName)
        {
            SetEnemyToSpawnObject(enemyName);
    
            if (StatsManager.instance.ModifyMana(-1 * (int)activeSpawn.enemyCost) && !running)
    
            {
                dragObject.GetComponent<Image>().sprite = activeSpawn.EnemySprite;
    
                enemyImage = Instantiate(dragObject, GetPreviewWorldPosition(), Quaternion.identity, transform);
    
        public void OnEnemyDrag()
        {
            if (enemyImage != null)
            {
    
                enemyImage.transform.position = GetPreviewWorldPosition();
    
                var zoomRatio = 1 / cameraController.zoomRatio;
                enemyImage.transform.localScale = new Vector3(zoomRatio, zoomRatio, zoomRatio);
    
            }
        }
    
        public void OnEnemyDrop()
        {
    
            if (enemyImage != null)
            {
                Destroy(enemyImage);
                enemyImage = null;
    
                var targetPos = GetPreviewWorldPosition();
                var newEnemy = Instantiate(activeSpawn.enemyPrefab, targetPos, Quaternion.identity);
                // The spawned Enemy has the pivot at the bottom, not in the middle.
                // Move it down by half its height to match the preview position.
                targetPos.y -= newEnemy.GetComponent<SpriteRenderer>().bounds.extents.y;
                newEnemy.transform.position = targetPos;
    
    
        Vector3 GetPreviewWorldPosition()
        {
            Vector3 pos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            pos.z = 0;
            return pos;
        }
    
    
        public void OnRoundStart()
        {
            running = true;
        }
    
        public void OnRoundEnd()
        {
            running = false;
        }