Esempio n. 1
0
    protected override void Initialize(FSMEvent ev = null)
    {
        _eventAttackCross = ev as AnimFSMEventAttackCross;

        _attackStatus = AttackStatus.PREPARING;
        Agent.BlackBoard.motionType = MotionType.ATTACK;
        _startRotation = Agent.Transform.rotation;
        _startPosition = Agent.Transform.position;

        if (_eventAttackCross.target != null)
        {
            float   angle    = 0;
            float   distance = 0;
            Vector3 dir      = _eventAttackCross.target.Position - Agent.Transform.position;
            distance = dir.magnitude;
            if (distance > 0.1f)
            {
                dir.Normalize();
                angle = Vector3.Angle(Agent.Transform.forward, dir);
                if (angle < 40 && Vector3.Angle(Agent.Forward, _eventAttackCross.target.Forward) < 80)
                {
                    _backHit = true;
                }
            }
            else
            {
                dir = Agent.Transform.forward;
            }

            _finalRotation.SetLookRotation(dir);

            if (distance < Agent.BlackBoard.weaponRange)
            {
                _finalPosition = _startPosition;
            }
            else
            {
                _finalPosition = _eventAttackCross.target.transform.position - dir * Agent.BlackBoard.weaponRange;
            }

            _moveTime     = (_finalPosition - _startPosition).magnitude / 20.0f;
            _rotationTime = angle / 720.0f;
        }
        else
        {
            _finalRotation.SetLookRotation(_eventAttackCross.attackDir);
            _rotationTime = Vector3.Angle(Agent.Transform.forward, _eventAttackCross.attackDir) / 720.0f;
            _moveTime     = 0;
        }

        _rotationOk          = (_rotationTime == 0);
        _positionOK          = (_moveTime == 0);
        _currentRotationTime = 0;
        _currentMoveTime     = 0;

        _isCritical = IsCritical();
        _knockdown  = IsKnockDown();

        _remainAttackCount = 2;
    }
 public override void OnExit(Phenix.Unity.AI.WorldState ws)
 {
     if (_eventCross != null)
     {
         _eventCross.Release();
         _eventCross = null;
     }
     base.OnExit(ws);
 }
    void SendEvent()
    {
        _eventCross = AnimFSMEventAttackCross.pool.Get();

        if (Agent.BlackBoard.desiredTarget)
        {
            Agent.BlackBoard.desiredDirection = Agent.BlackBoard.desiredTarget.Position - Agent.Position;
            Agent.BlackBoard.desiredDirection.Normalize();
            _eventCross.attackDir = Agent.BlackBoard.desiredDirection;
            _eventCross.target    = Agent.BlackBoard.HasAttackTarget ? Agent.BlackBoard.desiredTarget : null;
        }
        else
        {
            _eventCross.attackDir = Agent.Forward;
        }

        _eventCross.animAttackData = Agent.AnimSet.ProcessCombo(ComboType.CROSS);
        Agent.FSMComponent.SendEvent(_eventCross);
    }
 public override void Reset()
 {
     base.Reset();
     _eventCross = null;
 }