`
cqphper
  • 浏览: 23720 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
最近访客 更多访客>>
社区版块
存档分类
最新评论

如何在游戏机制中使用AI/剧情脚本----基于LUA

    博客分类:
  • Lua
阅读更多
自从看完PIL之后,就暂时没有时间做更多的尝试,也因此没有弄明白如何将AI脚本,剧情脚本之类的嵌入到C++的硬编码中。最近看了一些AI的文章,并思考了一下,得到以下认识。

首先要说的是,并不是说AI,剧情逻辑必须非脚本语言不可,用C++也可以写,甚至更习惯一些。但是脚本语言有脚本语言的长处,动态类型以及相当人性化的数据构造方式,特别是LUA中的表类型,似乎比较擅长描述这种复杂的AI/剧情结构。当然,为了验证自己的想法,我也写了4K的LUA代码,结果觉得该脚本语言相当不容易构造简洁的内容。

AI从高自低的分别是计划,状态机,模式。我不知道这种划分是基于何种角度,但是我个人的理解是状态机最高,模式作为某个状态下的某个决策所预定义的动作序列,而计划,是为了实现某个目标的一组步骤的组合。

那么硬编码的游戏循环何时调用脚本?答案是,游戏循环执行到调度NPC的AI函数的时候,该AI函数就不再做任何硬编码,而只是简单的dostring("gameEntitys[npc](\"update\")")。就是这么简单,将所有的AI/剧情放置到脚本中。

那么,LUA中 gameEntitys[npc]("update")是什么意思?简单的说,gameEntitys是一个存储所有NPC的注册表,gameEntitys[npc]将取得该npc的FMS函数,然后给该函数发送update消息告知npc当前的状态进行例行更新。
FMS函数对于每一个对象是唯一的,那么比如某一类对象有共同的AI/剧情,那么该类的每一个对象同用同样的FMS函数的话,成员变量如何维持?要知道在LUA中模拟类还是比较麻烦的。答案是upvalue,也就是所有的对象使用同样的函数来生成自身的FMS,该函数就是FMS_Creator(all_state, init_state)。

在C++编码中,NPC对象完成构造之后,就调用LUA载入对应的状态机/剧情脚本,然后调用FMS_Creator为自己创建FMS函数:
dofile("npc_ai.lua") --引入all_state,init_state
gameEntitys[npc]=FMS_Creator(all_state, init_state)当然,NPC析构之后,你也要释放LUA为你分配的资源 gameEntitys[npc]=nil
已经大概说明了如何在C++中启动NPC的LUA逻辑代码了,那么如何在LUA中编写状态机呢?答案是表。每个表代表一个状态,该表下的key表示该状态接受的消息,key对应的值表示该状态接受到key所表示的消息后要执行的决策,包括相应的动作和可能的状态变迁。看代码吧,最直观的表述:
state = {
  name = "attack", --状态名
  enter = {  --进入该状态要执行,属于状态的消息
     --func是函数,param是参数,sucess,unsucess是func执行结果所对应的状态转移
    {func=print, param="open fire"},
    {func=IsEnemyDie, sucess="cure"},
  }
  update={}  --同enter,不过用于状态在每一帧的更新
  exit = {}  --同enter,不过用于状态在每一帧的更新
  other_msg = {}  --同enter,用于表示该状态所接受的其他消息,可以有多个
}在LUA中就是可以如此直观的表示每一个状态,其响应的消息以及函数。然后构造该npc接受的状态集合:
all_state = {}
all_state[state.name]=state

init_state=state这样子,就能传递到FMS_Creator中创建出自己独一无二的状态机函数了。

那么剧情脚本呢?其实描述了状态机,剧情脚本是否已经有点眉头了呢?剧情,即为计划,每一个计划由一系列步骤所组成。类似的,对应每个计划的执行会有一个plan()函数,且为了达到独立效果,该函数将会由plan_creator(all_step, first_step)生成。
看参数,显然计划的步骤step就是类似于状态的表,不过key方面略有不同,看代码就明白:
step = {
  name="find bill",
  cond = { --执行该步骤的前提条件
     --func是判断条件的函数,param是判断参数
     {func=IsXXX, param="xxx"},
    {func=IsStepFinished, param=some_step},
  },
  finish = {  --条件判断成功要执行的动作
    {func=print, param="success"},
  },
  unfinish = {  --条件判断不成功所要执行的动作
    {func=print, param="unsuccess"},
  },
}
至此,要说的基本上说完了。剧情与FMS结合的方式,因为个人认为FMS最高,所以剧情的执行通过plan(),该剧情的执行函数将作为某个状态相应某个消息时函数集合的一分子。因为,总有个状态是要求按计划执行剧情完成目标的,但是,其他状态允许意外使得暂时不能执行剧情,而NPC又不至于疯掉。

需要补充的是,很遗憾LUA不能随意的使用类似于#include,#import的功能,虽然可以dofile,但是其dofile内声明的变量必须是globle的,因为local value的生存范围是chunk,dofile就是在一个chunk内执行代码。
分享到:
评论

相关推荐

    Lua脚本在游戏引擎中的应用

    例如,Unreal引擎使用了自己定义的中间代码脚本语言UnrealScript来实现其人工智能系统。然而,如果采用自定义的脚本语言,就需要自行开发编译器和虚拟机,这是一项需要大量投入的工作。因此,有专家建议采用已有的...

    visual c++ HGE游戏引擎+Lua脚本的结合使用.zip

    Lua脚本的执行通常在C++中通过调用`HGE->Lua->DoFile()`来完成,这样可以在运行时动态加载和执行脚本。 四、Lua脚本在游戏中的应用 1. 游戏逻辑:Lua脚本可以用来编写游戏规则,比如角色的动作、敌人AI、碰撞检测...

    lua-小游戏

    在这个“lua-小游戏”项目中,我们可以推断出这是使用Lua语言编写的一个小型游戏。Lua以其简洁的语法、高效的性能和易集成性而受到游戏开发者喜爱。下面我们将详细探讨Lua在游戏开发中的应用以及相关的技术知识点。 ...

    游戏开发之lua脚本编辑器.zip

    在游戏开发领域,Lua语言因其轻量级、高效和易学习的特点,被广泛应用于游戏脚本编写。"游戏开发之lua脚本编辑器.zip"这个压缩包可能包含了一些关于使用Lua进行游戏脚本开发的资源,例如教程、示例代码或者专用的Lua...

    游戏开发-lua-linux源码安装包

    以下是关于游戏开发中使用lua和在Linux环境下源码安装的详细步骤及相关的知识点: 1. **Lua基础知识**: - Lua是一种动态类型的语言,支持表(类似哈希表的数据结构)作为主要的数据结构,具有弱类型的特性。 - ...

    lua脚本快速入门手册

    LUA是一种轻量级的脚本语言,广泛应用于游戏开发、嵌入式系统以及各种软件中的扩展与配置。对于熟悉C和C++的程序员来说,学习LUA可以极大地提高工作效率,因为它具有简洁的语法、高效的执行性能以及易于集成到已有的...

    lua游戏ai开发指南 源码

    《Lua游戏AI开发指南》是一本深入探讨使用Lua语言进行游戏人工智能系统开发的专业书籍。源码的提供使得读者能够更直观地理解书中的理论与实践相结合的部分,加深对游戏AI编程的理解。在游戏开发中,Lua因其轻量级、...

    Lua飞机大战源码

    Lua飞机大战是一款基于Lua编程语言开发的轻量级游戏,它展示了Lua语言在游戏开发中的强大能力。本文将深入探讨该源码,解析其核心机制,帮助读者理解Lua在游戏编程中的应用。 一、Lua语言简介 Lua是一种简洁、高效...

    游戏脚本-探险家-伊泽瑞尔2.zip

    5. **AI行为**:如果伊泽瑞尔具有AI(人工智能)功能,那么他的决策过程、战术选择和战斗策略都会由脚本控制。 6. **交互性**:与环境的互动,如开启宝箱、触发剧情、解谜等,都依赖于精心编写的脚本。 7. **声音...

    lua-5.3.4_Win64_bin.zip

    在这个"lua-5.3.4_Win64_bin.zip"压缩包中,我们得到了预编译的适用于Windows 64位操作系统的Lua 5.3.4版本。这个版本是官方稳定版,提供了对最新特性和性能优化的支持。 首先,让我们深入了解Lua 5.3的主要特点。...

    游戏脚本-卡牌大师-崔斯特.zip

    3. **AI系统**:脚本可能包含AI(人工智能)逻辑,让崔斯特能够根据游戏环境作出智能决策。这可能涉及到路径规划、敌我识别、战斗策略等复杂算法。 4. **事件处理**:在游戏过程中,各种事件(如玩家输入、敌人行动...

    Lua游戏开发实践指南

    《Lua游戏开发实践指南》是一本专为游戏开发者设计的教程,主要聚焦于使用Lua语言进行游戏编程。Lua因其轻量级、易学习和高度可嵌入的特性,在游戏行业中得到了广泛应用。本指南将深入探讨如何利用Lua的强大功能来...

    游戏脚本-虚空行者-卡萨丁1.zip

    游戏脚本通常使用的是高级脚本语言,如Lua、Python、JavaScript或Unity的C#脚本等。这些语言易于学习,且能够快速实现功能,适合游戏逻辑的编写。例如,"虚空行者-卡萨丁1"可能代表一个游戏角色或者游戏关卡的特定...

    游戏脚本-九尾妖狐-阿狸.zip

    1. **脚本语言**:游戏脚本通常使用高级、易读的语言编写,如Lua、Python、JavaScript或Unity的C#。这些语言简化了游戏逻辑的实现,同时也方便非专业程序员进行调整和定制。 2. **角色行为**:阿狸的角色脚本会包含...

    游戏脚本-未来守护者-杰斯3.zip

    5. 脚本语言的应用:在游戏开发中,通常会使用轻量级脚本语言,如Lua,因为它易于学习,执行效率高,并且与游戏引擎集成良好。脚本文件通常以文本形式存储,可以被游戏引擎解释执行,动态改变游戏状态。 6. 游戏...

    游戏脚本-审判天使-凯尔.zip

    在深入探讨这个脚本之前,我们首先要理解什么是游戏脚本以及它如何在游戏中发挥作用。 游戏脚本是编程语言的一种应用,它在游戏开发中扮演着至关重要的角色。开发者通过编写脚本来控制游戏中的各种事件、交互、动画...

    Jill——Java编写的Lua脚本引擎

    通过Jill,开发者可以在JME应用中嵌入Lua脚本,从而实现游戏逻辑、AI行为、动态内容生成等功能,而不必局限于Java的原生API。这样可以提高开发效率,同时降低代码复杂性。 **使用Jill的关键概念** 1. **Lua脚本...

    mir9-lua, 《热血沙城》45度ARPG手游-Lua移植版.zip

    此外,游戏中的AI(人工智能)系统,如怪物的行为模式,也可能会用Lua来实现。 此外,游戏中的UI(用户界面)是玩家与游戏互动的主要途径。Lua在UI设计中扮演着重要角色,它能够轻松地创建和更新动态界面元素,比如...

    Android-使用lua语言开发Android应用

    在Android应用中集成Lua,通常会使用如SLua、Corona SDK或LUA-Android等库。这些库提供了与Java层交互的接口,允许Lua代码调用Android的API,执行系统级别的任务,如访问硬件、网络通信、文件操作等。例如,SLua是一...

    游戏脚本-迅捷斥候-提莫.zip

    提莫,这个在《英雄联盟》中备受欢迎的角色,其游戏行为、技能释放、AI逻辑等都是由游戏脚本控制的。例如,提莫的蘑菇放置、毒性射击、隐形机制等特性,都需要通过特定的脚本来实现。这些脚本可能用到诸如Lua、...

Global site tag (gtag.js) - Google Analytics