private bool IsEnemyAndAlive(GameObject obj)
        {
            UnitObject charObj = obj.GetComponent <UnitObject>();

            return(charObj.TeamIndex != TeamIndex && charObj.TeamIndex != 0 && charObj.IsAlive);
        }
        void Update()
        {
            // ================ IsPlaying or Alive ======================
            if (!BattleManager.IsPlaying)
            {
                return;
            }
            if (BattleManager.IsCinematic)
            {
                return;
            }
            if (!IsAlive)
            {
                return;
            }

            // ================ Timing ========================
            _stunDuration    -= Time.deltaTime;
            _knockUpDuration -= Time.deltaTime;
            if (_knockUpDuration <= 0 && unitState == UnitState.KnockUp)
            {
                RemoveKnockUp();
                unitState = UnitState.Idle;
            }
            if (_stunDuration <= 0 && unitState == UnitState.Stun)
            {
                RemoveStun();
                unitState = UnitState.Idle;
            }
            _attackCooldown -= Time.deltaTime;
            if (!listEffects.IsNullOrEmpty())
            {
                for (int i = 0; i < listEffects.Count; i++)
                {
                    listEffects[i].Update(Time.deltaTime);
                }
            }
            if (!listSkill.IsNullOrEmpty())
            {
                for (int i = 0; i < listSkill.Count; i++)
                {
                    listSkill[i].Update(Time.deltaTime);
                }
            }
            // ==============================================

            // ================ Attack - Moving ========================
            if (unitScript == null)
            {
                return;
            }
            if (!IsAttackable)
            {
                return;
            }
            //if (defaultTarget != null && !defaultTarget.IsAlive) target = null;
            if (target != null && !target.IsAlive)
            {
                target = null;
            }
            // ================ On CC ========================
            if (OnKnockUp)
            {
                float rad   = (CONSTANT.Time_KnockUp - _knockUpDuration) / CONSTANT.Time_KnockUp * Mathf.PI;
                float axisY = Mathf.Sin(rad);
                //Debug.Log("axisY: " + axisY);
                unitAnimation.transform.localPosition            = new Vector2(0, axisY);
                UnitShadow.GetComponent <SpriteRenderer>().color = new Color(1, 1, 1, (2 - axisY) / 2);
                return;
            }
            if (OnStun)
            {
                return;
            }
            if (OnCC)
            {
                return;
            }
            // ================  ========================
            if (unitAnimation.IsOnAnimationCantMove && !isManualMoving)
            {
                return;
            }
            if (isManualCasting)
            {
                isManualCasting = false;
                return;
            }
            // =========================== Skill ===============================
            if (IsAutoCastSkill || !IsSelected)
            {
                for (int i = 0; i < listSkill.Count; i++)
                {
                    if (listSkill[i].Type == SkillScript.SkillType.Active)
                    {
                        if (listSkill[i].CastCondition() && listSkill[i].IsReadyToUse)
                        {
                            CastSkill(listSkill[i]);
                            //Debug.Log("AutoCast: " + listSkill[i].Name + "-" + i + " -cd: " + listSkill[i].CurrentCooldown);
                            return;
                        }
                    }
                }
            }
            // =========================== Moving ===============================
            if (!isAutoFindTarget && isManualMoving)
            {
                unitState = UnitState.Move;
                MoveToPosition(manualMovePosition);
            }
            else
            {
                if (target == null)
                {
                    if (FindClosestTarget())
                    {
                        MoveAndAttackOnTarget();
                    }
                    else
                    {
                        //if (playerOwned.IsBotPlayer)
                        //{
                        //    unitState = UnitState.Move;
                        //    if (unitState == UnitState.Move && !unitAnimation.IsOnAnimationCantMove)
                        //    {
                        //        //UnitObject _enemy = playerOwned.GetNextDefaultTarget();
                        //        //Vector3 _posTarget = new Vector3(_enemy.transform.position.x, transform.position.y, 0);
                        //        //MoveToPosition(_posTarget);
                        //        //if (unitScript.Type != UnitScript.UnitType.Building)
                        //        //    rigid2D.bodyType = RigidbodyType2D.Dynamic;
                        //        //float step = TotalMovementSpeed * Time.deltaTime;
                        //        //unitAnimation.SetFacingLeft(transform.position.x > _enemy.transform.position.x);
                        //        //transform.position = Vector3.MoveTowards(transform.position, new Vector3(_enemy.transform.position.x, transform.position.y, 0), step);
                        //    }
                        //}
                        //else
                        //{
                        unitState = UnitState.Idle;
                        //}
                    }
                }
                else
                {
                    MoveAndAttackOnTarget();
                }
            }
            // ==============================================
            RefreshAxisZ();
        }
        private bool FindClosestTarget()
        {
            bool onlyTarget   = false;
            bool findPriority = false;

            // Only target first
            if (unitScript.OnlyTarget != UnitScript.UnitType.None)
            {
                for (int i = 0; i < BattleManager.ListUnitInBattle.Count; i++)
                {
                    if (BattleManager.ListUnitInBattle[i].TeamIndex != TeamIndex &&
                        BattleManager.ListUnitInBattle[i].unitScript.Type == unitScript.OnlyTarget)
                    {
                        onlyTarget = true;
                    }
                }
            }

            // Check Priority target 2nd
            if (unitScript.PriorityTarget != UnitScript.UnitType.None)
            {
                for (int i = 0; i < BattleManager.ListUnitInBattle.Count; i++)
                {
                    if (BattleManager.ListUnitInBattle[i].TeamIndex != TeamIndex &&
                        BattleManager.ListUnitInBattle[i].unitScript.Type == unitScript.PriorityTarget)
                    {
                        findPriority = true;
                    }
                }
            }

            // Find target
            float      _disClosest  = Mathf.Infinity;
            float      maxDistance  = isAutoFindTarget ? Mathf.Infinity : CONSTANT.FindTargetRadius;
            UnitObject _unitClosest = null;

            for (int i = 0; i < BattleManager.ListUnitInBattle.Count; i++)
            {
                UnitObject unit = BattleManager.ListUnitInBattle[i];
                float      _dis = Vector2.Distance(transform.position, unit.transform.position);
                //Debug.Log(string.Format("Name: {0} - Distance: {1}", col.gameObject.name, _dis));
                if (_dis <= maxDistance && _dis <= _disClosest)
                {
                    if (IsEnemyAndAlive(unit.gameObject))
                    {
                        if (onlyTarget)
                        {
                            if (unit.unitScript.Type == unitScript.OnlyTarget)
                            {
                                _unitClosest = unit;
                                _disClosest  = _dis;
                            }
                        }
                        else if (findPriority)
                        {
                            if (unit.unitScript.Type == unitScript.PriorityTarget)
                            {
                                _unitClosest = unit;
                                _disClosest  = _dis;
                            }
                        }
                        else
                        {
                            _unitClosest = unit;
                            _disClosest  = _dis;
                        }
                    }
                }
            }
            if (_unitClosest != null)
            {
                //Debug.Log(string.Format("Closest = Name: {0} - Distance: {1}", _colClosest.gameObject.name, _disClosest));
                target = _unitClosest;
                if (_disClosest > AttackRange)
                {
                    unitState = UnitState.Move;
                }
            }
            return(_unitClosest != null);
        }
 public void TakeDamage(int damage, UnitObject attacker)
 {
     TakeDamage(damage, attacker, Color.red);
 }