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

灰太狼 2022-01-27 08:27 397阅读 0赞

本节书摘来异步社区《Lua游戏AI开发指南》一书中的第2章,第2.9节,作者: 【美】David Young(杨) 译者: 王磊 责编: 陈冀康,更多章节内容可以访问云栖社区“异步社区”公众号查看。

2.9 创建智能体Lua脚本

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

创建一个Lua文件如下:

  1. src/my_sandbox/script/Agent.lua
  2. Agent.lua:
  3. function Agent_Cleanup(agent)
  4. end
  5. function Agent_HandleEvent(agent, event)
  6. end
  7. function Agent_Initialize(agent)
  8. end
  9. function Agent_Update(agent, deltaTimeInMillis)
  10. end

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

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

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

  1. Sandbox.lua:
  2. function Sandbox_Initialize(sandbox)
  3. ...
  4. Sandbox.CreateAgent(sandbox, "Agent.lua");
  5. end

2.9.1 创建视觉表象

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

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

创建一个Lua文件如下:

  1. src/my_sandbox/script/AgentUtilities.lua
  2. AgentUtilities.lua:
  3. function AgentUtilities_CreateAgentRepresentation(
  4. agent, height, radius)
  5. -- Capsule height and radius in meters.
  6. local capsule = Core.CreateCapsule(agent, height, radius);
  7. Core.SetMaterial (capsule, "Ground2");
  8. end
  9. Agent.lua:
  10. function Agent_Initialize(agent)
  11. AgentUtilities_CreateAgentRepresentation(
  12. agent, agent:GetHeight(), agent:GetRadius());
  13. end

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

2\_4

2.9.2 更新智能体的位置

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

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

2.9.3 更新智能体的朝向

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

  1. local forwardDirection = Vector.new(
  2. xDirection, 0, zDirection);
  3. Agent.SetForward(agent, forwardDirection);

发表评论

表情:
评论列表 (有 0 条评论,397人围观)

还没有评论,来说两句吧...

相关阅读

    相关 创建AI智能

    是百度推出的基于文心大模型的智能体(Agent)平台,支持广大开发者根据自身行业领域、应用场景,选取不同类型的开发方式,打造大模型时代的产品能力。开发者可以通过 prom...

    相关 Lua脚本教程

    文章目录 一、数据类型 1、常量、变量 2、变量名:字母、数字、下划线(不能以数字开头) 3、几种数据类型 二、 运算

    相关 Lua开发--lua变量

    Lua 中的变量全是全局变量,那怕是语句块或是函数里,除非用 local 显式声明为局部变量,变量的默认值均为 nil 全局变量 1.在默认情况下,变量总是认为是全局的

    相关 redis-lua脚本

            redis支持lua脚本,lua脚本的详细语法和简绍不在这篇文章的总结范围。这里只说一下redis和lua的结合。         原子性      

    相关 lua 脚本

    lua 脚本是在学习 redis 时接触的,因为 redis 支持 lua 脚本,同时 Redisson 3.5 版本也是基于 lua 脚本做的分布式锁。 所以想了解一下l