Skip to content
Snippets Groups Projects
AntiPlayer.cs 2.47 KiB
Newer Older
  • Learn to ignore specific revisions
  • using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    
    public class AntiPlayer : Fighter, IFighterCallback
    
        [SerializeField, Tooltip("How close the AntiPlayer has to be to start attacking, or how far away it has to be to start running towards the target")]
        float maxDistanceToEnemy = 1f;
        [SerializeField] float movementSpeed = 4f;
    
        List<Fighter> enemies = new List<Fighter>();
        Fighter currentTargetEnemy;
        string[] attackAnimationTriggers = new string[] { "Attack1", "Attack2", "Attack3" };
    
        protected override void Awake()
        {
            base.Awake();
            // TODO Eventually, the player will be able to place enemies _after_ the AntiPlayer has been created.
            // Idea: Create a global GameManager-like class where scripts can register an IGameState callback,
            // which has a `OnRoundStart()` callback.
            foreach (var enemy in GameObject.FindGameObjectsWithTag("Enemy"))
            {
                enemies.Add(enemy.GetComponent<Fighter>());
            }
            CalculateClosestEnemy();
            animator.SetBool("Grounded", true);
        }
    
        protected override void Update()
        {
            base.Update();
    
            var vectorToNextEnemy = currentTargetEnemy.transform.position - transform.position;
            spriteRenderer.flipX = vectorToNextEnemy.x < 0;
            if (Mathf.Abs(vectorToNextEnemy.x) > maxDistanceToEnemy)
            {
                animator.SetInteger("AnimState", 1); // Run
                rigidbody.velocity = new Vector2(Mathf.Sign(vectorToNextEnemy.x) * movementSpeed, rigidbody.velocity.y);
            } else
            {
                animator.SetInteger("AnimState", 0);
                rigidbody.velocity = new Vector2(0, rigidbody.velocity.y);
            }
        }
        protected override bool CanAttack()
        {
            // Can only attack when near an Enemy
            var vectorToNextEnemy = currentTargetEnemy.transform.position - transform.position;
            return Mathf.Abs(vectorToNextEnemy.x) <= maxDistanceToEnemy;
        }
    
    
        protected override void Attack()
        {
    
            animator.SetTrigger(attackAnimationTriggers[Random.Range(0, attackAnimationTriggers.Length)]);
    
        void CalculateClosestEnemy()
        {
            enemies.Sort((a, b) => (int)Mathf.Sign(Vector3.Distance(transform.position, a.transform.position) - Vector3.Distance(transform.position, b.transform.position)));
            currentTargetEnemy = enemies[0];
        }
    
        public void OnFighterDeath(Fighter fighter)
        {
            enemies.Remove(fighter);
            CalculateClosestEnemy();
        }