lua 游戏架构 之 游戏 AI (三)ai_attack

这段Lua脚本定义了一个名为 `ai_attack` 的类,继承自 `ai_base` 类。

lua 游戏架构 之 游戏 AI (一)ai_base-CSDN博客文章浏览阅读119次。定义了一套接口和属性,可以基于这个基础类派生出具有特定行为的AI组件。例如,可以创建追逐敌人的AI、巡逻的AI或使用特定策略的AI等,都继承自这个基础类https://blog.csdn.net/heyuchang666/article/details/140624481?spm=1001.2014.3001.5501

这个类用于处理游戏中AI的攻击逻辑。以下是对代码的详细解释:

1. **引入基类**:
   - `local BASE = require("logic/entity/ai/ai_base").ai_base;` 这行代码引入了基类 `ai_base`。

2. **定义 `ai_attack` 类**:
   - `ai_attack = class("ai_attack", BASE);` 这行代码定义了 `ai_attack` 类并指定其基类为 `BASE`。

3. **构造函数 (`ctor`)**:
   - `function ai_attack:ctor(entity)` 构造函数接受一个 `entity` 参数,并设置 `_type` 属性为 `eAType_ATTACK`。

4. **`IsValid` 方法**:
   - 这个方法用于验证AI是否可以执行攻击。它检查实体是否死亡、是否可以攻击、是否是特定类型的实体等条件。

5. **`CanAttackNoneTarget` 方法**:
   - 这个方法用于判断是否可以攻击没有目标的情况,当前实现返回 `false`。

6. **`OnEnter` 方法**:
   - 当AI组件进入激活状态时执行。该方法处理目标定位、实体朝向调整、攻击开始逻辑等。
   - 如果实体有目标并且速度大于0,则计算目标和实体之间的旋转角度,并设置实体面向目标。

7. **`OnLeave` 方法**:
   - 当AI组件离开激活状态时执行。该方法处理停止攻击的逻辑,并恢复实体的移动能力。

8. **`OnUpdate` 方法**:
   - 每帧调用,用于更新AI状态。如果基类的 `OnUpdate` 方法返回 `false`,则当前方法也返回 `false`。

9. **`OnLogic` 方法**:
   - 逻辑更新方法,用于处理技能序列、检查攻击持续时间等。
   - 如果技能序列有效且是当前技能的子技能,则执行相关逻辑。
   - 检查自攻击开始以来的时间是否已经超过技能的持续时间,如果是,则返回 `false`。

10. **创建组件函数**:
    - `function create_component(entity, priority)` 这个函数用于创建 `ai_attack` 类的新实例,传入一个实体和一个优先级。

代码中的一些关键函数和方法:
- `IsDead()`:检查实体是否死亡。
- `CanAttack()`:检查实体是否可以攻击。
- `GetEntityType()`:获取实体的类型。
- `GetMapEnter()`:获取地图进入的状态。
- `Test(eEBAttack)`:测试实体的行为是否包含攻击行为。
- `CanUse()`:检查技能是否可以使用。
- `IsPlayer()`:检查目标是否是玩家。
- `GetRadius()`:获取实体的半径。
- `vec3_sub1()`:计算两个向量的差。
- `vec3_len()`:计算向量的长度。
- `vec3_angle1()`:计算两个向量之间的夹角。
- `SetFaceDir()`:设置实体的面向方向。
- `StartAttack()`:开始攻击。
- `StopAttack()`:停止攻击。
- `FinishAttack()`:完成攻击。

这个脚本为游戏中的AI提供了一个攻击行为的基础框架,可以根据具体游戏的需求进行扩展和修改。

----------------------------------------------------------------local require = requirelocal BASE = require("logic/entity/ai/ai_base").ai_base;------------------------------------------------------
ai_attack = class("ai_attack", BASE);
function ai_attack:ctor(entity)self._type = eAType_ATTACK;
endfunction ai_attack:IsValid()local entity = self._entity;if entity:IsDead() or not entity:CanAttack() thenreturn false;endif entity:GetEntityType() == eET_Player and entity._DigStatus == 2 thenreturn false;endif entity:GetEntityType() == eET_Trap thenif entity._ntype ~= eEntityTrapType_AOE thenreturn false;elseif entity._curSkill and entity._curSkill:CanUse() thenreturn trueendendendif not g_game_context:GetMapEnter() thenreturn false;endif entity._behavior:Test(eEBAttack) thenreturn true;endif entity._curSkill and entity._curSkill:CanUse() thenlocal target = entity._target;if target thenif not target:IsPlayer() and target:GetEntityType() == eET_Player thenif target._behavior:Test(eEBInvisible) thenreturn false;endendlocal dist = vec3_sub1(entity._curPos, target._curPos);if (entity._curSkill._range + (entity:GetRadius() + target:GetRadius())) > vec3_len(dist) thenreturn true;endreturn false;elseif entity:GetEntityType() == eET_Player then if entity._AutoFight thenreturn falseendelseif entity:GetEntityType() == eET_Mercenary thenif entity._cfg.ultraSkill == entity._curSkill._id thenreturn trueendif entity._curSkill._specialArgs.rushInfo and not entity._hoster:IsPlayer() thenreturn trueendendendreturn self:CanAttackNoneTarget();endreturn false;
endfunction ai_attack:CanAttackNoneTarget()return false;
endfunction ai_attack:OnEnter()if BASE.OnEnter(self) thenlocal entity = self._entity;local target = entity._target;local speed = entity:GetPropertyValue(ePropID_speed);if speed > 0 and entity._target and entity._target._guid ~= entity._guid thenlocal p1 = target._curPos;local p2 = entity._curPos;local rot_y = vec3_angle1(p1, p2, { x = 1, y = 0, z = 0 });entity:SetFaceDir(0, rot_y, 0);endself._startTick	= game_get_logic_time();self._skill		= entity._curSkill;self._canBreak	= self._skill._canBreak;self._duration	= self._skill._duration;self._attacker	= entity:StartAttack();self._movable = entity._movable;if not self._attacker thenreturn false;endself._entity._movable = false;return true;endreturn false;
endfunction ai_attack:OnLeave()if BASE.OnLeave(self) thenif self._canBreak and self._attacker thenself._attacker:StopAttack(false);endself._entity:FinishAttack();self._entity._movable = self._movable;return true;endreturn false;
endfunction ai_attack:OnUpdate(dTime)if not BASE.OnUpdate(self, dTime) then return false; endreturn true;
endfunction ai_attack:OnLogic(dTick)if not BASE.OnLogic(self, dTick) then return false; endlocal seq_skill = self._entity._seq_skill;if seq_skill and seq_skill.valid and seq_skill.parent == self._skill thenseq_skill.valid = false;if self._attacker thenif self._attacker:NextSequence(seq_skill.skill) thenself._duration	= seq_skill.skill._duration;self._startTick	= game_get_logic_time();endendendif self._skill thenif (game_get_logic_time() - self._startTick) * 1000 >= self._duration thenreturn false;endendreturn true;
endfunction create_component(entity, priority)return ai_attack.new(entity, priority);
end


 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MongoDB教程(十六):MongoDB高级索引

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 文章目录 引言一、全文索…

开源软件项目:趋势、参与经验与收获

在当今这个全球经济与科技日新月异的时代,开源软件项目(Open Source Software, OSS)正以前所未有的速度蓬勃发展,成为推动技术创新、促进产业合作、加速知识共享的重要力量。随着云计算、大数据、人工智能等技术的兴起&#xff0c…

matlab 绘制参数方程

matlab 绘制参数方程 绘制参数方程绘制结果 绘制参数方程 clc; clear; close all;axis_length 100;% 定义参数t的范围 t 0:0.01:100;% 计算x和y的值 x t.^2 1; y 4*t - t.^2;% 绘制函数图像 plot(x, y); xlabel(x); ylabel(y); title(Plot of the curve xt^21, y4t-t^2…

机器学习之主成分分析案例-红酒主成分分析

🍷 机器学习实战:使用PCA与sklearn红酒数据集进行特征降维与模型预测对比 在机器学习中,主成分分析(PCA)是一种有效的降维技术,它通过寻找数据中的主成分来减少特征数量,同时尽量保留数据的结构…

人工智能全景图2.0 | 一文了解人工智能学科

大家好,这是一节人工智能的科普视频,试图用40多分钟的时间,带你宏观了解人工智能学科,对人工智能有个初步的、全景式的把握,这对你学习具体人工智能细节大有裨益,也是我珍贵的总结。 视频链接(建…

灰色关联分析【系统分析+综合评价】

系统分析: 判断哪个因素影响最大 基本思想:根据序列曲线几何形状的相似程度来判断其练习是否紧密 绘制统计图并进行分析 确定子序列和母序列 对变量进行预处理(去量纲、缩小变量范围) 熟练使用excel与其公式和固定&#xff08…

一套成熟的实验室信息管理系统源码,.Net 检验系统LIS源码,实现从采集、检测、报告、归档的全程跟踪管理

一套成熟的实验室信息管理系统源码。在长期的医疗信息化实践中,我们分析总结了大量客户实例,建立了以病人为中心、以业务处理为基础、以提高检验科室管理水平和工作效率为目标的产品开发思路,将医学检验、科室管理和财务统计等检验科室/实验室…

电脑基础知识 | 电脑的基本组成

电脑作为我们日常工作和娱乐的重要工具,扮演着举足轻重的角色。当我们谈论电脑的基本组成时,其实是在探讨电脑硬件和软件两个核心部分。硬件是电脑看得见、摸得着的物理设备,而软件则是运行在这些硬件之上的程序和指令。两者相辅相成&#xf…

【GoLang】Golang 快速入门(第一篇)

目录 1.简介: 2.设计初衷: 3.Go语言的 特点 4.应用领域: 5.用go语言的公司: 6. 开发工具介绍以及环境搭建 1.工具介绍: 2.VSCode的安装: 3.安装过程: 4.Windows下搭建Go开发环境--安装和配置SDK 1.搭建Go开发环境 - 安装…

如何优化 PostgreSQL 中的连接查询性能?

🍅关注博主🎗️ 带你畅游技术世界,不错过每一次成长机会!📚领书:PostgreSQL 入门到精通.pdf 文章目录 如何优化 PostgreSQL 中的连接查询性能?一、理解连接查询的基本原理二、优化连接查询的关键…

Pyqt5新手教程

PyQt界面开发的两种方式:可视化UI 编程式UI (1)可视化UI:基于Qt Designer可视化编辑工具进行组件拖放、属性设置、布局管理等操作创建界面。 一是将其保存为.ui文件,然后在PyQt应用程序中加载和使用.ui文件。 二是使用…

企业级数据分析平台合集介绍

企业发展离不开数据分析,数据分析推动着企业运营、决策和战略规划。它正逐步深入到各行各业的核心业务流程中,从传统的金融、零售、制造业扩展到医疗健康、教育、能源等更多领域。企业正通过数据分析平台实现数据资源的最大化利用,推动业务与…

音频剪辑里的几种基础操作

音频对于视频的重要性,怎么强调都不为过,它在视频里扮演着举足轻重的角色,对观众有着极为深远的影响。下面为您阐述音频在视频中的关键意义: ① 情感传递:音频有强大的情感传达能力,借助声音的起伏变化、音…

项目标红,识别不了maven项目,解决办法

首先,检查 preferences 其次,检查IDEA 的 jdk。File-》Project Structure 最后: 1. 2. mvn clean install -Dmaven.test.skiptrue 跳过单元测试 maven跳过单元测试-maven.test.skip和skipTests的区别-CSDN博客

CAD框架介绍

1、适用范围:矢量编辑软件如 服装模板软件、CAD软件、绘图软件 2、支持PLT,DXF,PDF,GCode(服装裁割指令)等矢量文件导入 3、支持简易的自动手动排料 4、直线,曲线等编辑功能 5、分页输出绘图指令 6、良好的框架结构:绘图引擎…

【MP4】mp4文件详解(二)—— mp文件分析工具

文章目录 一、前言二、MP4文件分析工具1、软件工具1.1、UltraEdit1.2、Hexinator1.3、mp4info1.4、mp4explorer1.5、MediaInfo 2、在线工具2.1、Online Mp4 Parser2.2、MP4Box.js / ISOBMFF Box Structure Viewer 一、前言 MP4文件分析工具可以帮助你查看和分析MP4视频文件中的…

从混乱到有序:Codigger 软件项目体检助力软件项目管理

在软件项目管理的奇妙世界里,程序员可弟哥就像是一位勇敢的探索者,他深知项目管理中那些常见的难题。 项目进度常常如同脱缰的野马,难以掌控,导致交付日期不断延迟,这让可弟哥十分头疼。成本也仿佛是个调皮的小精灵&am…

Vuex、Redux状态管理库

目录 状态管理库 单一事实来源:存储更新所有组件状态 Vuex 安装 配置 src->store index:拆分模块modules vue2 vue3 main index【以Conversation模块为例】【拆分state等属性】 store state() { return state; }类似于 vue中data() retu…

微软“蓝屏”事件:对全球IT基础设施韧性与安全性的深刻反思

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…

数据传输安全--IPSEC

目录 IPSEC IPSEC可以提供的安全服务 IPSEC 协议簇 两种工作模式 传输模式 隧道模式 两个通信保护协议(两个安全协议) AH(鉴别头协议) 可以提供的安全服务 报头 安全索引参数SPI 序列号 认证数据 AH保护范围 传输模…