《Lua游戏AI开发指南》一2.9 创建智能体Lua脚本

2.9 创建智能体Lua脚本

为了创建一个新的智能体,我们需要创建另一个Lua脚本并实现Agent_Cleanup、 Agent_HandleEvent、 Agent_Initialize和Agent_Update函数。

创建一个Lua文件如下:

src/my_sandbox/script/Agent.lua
Agent.lua:

   function Agent_Cleanup(agent)
   end

   function Agent_HandleEvent(agent, event)
   end

   function Agent_Initialize(agent)
   end

   function Agent_Update(agent, deltaTimeInMillis)
   end

现在有了一个基础的智能体脚本,我们可以在沙箱中创建一个智能体实例了。修改沙箱的初始化函数,使用Sandbox.CreateAgent函数创建AI代理。

要记住,每个AI智能体都在它自己的Lua虚拟机(Virtual Machine,VM)中运行。虽然这个智能体的逻辑是在一个单独的VM中运行,但是你仍然可以从沙箱的Lua脚本中访问并修改它的属性,因为智能体数据是在C++代码中管理的。

修改沙箱的初始化函数,使用Sandbox.CreateAgent函数创建你的AI智能体。

Sandbox.lua:

   function Sandbox_Initialize(sandbox)

       ...

       Sandbox.CreateAgent(sandbox, "Agent.lua");
   end

2.9.1 创建视觉表象

现在沙箱中已经有了一个可运行的智能体,我们还需要为它创建视觉表象以便能够观察它。这一次,我们使用Core.CreateCapsule函数来程序生成一个胶囊网格,然后附加到智能体上。把智能体传入Core.CreateCapsule函数中就会把生成的Ogre网格直接附加到智能体上面,并在它移动时自动更新这个胶囊的位置和旋转。

Sandbox.CreateObject对象相比,我们只需要创建一个视觉表象,因为智能体已经以胶囊的形式在物理世界中进行模拟了。

创建一个Lua文件如下:

src/my_sandbox/script/AgentUtilities.lua
AgentUtilities.lua:

   function AgentUtilities_CreateAgentRepresentation(
       agent, height, radius)

      -- Capsule height and radius in meters.
      local capsule = Core.CreateCapsule(agent, height, radius);
      Core.SetMaterial (capsule, "Ground2");
   end

Agent.lua:

   function Agent_Initialize(agent)
       AgentUtilities_CreateAgentRepresentation(
           agent, agent:GetHeight(), agent:GetRadius());
   end

现在运行沙箱就能看到智能体的视觉表象了,它是一个同样使用Ogre Ground2材质的胶囊,如图2-4所示。

2.9.2 更新智能体的位置

我们可以设置智能体的位置来让它四处移动。由于智能体参与了物理模拟,如果放在空中它就会落向地面;如果被放到地面以下,则会被推到地面上来。

-- Position in meters.
   local position = Vector.new(
       xCoordinate, yCoordinate, zCoordinate);
   Agent.SetPosition(agent, position);

2.9.3 更新智能体的朝向

改变智能体的朝向类似于设置位置向量,不同的是需要提供一个前进方向向量。因为沙箱模拟的是类人形的智能体,物理模拟会锁定它的方向以让它始终保持直立。当设置智能体的前进方向向量时,沙箱会把y轴看成是向上的轴向。

local forwardDirection = Vector.new(
       xDirection, 0, zDirection);
   Agent.SetForward(agent, forwardDirection);
时间: 2024-09-21 17:56:21

《Lua游戏AI开发指南》一2.9 创建智能体Lua脚本的相关文章

《Lua游戏AI开发指南》一导读

前 言 Lua游戏AI开发指南 游戏人工智能(Artificial Intelligence,AI)是决策制定和动画回放的结合体.经典AI或学术AI仅仅关注于找到正确的决策,游戏AI则负责在游戏运行期间做出大量的决策.将游戏AI与动画分开处理是常见的错误.本书通过把动画和运动系统直接集成到AI系统中来杜绝这一问题.决策制定和决策执行之间微妙的差异会改变AI程序员不得不关注的诸多方面. 游戏AI的另一个大问题是,不同类型的游戏对AI有不同的需求和实现策略.为了避免毫无重点的平铺直述,本书将只关注一

《Lua游戏AI开发指南》一第1章 从构建沙箱开始

第1章 从构建沙箱开始 Lua游戏AI开发指南 本章主题: AI沙箱项目的组织和编译: 使用Lua集成开发环境Decoda: 调试Lua脚本和AI沙箱: 在C++和Lua之间发送和接收数据: C++函数调用Lua函数: Lua函数调用C++函数: 在Lua中创建由C++管理的自定义数据类型: AI沙箱的C++类简介.

《Lua游戏AI开发指南》一2.10 智能体的属性

2.10 智能体的属性 现在已经可以创建智能体了,我们回过头来看看智能体都有哪些属性,以及它们的意义是什么. 2.10.1 朝向 每当需要返回智能体的朝向时,最简单的方法是使用前向向量,它通常代表了智能体的运动方向.朝向的左向量和上向量也可以访问到.每当你需要改变智能体的方向时,只需简单地设置它的前向向量. 1.前向轴 为了获取和设置智能体的前向向量,我们可以使用内建的GetForward和SetForward辅助函数. local forwardVector = agent:GetForwar

《Lua游戏AI开发指南》一2.8 发射方块

2.8 发射方块 现在我们有了基本的光照和一个物理平面,还能创建和模拟物理对象,是时候发射一些东西了.在开始创建智能体之前,先让我们快速了解一下沙箱对象的另外一些物理属性,以及如何与输入控制器进行交互. Sandbox_HandleEvent函数让沙箱能够响应鼠标和键盘输入事件.事件参数是一个Lua表,存储了事件的生成来源.事件是由按下还是松开按钮产生的以及事件是哪个键产生的这类信息.鼠标移动事件也类似,但包含了鼠标指针的宽高位置. 我们已经知道如何创建一个沙箱对象了,要发射一个对象只需要把它放

《Lua游戏AI开发指南》一1.1 AI沙箱简介

1.1 AI沙箱简介 AI沙箱是一个特别设计的软件框架,它摆脱了应用管理.资源处置.内存管理.Lua绑定这些无聊的工作,让你能够立即着手应用Lua进行AI编程.虽然这个沙箱承担了一个小型游戏引擎的工作,但是它的内部结构是完全开放的.本章会详尽描述和解析它的内部代码,以便你在必要时对其进行扩展来获得更多的功能. 我们在设计AI沙箱时使用了一组预先编译好的开放源代码库,用以支持Lua代码实现的AI的快速原型开发和调试.C++代码维护和管理AI数据,而Lua脚本则管理AI的决策逻辑.数据和逻辑的分离使

《Lua游戏AI开发指南》一2.11 小结

2.11 小结 到目前为止,我们已经创建了探索.追逐.路径追踪和群聚的智能体.现在,你应该熟悉Lua和沙箱如何配合工作,以及数据和逻辑分别处于什么位置了. 在第3章中,我们将开始学习动画处理,以及如何创建动画状态机,用状态来管理动画的播放和转换.有了可移动的智能体和动画网格,我们离实现一个全功能的AI代理又进了一步.

《Lua游戏AI开发指南》一2.7 创建一个沙箱Lua脚本

2.7 创建一个沙箱Lua脚本 基本的沙箱程序就位之后,我们就可以新建沙箱的创建Lua脚本了.首先在脚本文件夹中新建一个Sandbox.lua脚本. 像下面这样创建一个Lua文件: src/my_sandbox/script/Sandbox.lua 沙箱Lua脚本必须实现4个全局函数供C++代码调用,它们分别是Sandbox_Cleanup. Sandbox_HandleEvent. Sandbox_Initialize和Sandbox_Update: Sandbox.lua: function

《Lua游戏AI开发指南》一1.2 小结

1.2 小结 至此我们已经查看了AI沙箱的基本结构以及代码和Lua虚拟机的交互方式.在我们开始构建自己的沙箱AI示例之前,理解诸如Lua脚本调试这类关键概念和理解项目的文件结构是非常重要的. 第2章将介绍如何在沙箱中构造一个AI对象并对它施加推力.一旦有了一个基本的可运行的AI对象,我们将在它的基础上添加团队移动.碰撞规避和路径跟随.

《Lua游戏AI开发指南》一2.1 新建一个沙箱项目

2.1 新建一个沙箱项目 首先,为了创建一个新的沙箱可执行程序,我们需要在Premake构建脚本中声明一个新的Visual Studio示例项目.打开SandboxDemos.lua脚本文件,在SandboxDemos表中添加一个新项.你可以将项目命名为my_sandbox或者任何你喜欢的名字.项目的名字就是构建出来的可执行程序的名字. SandboxDemos.lua: SandboxDemos = { "chapter_1_introduction", ... "my_s