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