protected override void Initialize(FSMEvent ev) { _eventGoTo = ev as AnimFSMEventGoTo; Vector3 dir = _eventGoTo.finalPosition - Agent.Transform.position; dir.y = 0; dir.Normalize(); if (dir != Vector3.zero) { _finalRotation.SetLookRotation(dir); } _startRotation = Agent.Transform.rotation; Agent.BlackBoard.motionType = GetMotionType(); if (_eventGoTo.motionType == MotionType.SPRINT) { _maxSpeed = Agent.BlackBoard.maxSprintSpeed; } else if (_eventGoTo.motionType == MotionType.RUN) { _maxSpeed = Agent.BlackBoard.maxRunSpeed; } else { _maxSpeed = Agent.BlackBoard.maxWalkSpeed; } _rotationProgress = 0; }
protected void SendEvent() { _eventGoTo = AnimFSMEventGoTo.pool.Get(); _eventGoTo.moveType = MoveType.FORWARD; _eventGoTo.motionType = MotionType.SPRINT; _eventGoTo.finalPosition = GetDestination(Agent.BlackBoard.desiredTarget); Agent.FSMComponent.SendEvent(_eventGoTo); }
public override void OnExit(Phenix.Unity.AI.WorldState ws) { if (_eventGoTo != null) { _eventGoTo.Release(); _eventGoTo = null; } base.OnExit(ws); }
public override void Reset() { base.Reset(); _eventGoTo = null; }
// Update is called once per frame protected override void Update() { base.Update(); if (Input.GetKey(KeyCode.Alpha1)) { AnimFSMEventGoTo ev = AnimFSMEventGoTo.pool.Get(); ev.moveType = MoveType.FORWARD; ev.motionType = MotionType.RUN; ev.finalPosition = Agent.Decision.GetBestAttackStart(Agent.BlackBoard.desiredTarget); Agent.FSMComponent.SendEvent(ev); } if (Input.GetKey(KeyCode.Alpha2)) { AnimFSMEventShowHideSword ev = AnimFSMEventShowHideSword.pool.Get(); ev.show = true; Agent.BlackBoard.weaponState = WeaponState.IN_HAND; Agent.FSMComponent.SendEvent(ev); } if (Input.GetKey(KeyCode.Alpha3)) { AnimFSMEventIdle ev = AnimFSMEventIdle.pool.Get(); Agent.FSMComponent.SendEvent(ev); } if (Input.GetKey(KeyCode.Alpha4)) { AnimFSMEventRotate ev = AnimFSMEventRotate.pool.Get(); ev.target = Agent.BlackBoard.desiredTarget; //ev.rotationModifier = 0.8f; Agent.FSMComponent.SendEvent(ev); } if (Input.GetKey(KeyCode.Alpha5)) { AnimFSMEventCombatMove ev = AnimFSMEventCombatMove.pool.Get(); ev.target = Agent.BlackBoard.desiredTarget; ev.minDistanceToTarget = 3; ev.moveType = MoveType.FORWARD; if (Agent.agentType == AgentType.DOUBLE_SWORDS_MAN || Agent.agentType == AgentType.SWORD_MAN) // 这里暂时偷个懒,另外扩展一个不同参数的goapaction才是更灵活的做法 { ev.motionType = MotionType.WALK; ev.totalMoveDistance = Agent.BlackBoard.DistanceToDesiredTarget - (Agent.BlackBoard.combatRange * 0.8f); } else { ev.totalMoveDistance = UnityEngine.Random.Range((Agent.BlackBoard.DistanceToDesiredTarget - (Agent.BlackBoard.combatRange * 0.5f)) * 0.5f, Agent.BlackBoard.DistanceToDesiredTarget - (Agent.BlackBoard.combatRange * 0.5f)); } Agent.FSMComponent.SendEvent(ev); } if (Input.GetKey(KeyCode.Alpha6)) { AnimFSMEventCombatMove ev = AnimFSMEventCombatMove.pool.Get(); ev.moveType = MoveType.BACKWARD; ev.target = Agent.BlackBoard.desiredTarget; ev.minDistanceToTarget = 0; if (Agent.agentType == AgentType.DOUBLE_SWORDS_MAN) // 这里暂时偷个懒,另外扩展一个不同参数的goapaction才是更灵活的做法 { ev.motionType = MotionType.RUN; ev.totalMoveDistance = UnityEngine.Random.Range(4f, 6f); } else { ev.totalMoveDistance = UnityEngine.Random.Range(2f, 5f); } Agent.FSMComponent.SendEvent(ev); } if (Input.GetKey(KeyCode.Alpha7)) { AnimFSMEventCombatMove ev = AnimFSMEventCombatMove.pool.Get(); ev.moveType = MoveType.LEFTWARD; ev.target = Agent.BlackBoard.desiredTarget; ev.totalMoveDistance = UnityEngine.Random.Range(2.0f, 4.0f); ev.minDistanceToTarget = Agent.BlackBoard.DistanceToDesiredTarget * 0.7f; Agent.FSMComponent.SendEvent(ev); } if (Input.GetKey(KeyCode.Alpha8)) { AnimFSMEventCombatMove ev = AnimFSMEventCombatMove.pool.Get(); ev.moveType = MoveType.RIGHTWARD; ev.target = Agent.BlackBoard.desiredTarget; ev.totalMoveDistance = UnityEngine.Random.Range(2.0f, 4.0f); ev.minDistanceToTarget = Agent.BlackBoard.DistanceToDesiredTarget * 0.7f; Agent.FSMComponent.SendEvent(ev); } if (Input.GetKey(KeyCode.Alpha9)) { AnimFSMEventShowHideSword ev = AnimFSMEventShowHideSword.pool.Get(); ev.show = false; Agent.BlackBoard.weaponState = WeaponState.NOT_IN_HANDS; Agent.FSMComponent.SendEvent(ev); } if (Input.GetKey(KeyCode.Alpha0)) { AnimFSMEventAttackMelee ev = AnimFSMEventAttackMelee.pool.Get(); ev.target = Agent.BlackBoard.desiredTarget; //ev.attackType = OrderAttackType.X; //ev.animAttackData = Agent.GetComponent<AnimSet>().GetFirstAttackAnim(Agent.BlackBoard.weaponSelected, // ev.attackType); Agent.FSMComponent.SendEvent(ev); } if (Input.GetKey(KeyCode.Minus)) { AnimFSMEventAttackWhirl ev = AnimFSMEventAttackWhirl.pool.Get(); ev.data = Agent.GetComponent <AnimSet>().GetWhirlAttackAnim(); Agent.FSMComponent.SendEvent(ev); } }