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

news2024/9/24 3:29:12

这段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 = require

local BASE = require("logic/entity/ai/ai_base").ai_base;

------------------------------------------------------
ai_attack = class("ai_attack", BASE);
function ai_attack:ctor(entity)
	self._type = eAType_ATTACK;
end

function ai_attack:IsValid()
	local entity = self._entity;

	if entity:IsDead() or not entity:CanAttack() then
		return false;
	end
	if entity:GetEntityType() == eET_Player and entity._DigStatus == 2 then
		return false;
	end

	if entity:GetEntityType() == eET_Trap then
		if entity._ntype ~= eEntityTrapType_AOE then
			return false;
		else
			if entity._curSkill and entity._curSkill:CanUse() then
				return true
			end
		end
	end

	if not g_game_context:GetMapEnter() then
		return false;
	end

	if entity._behavior:Test(eEBAttack) then
		return true;
	end

	if entity._curSkill and entity._curSkill:CanUse() then
		local target = entity._target;
		if target then
			if not target:IsPlayer() and target:GetEntityType() == eET_Player then
				if target._behavior:Test(eEBInvisible) then
					return false;
				end
			end
			local dist = vec3_sub1(entity._curPos, target._curPos);
			if (entity._curSkill._range + (entity:GetRadius() + target:GetRadius())) > vec3_len(dist) then
				return true;
			end

			return false;
		else
			if entity:GetEntityType() == eET_Player then 
				if entity._AutoFight then
					return false
				end
			elseif entity:GetEntityType() == eET_Mercenary then
				if entity._cfg.ultraSkill == entity._curSkill._id then
					return true
				end

				if entity._curSkill._specialArgs.rushInfo and not entity._hoster:IsPlayer() then
					return true
				end
			end
		end

		return self:CanAttackNoneTarget();
	end

	return false;
end

function ai_attack:CanAttackNoneTarget()
	return false;
end

function ai_attack:OnEnter()
	if BASE.OnEnter(self) then
		local 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 then
			local 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);
		end

		self._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 then
			return false;
		end

		self._entity._movable = false;

		return true;
	end

	return false;
end

function ai_attack:OnLeave()
	if BASE.OnLeave(self) then
		if self._canBreak and self._attacker then
			self._attacker:StopAttack(false);
		end

		self._entity:FinishAttack();

		self._entity._movable = self._movable;

		return true;
	end

	return false;
end

function ai_attack:OnUpdate(dTime)
	if not BASE.OnUpdate(self, dTime) then return false; end

	return true;
end

function ai_attack:OnLogic(dTick)
	if not BASE.OnLogic(self, dTick) then return false; end

	local seq_skill = self._entity._seq_skill;
	if seq_skill and seq_skill.valid and seq_skill.parent == self._skill then
		seq_skill.valid = false;

		if self._attacker then
			if self._attacker:NextSequence(seq_skill.skill) then
				self._duration	= seq_skill.skill._duration;
				self._startTick	= game_get_logic_time();
			end
		end
	end

	if self._skill then
		if (game_get_logic_time() - self._startTick) * 1000 >= self._duration then
			return false;
		end
	end

	return true;
end

function create_component(entity, priority)
	return ai_attack.new(entity, priority);
end


 

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

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

相关文章

深度学习:引领未来的人工智能技术(比喻)

深度学习:引领未来的人工智能技术 引言 随着人工智能(AI)的快速发展,深度学习(Deep Learning)作为其中最具革命性的技术之一,正在改变着各个行业。从自动驾驶到医疗诊断,从自然语言…

python—selenium爬虫

文章目录 Selenium与Requests对比一、工作原理二、功能特点三、性能表现 下载对应驱动1.首先我们需要打开edge浏览器,打开设置,找到“关于Microsoft Edge”,点击进入查看浏览器版本。2.查找版本之后,搜索edge驱动下载,…

Unity UGUI 之 ScrollBar与ScrollView

本文仅作学习笔记与交流,不作任何商业用途 本文包括但不限于unity官方手册,唐老狮,麦扣教程知识,引用会标记,如有不足还请斧正 1.什么是ScrollBar 滚动块:Unity - Manual: Scrollbar 2.重要参数 该笔记来源…

MMROTATE的混淆矩阵confusion matrix生成

mmdetection中加入了混淆矩阵生成并可视化的功能,具体的代码在tools/analysis_tools/confusion_matrix.py。 mmrotate由于主流遥感数据集中的DOTA数据集标注格式问题,做了一些修改,所以我们如果是做遥感图像检测的Dota数据集的混淆矩阵&…

Elasticsearch介绍、安装以及IK分词器 --学习笔记

Elasticsearch 是什么? Elasticsearch 是一个高度可扩展的开源全文搜索和分析引擎。它允许你以极快的速度存储、搜索和分析大量数据。Elasticsearch 基于 Apache Lucene 构建,提供了一个分布式、多租户能力的全文搜索引擎,带有 HTTP web 接口…

centos系统mysql数据库压缩备份与恢复

文章目录 压缩备份一、安装 xtrabackup二、数据库中创建一些数据三、进行压缩备份四、模拟数据丢失,删库五、解压缩六、数据恢复 压缩备份 一、安装 xtrabackup 确保已经安装了 xtrabackup 工具。可以从 Percona 的官方网站 获取并安装适合你系统的版本。 # 添加…

2024在线PHP加密网站源码

源码介绍 2024在线PHP加密网站源码 更新内容: 1.加强算法强度 2.优化模版UI 加密后的代码示例截图 源码下载 https://download.csdn.net/download/huayula/89568335

学习日志:JVM垃圾回收

文章目录 前言一、堆空间的基本结构二、内存分配和回收原则对象优先在 Eden 区分配大对象直接进入老年代长期存活的对象将进入老年代主要进行 gc 的区域空间分配担保 三、死亡对象判断方法引用计数法可达性分析算法引用类型总结1.强引用(StrongReference…

Python+Flask+MySQL+日线指数与情感指数预测的股票信息查询系统【附源码,运行简单】

PythonFlaskMySQL日线指数与情感指数预测的股票信息查询系统【附源码,运行简单】 总览 1、《股票信息查询系统》1.1 方案设计说明书设计目标工具列表 2、详细设计2.1 登录2.2 程序主页面2.3 个人中心界面2.4 基金详情界面2.5 其他功能贴图 总览 自己做的项目&#…

【教程】在 VS Code 集成终端中解决 Node.js 环境变量识别问题

背景 外部命令,如 node 在外部的终端中可以识别到,但是在vscode的终端中不能识别到错误:node : 无法将“node”项识别为 cmdlet、函数、脚本文件或可运行程序的名称也就是环境变量其实是有 node 的,但是 vscode 的集成终端中就是…

【Django】在vscode中新建Django应用并新增路由

文章目录 打开一个终端输入新建app命令在app下的views.py内写一个视图app路由引入该视图项目路由引入app路由项目(settings.py)引入app(AntappConfig配置类)运行项目 打开一个终端 输入新建app命令 python manage.py startapp antapp在app下的views.py内…

let、var、const 的区别 --js面试题

作用域 ES5中的作用域有:全局作用域、函数作用域,ES6中新增了块级作用域。块作用域由 { } 包括,if 语句和 for 语句里面的 { } 也属于块作用域。 var 1.没有块级作用域的概念,但具有函数全局作用域、函数作用域的概念 {var a …

交易积累-MACD

MACD(Moving Average Convergence Divergence,即移动平均收敛发散指标)是由Gerald Appel于1970年代后期发明的一种趋势跟踪动量指标。MACD显示了两个不同周期(通常是较长和较短周期)的移动平均线之间的差异。这个指标旨…

PCIe 以太网芯片 RTL8125B 的 spec 和 Linux driver 分析备忘

1,下载 RTL8125B driver 下载页: https://www.realtek.com/Download/List?cate_id584 2,RTL8125B datasheet下载 下载页: https://file.elecfans.com/web2/M00/44/D8/poYBAGKHVriAHnfWADAT6T6hjVk715.pdf3, 编译driver 解压: $ tar xj…

Android APP CameraX应用(02)预览流程

说明:camera子系统 系列文章针对Android12.0系统,主要针对 camerax API框架进行解读。 1 CameraX简介 1.1 CameraX 预览流程简要解读 CameraX 是 Android 上的一个 Jetpack 支持库,它提供了一套统一的 API 来处理相机功能,无论 …

Redis-10大数据类型理解与测试

Redis10大数据类型 我要打10个1.redis字符串(String)2.redis列表(List)3.redis哈希表(Hash)4.redis集合(Set)5.redis有序集合(ZSet)6.redis地理空间(GEO)7.redis基数统计(HyperLogLog)8.redis位图(bitmap)9.redis位域(bitfield)10.redis流(Stream) 官网地址Redis 键(key)常用案…

OpenCV图像滤波(1)双边滤波函数bilateralFilter的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 功能描述 bilateralFilter是图像处理和计算机视觉领域中的一种高级图像滤波技术,特别设计用于在去除噪声的同时保留图像的边缘和细节。相比于传…

NSSCTF-2021年SWPU联合新生赛

[SWPUCTF 2021 新生赛]finalrce 这道题目考察tee命令和转义符\ 这题主要是,遇到一种新的符号,"\"—转义符。我理解的作用就是在一些控制字符被过滤的时候,可以用转义符,让控制符失去原本的含义,变为字面量…

学习记录——day16 操作受限的线性表 链式栈

操作受限的线性表 1、在之前的内容,无论是顺序表还是链表,都是详细处理的线性表,既可以在端点处进行操作也 可以在中间位置操作 2、现实生活中,有很多并不需要在中间进行操作的序列,只在端点处进行操…

30岁自学编程从何处入手?

自学编程是一个很好的选择,尤其是在你有志于转行或提升技能的情况下。我收集制作一份plc学习包,对于新手而言简直不要太棒,里面包括了新手各个时期的学习方向,包括了编程教学,数据处理,通信处理&#xff0c…