private EnemyHandler GetClosestEnemyHandler(Vector3 playerPosition)
        {
            const float  maxDistance = 50f;
            EnemyHandler closest     = null;

            foreach (EnemyHandler enemyHandler in enemyHandlerList)
            {
                if (Vector3.Distance(playerPosition, enemyHandler.GetPosition()) > maxDistance)
                {
                    continue;
                }
                if (closest == null)
                {
                    closest = enemyHandler;
                }
                else
                {
                    if (Vector3.Distance(playerPosition, enemyHandler.GetPosition()) < Vector3.Distance(playerPosition, closest.GetPosition()))
                    {
                        closest = enemyHandler;
                    }
                }
            }
            return(closest);
        }
        private void SpawnEnemy()
        {
            Vector3      spawnPosition = playerHandler.GetPosition() + UtilsClass.GetRandomDir() * UnityEngine.Random.Range(50, 100f);
            EnemyHandler enemyHandler  = EnemyHandler.CreateEnemy(spawnPosition, playerHandler);

            enemyHandler.OnDead += EnemyHandler_OnDead;
            enemyHandlerList.Add(enemyHandler);
        }
        private void HandleAttack()
        {
            if (Input.GetKeyDown(KeyCode.Space))
            {
                // Attack
                SetStateBusy();

                Vector3      attackDir    = lastMoveDir;
                EnemyHandler enemyHandler = getClosestEnemyHandlerFunc(GetPosition() + attackDir * 4f);
                if (enemyHandler != null)
                {
                    // Has a target nearby
                    attackDir = (enemyHandler.GetPosition() - GetPosition()).normalized;
                    // Test if too close to dash
                    const float tooCloseToDashDistance = 10f;
                    if (Vector3.Distance(enemyHandler.GetPosition(), GetPosition()) > tooCloseToDashDistance)
                    {
                        // Dash towards attack distance
                        transform.position = transform.position + attackDir * 4f;
                    }
                    // Is enemy within attack range?
                    const float attackDistance = 30f;
                    if (Vector3.Distance(enemyHandler.GetPosition(), GetPosition()) < attackDistance)
                    {
                        // Close enough to damage
                        enemyHandler.GetHealthSystem().Damage(34);
                        Blood_Handler.SpawnBlood(enemyHandler.GetPosition(), attackDir);
                    }
                }
                else
                {
                    // No nearby target
                    transform.position = transform.position + attackDir * 4f;
                }
                lastMoveDir = attackDir;

                Transform swordSlashTransform = Instantiate(GameAssets.i.pfSwordSlash, GetPosition() + attackDir * 13f, Quaternion.Euler(0, 0, UtilsClass.GetAngleFromVector(attackDir)));
                swordSlashTransform.GetComponent <SpriteAnimator>().onLoop = () => Destroy(swordSlashTransform.gameObject);

                UnitAnimType activeAnimType = unitAnimation.GetActiveAnimType();
                if (activeAnimType == GameAssets.UnitAnimTypeEnum.dSwordTwoHandedBack_Sword)
                {
                    swordSlashTransform.localScale = new Vector3(swordSlashTransform.localScale.x, swordSlashTransform.localScale.y * -1, swordSlashTransform.localScale.z);
                    unitAnimation.PlayAnimForced(GameAssets.UnitAnimTypeEnum.dSwordTwoHandedBack_Sword2, lastMoveDir, 1f, (UnitAnim unitAnim) => SetStateNormal(), null, null);
                }
                else
                {
                    unitAnimation.PlayAnimForced(GameAssets.UnitAnimTypeEnum.dSwordTwoHandedBack_Sword, lastMoveDir, 1f, (UnitAnim unitAnim) => SetStateNormal(), null, null);
                }
            }
        }
Beispiel #4
0
        public static EnemyHandler CreateEnemy(Vector3 spawnPosition, PlayerHandler playerHandler)
        {
            Transform    enemyTransform = Instantiate(GameAssets.i.pfEnemyTransform, spawnPosition, Quaternion.identity);
            EnemyHandler enemyHandler   = enemyTransform.GetComponent <EnemyHandler>();

            HealthSystem healthSystem = new HealthSystem(100);
            HealthBar    healthBar    = Instantiate(GameAssets.i.pfHealthBar, spawnPosition + new Vector3(0, 10), Quaternion.identity, enemyTransform).GetComponent <HealthBar>();

            healthBar.Setup(healthSystem);

            enemyHandler.Setup(playerHandler, healthSystem);

            return(enemyHandler);
        }
        private void EnemyHandler_OnDead(object sender, System.EventArgs e)
        {
            EnemyHandler enemyHandler = sender as EnemyHandler;

            enemyHandlerList.Remove(enemyHandler);
        }