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); }