Unity敌人逻辑笔记

写ai逻辑基本上都需要状态机。因为懒得手搓状态机,所以选择直接用动画状态机当逻辑状态机用。

架构设计

因为敌人的根节点已经有一个animator控制动画,只能增加一个子节点AI,给它加一个animator指向逻辑"动画"状态机。还有一个脚本,用来放一些检测函数和动画事件函数。

状态机图

敌人的行为描述:默认处在Safe状态,未发现敌人一段时间后进入Patrol状态,朝周围随机位置移动,一段时间且未发现敌人后停止。如果设置有目的地则进入Moving,离目的地在一定距离内且未发现敌人进入Safe。在Safe、Patrol、Moving发现了敌人都把foundEnemy和alert设置True,alert为Trur则进入Alert,foundEnemy为True则进入Attacking。Attacking开枪几秒,停歇几秒。如果此时检测敌人返回false,则foundEnemy设置为false,进入Chasing,根据之前记录的目标最后出现的位置移动过去,到那里后未发现目标则进入Alert,未发现敌人一段时间后进入Safe。

所有状态都不停执行检测敌人的方法。

动画剪辑设置

动画剪辑添加一个无关紧要的属性(如Scale)来卡时间。重要的是在特定的时间执行动画事件。如在Safe一段时间后开始巡逻:

cs 复制代码
public void StartPatrolling(){
        enemyController.SetBool(patrolling,true);
    }

攻击状态开枪几秒,停歇几秒,然后检查是否该换弹:

状态机行为脚本

在状态机行为脚本里满足某些条件时执行animator.SetXXX()改变动画参数,动画参数改变又引起状态转换,执行新的状态机行为脚本,可以达到状态机"自驱动"的效果。

如在Alert状态的OnStateUpdate()里不停检测敌人,检测到时设置foundEnemy进入攻击状态。

cs 复制代码
public class EnemyAlert : StateMachineBehaviour
{
    Character1 myCharacter;
    MyNPCAI myAI;
    override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex){
        myCharacter=animator.transform.parent.GetComponent<Character1>();
        myCharacter.PutAwayGun();
        myAI=animator.GetComponent<MyNPCAI>();
        myCharacter.PlayRandomClip(myAI.findAudio);
        myCharacter.UseRifle();
        myAI.StopLookingAround();
    }
    // OnStateUpdate is called on each Update frame between OnStateEnter and OnStateExit callbacks
    override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex){
        if(myAI.DetectEnemy()){
            animator.SetBool(MyNPCAI.foundEnemyPara,true);
        }
    }
}

但是每个状态机行为脚本进入时都要获取一遍组件。这很恶心。

效果演示

Unity简单敌人逻辑演示:巡逻、发现、攻击、追击_演示

相关推荐
叼烟扛炮1 小时前
Linux 学习笔记(五十四):内网穿透实战——用 frp 让外网访问你的私人电脑
linux·服务器·网络·笔记·学习
旖旎夜光1 小时前
【C++ 基础入门】C++ 继承(上):概念、切片、隐藏、默认成员函数与友元
c++·笔记·学习
叼烟扛炮2 小时前
[LangChain] 学习笔记(05):提示词模板(Prompt)与少样本注入(Few-Shot)实战
linux·人工智能·笔记·学习·langchain·prompt
La Pulga14 小时前
【FreeRTOS源码学习笔记】任务延时列表
笔记·mcu·学习·嵌入式·freertos·实时操作系统
Peter-OK19 小时前
PostgreSQL学习笔记(入门-进阶-精通说明)
笔记·学习·postgresql
成都蜀味缘餐饮技术培训学校21 小时前
手撕烤兔技术培训实战指南,秘制腌料配方比例与调制手法
大数据·经验分享·笔记·其他·微信公众平台
希和20271 天前
免费AI视频生成工具汇总(国内优先,适合做漫剧、短视频,Obsidian笔记版)
人工智能·笔记·音视频
蒸蒸yyyyzwd1 天前
秋招学习笔记 day109
笔记·八股
只愿云淡风清1 天前
正则表达式学习笔记 02:基础语法
笔记·学习·正则表达式
希和20272 天前
考研英语阅读词汇笔记|城市野径、抄近道步道(非正式小路)
笔记·考研