示例#1
0
    private IEnumerator Attack(int combo)
    {
        var     time = 0f;
        Vector3 pos;

        RaycastHit[] raycastHits;

        _isAttacking = true;
        _animator.SetBool("attack", true);

        yield return(null);

        while (time < _swirlTime)
        {
            time += Time.deltaTime;

            pos         = transform.position;
            raycastHits = Physics.SphereCastAll(transform.position, _attackRange, Vector3.forward, 0.1f, 1 << LayerMask.NameToLayer("Enemy"));
            foreach (var hit in raycastHits)
            {
                if (_enemiesHit.Contains(hit.transform.gameObject.GetInstanceID()))
                {
                    break;
                }

                Vector3 vec       = hit.transform.position;
                Vector3 direction = vec - _meshObject.transform.position;

                if (Vector3.Dot(direction, _meshObject.transform.right) > 0.7 ||
                    Vector3.Dot(direction, -_meshObject.transform.right) > 0.7)
                {
                    _events.onAttack();
                    EnemyPathing enemy = hit.transform.gameObject.GetComponent <EnemyPathing>();
                    if (enemy != null)
                    {
                        _enemiesHit.Add(hit.transform.gameObject.GetInstanceID());
                        enemy.DamagedByPlayer();
                    }
                }
            }

            yield return(null);
        }

        _enemiesHit.Clear();
        _animator.SetBool("attack", false);
        _isAttacking = false;
    }