示例#1
0
        /// <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);
        }
示例#2
0
 public void HealthModified(HurtableObject health)
 {
     if (IsActive())
     {
         indicator.ChangeFlashTime(CalculateHealthPulseTime());
     }
 }
示例#3
0
        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;
                }
            }
        }
示例#4
0
        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);
        }
示例#5
0
 // Start is called before the first frame update
 void Start()
 {
     PlayerHealth = Player.GetComponent <HurtableObject>();
 }
示例#6
0
 public bool IsAllowAttack(HurtableObject m)
 {
     return(InRange(m.transform.localPosition, _info.AttackRange));
 }
示例#7
0
 protected virtual void DamageOneTarget(HurtableObject target)
 {
     DamageTargets(new HurtableObject[] { target });
 }
示例#8
0
 public void UpdateText(HurtableObject obj)
 {
     tmpText.SetText(obj.CurrentHealth.ToString());
 }