自定义导航网站 源码,电脑网站首页设计,北京到广州飞机,网络运营计划方案写ai逻辑基本上都需要状态机。因为懒得手搓状态机#xff0c;所以选择直接用动画状态机当逻辑状态机用。
架构设计
因为敌人的根节点已经有一个animator控制动画#xff0c;只能增加一个子节点AI#xff0c;给它加一个animator指向逻辑“动画”状态机。还有一个脚本#…写ai逻辑基本上都需要状态机。因为懒得手搓状态机所以选择直接用动画状态机当逻辑状态机用。
架构设计
因为敌人的根节点已经有一个animator控制动画只能增加一个子节点AI给它加一个animator指向逻辑“动画”状态机。还有一个脚本用来放一些检测函数和动画事件函数。 状态机图
敌人的行为描述默认处在Safe状态未发现敌人一段时间后进入Patrol状态朝周围随机位置移动一段时间且未发现敌人后停止。如果设置有目的地则进入Moving离目的地在一定距离内且未发现敌人进入Safe。在Safe、Patrol、Moving发现了敌人都把foundEnemy和alert设置Truealert为Trur则进入AlertfoundEnemy为True则进入Attacking。Attacking开枪几秒停歇几秒。如果此时检测敌人返回false则foundEnemy设置为false进入Chasing根据之前记录的目标最后出现的位置移动过去到那里后未发现目标则进入Alert未发现敌人一段时间后进入Safe。
所有状态都不停执行检测敌人的方法。 动画剪辑设置
动画剪辑添加一个无关紧要的属性如Scale来卡时间。重要的是在特定的时间执行动画事件。如在Safe一段时间后开始巡逻 public void StartPatrolling(){enemyController.SetBool(patrolling,true);} 攻击状态开枪几秒停歇几秒然后检查是否该换弹 状态机行为脚本
在状态机行为脚本里满足某些条件时执行animator.SetXXX()改变动画参数动画参数改变又引起状态转换执行新的状态机行为脚本可以达到状态机“自驱动”的效果。
如在Alert状态的OnStateUpdate()里不停检测敌人检测到时设置foundEnemy进入攻击状态。
public class EnemyAlert : StateMachineBehaviour
{Character1 myCharacter;MyNPCAI myAI;override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex){myCharacteranimator.transform.parent.GetComponentCharacter1();myCharacter.PutAwayGun();myAIanimator.GetComponentMyNPCAI();myCharacter.PlayRandomClip(myAI.findAudio);myCharacter.UseRifle();myAI.StopLookingAround();}// OnStateUpdate is called on each Update frame between OnStateEnter and OnStateExit callbacksoverride public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex){if(myAI.DetectEnemy()){animator.SetBool(MyNPCAI.foundEnemyPara,true);}}
}
但是每个状态机行为脚本进入时都要获取一遍组件。这很恶心。
效果演示
Unity简单敌人逻辑演示巡逻、发现、攻击、追击_演示