using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class EnemySpawnController : MonoBehaviour { [SerializeField] List<Opponent> enemyList; [SerializeField] List<Image> enemySprites; [SerializeField] GameObject dragObject; Dictionary<Opponent, Image> enemies = new Dictionary<Opponent, Image>(); float mana; 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]); } } // Update is called once per frame void Update() { var actualMana = StatsManager.instance.GetMana(); if (mana != actualMana) { 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); } else { 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)) { dragObject.GetComponent<Image>().sprite = activeSpawn.EnemySprite; enemyImage = Instantiate(dragObject, GetPreviewWorldPosition(), Quaternion.identity, transform); OnEnemyDrag(); } } 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; } }