lua 游戏架构 之 游戏 AI (九)ai_mgr Ai管理

定义`ai_mgr`的类,用于管理游戏中实体的AI组件。

先定义 AI行为枚举和优先级: 

lua 游戏架构 之 游戏 AI (八)ai_tbl 行为和优先级-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/heyuchang666/article/details/140712839?spm=1001.2014.3001.5501lua 游戏架构 之 游戏 AI (一)ai_base-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/heyuchang666/article/details/140624481?spm=1001.2014.3001.5501

以下是对代码的具体解释:

1. **引入依赖**:  使用`require`函数引入全局定义和AI定义。

2. **关闭JIT编译**: 如果启用了JIT编译,则关闭它,以确保AI逻辑的一致性。

3. **定义`ai_mgr`类**: `ai_mgr`类用于管理实体的AI组件。

4. **构造函数 (`ctor`)**:

  •    - 构造函数接受一个`entity`参数,并初始化实体、子组件列表、子组件索引和当前激活的组件。
  •    - 调用`AddComponent`方法添加默认的AI组件(基础AI)。

5. **`AddComponent`方法**:

  •    - 根据传入的AI类型(`atype`),从`ai_tbl`映射表中获取对应的脚本信息。
  •    - 动态加载对应的脚本,并创建组件实例。
  •    - 将新创建的组件添加到子组件列表中,并调用其`OnAttach`方法。

6. **`RmvComponent`方法**:移除指定类型的AI组件,并调用其`OnDetach`方法。

7. **`GetActiveComp`方法**:返回当前激活的AI组件。

8. **`BuildIdx`方法**: 构建子组件索引列表,并按优先级排序。

9. **`SwitchComp`方法**:

  • 如果当前激活的组件(self._activeComp)不是新切换的组件,则先检查当前激活的组件是否开启(IsTurnOn)。如果是,则调用其OnLeave方法,使其离开当前状态。
  • 如果新切换的组件未开启,则调用其OnEnter方法,使其进入激活状态。
  • 更新当前激活的组件为新切换的组件(self._activeComp = comp)。

10. **`OnUpdate`方法**:
    - 调用当前激活的AI组件的`OnUpdate`方法,更新AI状态。

11. **`OnLogic`方法**:
    - 调用当前激活的AI组件的`OnLogic`方法,执行逻辑更新。如果逻辑更新失败,则将组件从激活状态移除。

12. **`OnStopAction`方法**:
    - 调用当前激活的AI组件的`OnStopAction`方法,停止当前动作。

13. **`OnAttackAction`方法**:
    - 调用当前激活的AI组件的`OnAttackAction`方法,处理攻击动作。

14. **`create_mgr`函数**:
    - 创建并返回一个新的`ai_mgr`实例。

代码逻辑流程:

  • - **初始化**:在实体创建时,通过`ai_mgr`的构造函数初始化AI管理器,添加默认的AI组件。
  • - **添加组件**:通过`AddComponent`方法添加新的AI组件。
  • - **移除组件**:通过`RmvComponent`方法移除不需要的AI组件。
  • - **切换组件**:在游戏运行时,通过`SwitchComp`方法根据当前情况切换到合适的AI组件。
  • - **更新和逻辑处理**:在每帧更新和逻辑处理时,调用当前激活的AI组件的相关方法。

关键点:

  • - **动态加载脚本**:通过`require`函数动态加载AI组件脚本。
  • - **组件管理**:通过`ai_tbl`映射表管理不同AI组件的脚本和优先级。
  • - **组件切换**:根据游戏逻辑和实体状态,动态切换AI组件,以实现不同的AI行为。

整体而言,这段代码为游戏中的AI组件提供了一个灵活的管理框架,根据不同的游戏场景和实体状态动态地切换和控制AI行为。
 

local require = requirerequire("global");
require("logic/entity/ai/ai_def");------------------------------------------------------
if jit thenjit.off(true, true)
end------------------------------------------------------
ai_mgr = class("ai_mgr");
function ai_mgr:ctor(entity)self._entity	= entity;self._childs	= { };self._child_idx	= { };self._activeComp= nil;-- add default ai componentself:AddComponent(eAType_BASE);-- get default ai componentself:SwitchComp();
endfunction ai_mgr:AddComponent(atype)local ai = ai_tbl[atype];if ai thenlocal comp = require("logic/entity/ai/" .. ai.script);if comp thenlocal c = comp.create_component(self._entity, ai.priority);if c thenc:SetName(ai.script);c:OnAttach();endself._childs[atype] = c;self:BuildIdx();endend
endfunction ai_mgr:RmvComponent(atype)local c = self._childs[atype];if c thenc:OnDetach();endself._childs[atype] = nil;self:BuildIdx();
endfunction ai_mgr:GetActiveComp()return self._activeComp;
endfunction ai_mgr:BuildIdx()self._child_idx = { };for k ,_ in pairs(self._childs) dotable.insert(self._child_idx, k);endlocal _cmp = function(d1, d2)if d1 > d2 thenreturn true;endreturn false;endtable.sort(self._child_idx, _cmp);
endfunction ai_mgr:SwitchComp()if jit thenjit.off(true, true)endif self._entity and self._entity:IsPlayer() and g_game_context:IsInPingMode() thenreturn false;endfor k, v in ipairs(self._child_idx) dolocal comp = self._childs[v];if self._entity:IsRenderable() or (comp._priority == eAI_Priority_High) thenif comp:Switch() thenif self._activeComp ~= comp thenif self._activeComp and self._activeComp:IsTurnOn() thenself._activeComp:OnLeave();endif not comp:IsTurnOn() then--if self._entity:GetEntityType()==eET_Mercenary then--log("entity enter ai " .. comp:GetName());--	endcomp:OnEnter();endself._activeComp = comp;endreturn true;endendendreturn false;
endfunction ai_mgr:OnUpdate(dTime)if self._activeComp thenif self._entity and self._entity:IsPlayer() and g_game_context:IsInPingMode() thenreturn ;endself._activeComp:OnUpdate(dTime);end
endfunction ai_mgr:OnLogic(dTick)if self._activeComp thenif self._entity and self._entity:IsPlayer() and g_game_context:IsInPingMode() thenreturn ;endif not self._activeComp:OnLogic(dTick) thenself._activeComp:OnLeave();self._activeComp = nil;return false;endendreturn true;
endfunction ai_mgr:OnStopAction(action)if self._activeComp thenself._activeComp:OnStopAction(action);end
endfunction ai_mgr:OnAttackAction(id)if self._activeComp thenself._activeComp:OnAttackAction(id);end
endfunction create_mgr(entity)return ai_mgr.new(entity);
end

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3268352.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

天工三维实景建软件 GodWork 3D 7.24 软件下载License使用

1、天工三维实景建软件GodWork 3D 7.24,城市级实景三维数据生产面临大数据量空三稳定解算的难题。受限于目前主流软件的解算能力与效率,生产单位常采用分块处理方法,接边处精度需要有足够的控制点来保证,这增加了外业布设控制点与内业的工作量…

巴斯勒相机(Basler) ACE2 dart 系列说明和软件

巴斯勒相机(Basler) ACE2 dart 系列说明和软件

开始尝试从0写一个项目--后端(三)

器材管理 和员工管理基本一致,就不赘述,展示代码为主 新增器材 表设计: 字段名 数据类型 说明 备注 id bigint 主键 自增 name varchar(32) 器材名字 img varchar(255) 图片 number BIGINT 器材数量 comment VARC…

Redis底层数据结构的实现

文章目录 1、Redis数据结构1.1 动态字符串1.2 intset1.3 Dict1.4 ZipList1.5 ZipList的连锁更新问题1.6 QuickList1.7 SkipList1.8 RedisObject 2、五种数据类型2.1 String2.2 List2.3 Set2.4 ZSET2.5 Hash 1、Redis数据结构 1.1 动态字符串 Redis中保存的Key是字符串&#xf…

php收银系统源码-收银员操作权限

收银系统是很多门店,尤其是连锁门店营业的必备工具,收银员每天需要通过收银系统记录商品的售卖数量,以及收款,会员开卡,核销订单等工作。但很多门店都不希望给收银员太高的权限,自然就离不开收银员的权限管…

windows server服务器/linux服务器离线安装pandas

windows server服务器/linux服务器离线安装pandas pypi官网下载whl文件速度较慢,推荐使用国内的镜像源来下载,镜像源地址为 清华大学 :https://pypi.tuna.tsinghua.edu.cn/simple/ 阿里云:http://mirrors.aliyun.com/pypi/simple…

Python | Leetcode Python题解之第278题第一个错误的版本

题目&#xff1a; 题解&#xff1a; # The isBadVersion API is already defined for you. # def isBadVersion(version: int) -> bool:class Solution:def firstBadVersion(self, n: int) -> int:left, right 1, nwhile left < right:mid left (right - left) //…

Dockerfile指令详解和Docker操作命令

1.容器的特点&#xff1a;1&#xff09;自包含&#xff08;包括应用程序及其运行环境&#xff09;&#xff1b;2&#xff09;可移植&#xff1b;3&#xff09;相互隔离&#xff1b;4&#xff09;轻量级。 2.docker成为容器的事实标准在于&#xff1a;1&#xff09;在运行环境上…

【通信模块】LoraWAN网络简介

LoRaWAN网络 技象科技相关文章总结&#xff0c;学习笔记&#xff0c;原文链接如下&#xff0c;转载请标明该出处&#xff1a; LORA&#xff1a; https://www.techphant.cn/tag/l-2 LORAWAN&#xff1a;https://www.techphant.cn/tag/l-3 其他&#xff1a;如LAN https://www…

静止轨道卫星大气校正(Atmospheric Correction)和BRDF校正

文章内容仅用于自己知识学习和分享&#xff0c;如有侵权&#xff0c;还请联系并删除 &#xff1a;&#xff09; 目的&#xff1a; TOA reflectance 转为 surface refletance。 主要包含两步&#xff1a; 1&#xff09;大气校正&#xff1b; 2&#xff09;BRDF校正 进度&#x…

repo 工具安装和使用教程(windows+gitee)

repo是什么 官方的定义&#xff1a;Repo是谷歌用python脚本写的调用git的一个脚本&#xff0c;可以实现管理多个git库。 Android的源代码使用Repo 命令行工具来管理多个git仓库&#xff0c;大概有百多个。要想克隆和管理百多个 Git 仓库&#xff0c;不是一件简单的事情。Repo 命…

嵌入式Python、ROS、SLAM、WebSocket和Node.js:智能巡逻监控安防机器人设计流程(代码示例)

项目概述 随着智能技术的发展&#xff0c;智能巡逻机器人在安防、监控和巡逻等领域的应用越来越广泛。本文将介绍一个结合嵌入式系统、机器人技术和后端开发的智能巡逻机器人。该机器人能够自主导航&#xff0c;实时检测异常情况&#xff08;如火灾或入侵者&#xff09;&#…

H616布线--规则设置于NET分组

一定先看工艺能力&#xff0c;再设计&#xff1a; 嘉立创盘中孔&#xff08;树脂塞孔电镀盖帽&#xff09;设计指引及规则 https://www.jlc.com/portal/q7i38630.html https://www.jlc.com/portal/vtechnology.html 这是我们的工艺参数&#xff0c;请您参考一下呢&#xff01…

Java_如何在IDEA中使用Git

注意&#xff1a;进行操作前首先要确保已经下载git&#xff0c;在IDEA中可以下载git&#xff0c;但是速度很慢&#xff0c;可以挂梯子下载。 导入git仓库代码 第一次导入&#xff1a; 首先得到要加载的git仓库的url&#xff1a; 在git仓库中点击 “克隆/下载” 按钮&#xf…

牛客TOP101:寻找峰值

文章目录 1. 题目描述2. 解题思路3. 代码实现 1. 题目描述 2. 解题思路 使用双指针&#xff0c;我们只需要找到一个峰值就可以了。 这个很重要&#xff0c;要记住。   我们先取到数组中间的值&#xff0c;让它与它的前一个或者后一个进行比较&#xff08;下面的代码实现是与后…

1、hadoop环境搭建

1、环境配置 ip(/etc/sysconfig/network-scripts) # 网卡1 DEVICEeht0 TYPEEthernet ONBOOTyes NM_CONTROLLEDyes BOOTPROTOstatic IPADDR192.168.59.11 GATEWAY192.168.59.1 NETMASK 255.255.255.0 # 网卡2 DEVICEeht0 TYPEEthernet ONBOOTyes NM_CONTROLLEDyes BOOTPROTOdh…

kafka源码阅读-ReplicaStateMachine(副本状态机)解析

概述 Kafka源码包含多个模块&#xff0c;每个模块负责不同的功能。以下是一些核心模块及其功能的概述&#xff1a; 服务端源码 &#xff1a;实现Kafka Broker的核心功能&#xff0c;包括日志存储、控制器、协调器、元数据管理及状态机管理、延迟机制、消费者组管理、高并发网络…

day05 Router、vuex、axios

配置 router和vuex需要在创建vue项目的时候&#xff0c;开始的时候选择Manually select features&#xff0c;于是就可以在下一个创建配置讯问中选择router和vuex。 axios则需要执行命令行&#xff1a; npm install axios -S 之后再在需要发送请求的view导入即可。 router…

某量JS逆向

https://chat.sensetime.com/wb/chat 目录 一、发起请求 二、观察发现只有入参 __data__ 进行了加密&#xff0c;返回是明文 三、 观察JS调用栈 四、从JS中搜索 __data__ 五、使用XHR对Ajax请求进行断点 六、再次发起请求就会断点拦住请求 七、对XHR入口分析 八、逐个…

挑选六西格玛管理咨询公司主要看什么

六西格玛作为一套被全球众多顶尖企业验证过的卓越绩效管理模式&#xff0c;正成为众多企业转型升级的利器。然而&#xff0c;面对市场上琳琅满目的六西格玛管理咨询公司&#xff0c;如何慧眼识珠&#xff0c;挑选出最适合自己企业的合作伙伴呢&#xff1f; 1、团队实力与专家阵…