Exemple #1
0
        private IEnumerator DoAttack()
        {
            isAttacking = true;
            // for dual stick input
            Vector2 direction = new Vector2(Input.GetAxis("Aim_Horizontal"), Input.GetAxis("Aim_Vertical"));

            Debug.DrawRay(transform.position, direction, Color.red, 1);
            GameObject obj = pooler.RetrieveFromPool(Constants.PoolTags.Fireball, transform.position, Vector3Int.zero, transform);

            obj.GetComponent <Fireball>().damage = attackPower;
            Rigidbody2D rb = obj.GetComponent <Rigidbody2D>();

            // rb.AddForce(
            //     (direction * projectileSpeed)
            // );
            rb.velocity = (direction * projectileSpeed);
            pooler.ReturnToPool(Constants.PoolTags.Fireball, obj, 3f);
            yield return(new WaitForSeconds(1 / attackSpeed));

            isAttacking = false;
        }
    IEnumerator SpawnEnemies(Vector2 spawnCenter)
    {
        isSpawning = true;
        levelNum++;
        // increase spawn amount linearly
        int spawnAmount = this.spawnAmount + levelNum % 2;

        levelObj.text = levelTextPrefix + (levelNum + 1);
        Vector2[] spawnPostions = new Vector2[spawnAmount];
        for (int i = 0; i < spawnAmount; i++)
        {
            DoSpawnAnimation(i);
        }
        yield return(new WaitForSeconds(spawnAnimDuration));

        for (int i = 0; i < spawnAmount; i++)
        {
            SpawnEnemy(i);
        }
        // mark the end of spawn
        yield return(null);

        // Debug.Log("Enemies Alive - " + enemiesAlive);
        isSpawning = false;


        void DoSpawnAnimation(int index)
        {
            var spawnpos = spawnPostions[index] = spawnCenter + UnityEngine.Random.insideUnitCircle * spawnRadius;
            var obj      = pooler.RetrieveFromPool(Constants.PoolTags.SpawnAnim, spawnpos, Vector3Int.zero, transform);

            pooler.ReturnToPool(Constants.PoolTags.SpawnAnim, obj, spawnAnimDuration);
        }

        void SpawnEnemy(int index)
        {
            // find spawn position
            var spawnpos = spawnPostions[index];
            var enemyTag = GetEnemyTag();
            var enemyObj = pooler.RetrieveFromPool(enemyTag, spawnpos, Vector3Int.zero);

            // set target as player
            enemyObj.GetComponent <Enemy>().target = playerTransform;

            // set world camera
            enemyObj.GetComponentInChildren <Canvas>().worldCamera = cameraMain;

            // increase enemy count as we spawned one
            enemiesAlive++;
            textObj.text = enemiesAlive.ToString();
            characterObjs.Add(enemyObj);

            // on death decrease enemy count
            enemyObj.GetComponent <Heart>().deathEvent += () =>
            {
                enemiesAlive--;
                textObj.text = enemiesAlive.ToString();
                characterObjs.Remove(enemyObj);
                Debug.Log("Enemies Alive - " + enemiesAlive);
                // if enemiesAlive goes to zero
                // then spawn item rewards
            };
            // set enemy movement speed
            enemyObj.GetComponent <CharacterMotor>().movementSpeed = baseSpeed + levelNum * speedIncrement;
        }
    }