/// <summary> Damage target, Called From Animator event </summary> public virtual void DamageTarget() { if (_action != Action.Attack) { return; } const uint FAIL_COUNT = 2; if (_attackAudioClip != null) { _audio.PlayOneShot(_attackAudioClip); } var nearAttackableObject = GetAttackableObject(this._info.AttackRange); if (nearAttackableObject.Count == 0) { _failAttackCount++; } else { _failAttackCount = 0; } if (_failAttackCount > FAIL_COUNT) { _target = null; _action = Action.Walk; } DamageTargets(nearAttackableObject); }
public void HealthModified(HurtableObject health) { if (IsActive()) { indicator.ChangeFlashTime(CalculateHealthPulseTime()); } }
protected virtual void FindNearestTarget() { if (_freeze) { _target = null; _action = Action.Walk; return; } if ( (!_target || !_target.Alive || Time.time - _lastFindTargetTime > FIND_TARGET_DELTA) ) { _target = null; var enemiesList = GetAttackableObject(); var currentPos = this.transform.localPosition; float[] distanceArray = enemiesList.Select( m => Vector3.Distance(m.transform.localPosition, currentPos) ).ToArray(); int minDistanceIndex = Helper.GetMinIndex(distanceArray); if (minDistanceIndex < 0) { return; } if (enemiesList[minDistanceIndex] != this) { _target = enemiesList[minDistanceIndex]; _lastFindTargetTime = Time.time; } } else { if (!IsAllowAttack(_target)) { _action = Action.Walk; } } }
protected bool IsInRange(HurtableObject obj) { var myPos = this.transform.localPosition; var objPos = obj.transform.localPosition; var rect1Center = myPos + _collider.bounds.center; var rect1Size = _collider.bounds.size; var rect2Center = objPos + obj.Bound.center; var rect2Size = obj.Bound.size; var rect1 = new { x = rect1Center.x - rect1Size.x / 2, y = rect1Center.z - rect1Size.z / 2, width = rect1Size.x, height = rect1Size.z }; var rect2 = new { x = rect2Center.x - rect2Size.x / 2, y = rect2Center.z - rect2Size.z / 2, width = rect2Size.x, height = rect2Size.z }; return(rect1.x < rect2.x + rect2.width && rect1.x + rect1.width > rect2.x && rect1.y < rect2.y + rect2.height && rect1.height + rect1.y > rect2.y); }
// Start is called before the first frame update void Start() { PlayerHealth = Player.GetComponent <HurtableObject>(); }
public bool IsAllowAttack(HurtableObject m) { return(InRange(m.transform.localPosition, _info.AttackRange)); }
protected virtual void DamageOneTarget(HurtableObject target) { DamageTargets(new HurtableObject[] { target }); }
public void UpdateText(HurtableObject obj) { tmpText.SetText(obj.CurrentHealth.ToString()); }