lua 游戏架构 之 游戏 AI (六)ai_auto_skill

定义一个为`ai_auto_skill`的类,继承自`ai_base`类。`ai_auto_skill`类的目的是在AI自动战斗模式下,根据配置和条件自动选择并使用技能。

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

这个类用于处理游戏中AI自动使用技能的逻辑。以下是对代码的具体解释:

  1. **引入基类**:
  • 使用`require`函数引入`ai_base`类,作为基础类。
  1. **定义`ai_auto_skill`类**:
  • 使用`class`关键字定义了`ai_auto_skill`类,并继承自`BASE`(即`ai_base`)。
  1. **构造函数 (`ctor`)**:
  • 构造函数接受一个`entity`参数,并设置`_type`属性为`eAType_AUTO_SKILL`,表示自动使用技能的行为。
  1. **`IsValid` 方法**:这个方法用于验证AI是否应该尝试使用技能。它检查实体是否能够使用技能(`CanUseSkill`),并且没有当前正在使用的技能(`_curSkill`),或者是否有手动指定的技能(`_maunalSkill`)。

  2. **`OnEnter` 方法**:当AI组件进入激活状态时执行。如果基类的`OnEnter`方法返回`true`,则调用`SetSkill`方法尝试设置并使用技能。

  3. **`OnLeave` 方法**:当AI组件离开激活状态时执行。如果基类的`OnLeave`方法返回`true`,则直接返回`true`。

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

  5. **`OnLogic` 方法**:逻辑更新方法,如果基类的`OnLogic`方法返回`true`,则当前方法返回`false`,表示只执行一次。

  6. **`SetSkill` 方法**:

    • 这个方法用于设置并使用技能。如果实体有手动指定的技能(`_maunalSkill`),则使用该技能,并将其设置为`nil`。
    • 如果没有手动指定的技能,则从实体的攻击列表(`_attackLst`)中选择下一个技能,并使用它。
  1. **创建组件函数**: `create_component`函数用于创建`ai_auto_skill`类的新实例,传入一个实体和一个优先级。

代码中的一些关键点:

    • `CanUseSkill()`:检查实体是否能够使用技能。
    • `UseSkill(skill)`:使实体使用指定的技能。
    • `GetAttackSkill()`:获取实体的基础攻击技能。
    • `_attackLst`:实体的攻击列表,包含技能ID。
    • `_attackID`:当前选择的攻击技能的索引。

`SetSkill`方法的逻辑流程:

    • 检查是否有手动指定的技能,如果有,则使用该技能并清除手动技能设置。
    • 如果没有手动指定的技能,从攻击列表中获取下一个技能ID(`nid`),并根据该ID获取技能对象。
    • 如果获取到技能对象,则更新`_attackID`并使用该技能。

整体而言,`ai_auto_skill`类的目的是在AI自动战斗模式下,根据配置和条件自动选择并使用技能。

Lua 复制代码
----------------------------------------------------------------
local require = require

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


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

function ai_auto_skill:IsValid()
	local entity = self._entity;
	local hoster = entity._hoster
	return entity:CanUseSkill() and not entity._curSkill or entity._maunalSkill;
end

function ai_auto_skill:OnEnter()
	if BASE.OnEnter(self) then
		self:SetSkill();

		return true;
	end

	return false;
end

function ai_auto_skill:OnLeave()
	if BASE.OnLeave(self) then
		return true;
	end

	return false;
end

function ai_auto_skill:OnUpdate(dTime)
	if BASE.OnUpdate(self, dTime) then
		return true;
	end

	return false;
end

function ai_auto_skill:OnLogic(dTick)
	if BASE.OnLogic(self, dTick) then
		return false; -- only one frame
	end

	return false;
end

function ai_auto_skill:SetSkill()
	local entity = self._entity;

	if entity._maunalSkill then
		entity:UseSkill(entity._maunalSkill);

		entity._maunalSkill = nil;
	else
		local nid = entity._attackID + 1;
		if nid == nil or nid < 1 or nid > #entity._attackLst then
			nid = 1;
		end

		local sid = entity._attackLst[nid];
		if sid then
			local skill = nil;
			if sid == 0 then
				skill = entity:GetAttackSkill();
			else
				skill = entity._skills[sid];
			end

			if skill then
				entity._attackID = nid;

				entity:UseSkill(skill);
			end
		end
	end
end

function create_component(entity, priority)
	return ai_auto_skill.new(entity, priority);
end
相关推荐
xingshanchang4 小时前
PyTorch 不支持旧GPU的异常状态与解决方案:CUDNN_STATUS_NOT_SUPPORTED_ARCH_MISMATCH
人工智能·pytorch·python
reddingtons5 小时前
Adobe Firefly AI驱动设计:实用技巧与创新思维路径
大数据·人工智能·adobe·illustrator·photoshop·premiere·indesign
CertiK5 小时前
IBW 2025: CertiK首席商务官出席,探讨AI与Web3融合带来的安全挑战
人工智能·安全·web3
Deepoch6 小时前
Deepoc 大模型在无人机行业应用效果的方法
人工智能·科技·ai·语言模型·无人机
Deepoch6 小时前
Deepoc 大模型:无人机行业的智能变革引擎
人工智能·科技·算法·ai·动态规划·无人机
kngines6 小时前
【字节跳动】数据挖掘面试题0003:有一个文件,每一行是一个数字,如何用 MapReduce 进行排序和求每个用户每个页面停留时间
人工智能·数据挖掘·mapreduce·面试题
Binary_ey6 小时前
AR衍射光波导设计遇瓶颈,OAS 光学软件来破局
人工智能·软件需求·光学软件·光波导
昵称是6硬币6 小时前
YOLOv11: AN OVERVIEW OF THE KEY ARCHITECTURAL ENHANCEMENTS目标检测论文精读(逐段解析)
图像处理·人工智能·深度学习·yolo·目标检测·计算机视觉
平和男人杨争争7 小时前
机器学习2——贝叶斯理论下
人工智能·机器学习
静心问道7 小时前
XLSR-Wav2Vec2:用于语音识别的无监督跨语言表示学习
人工智能·学习·语音识别