前面写了一篇关于使用AI IDE进行C++安全开发的博客《使用AI IDE 助力 C++ 高性能安全开发!》, 得到许多同学们的喜欢,今天我们来继续在游戏开发中扩展一下AI的能力,看看能不能给游戏研发团队一些启发。
在游戏研发中,Lua曾经扮演着一个极其重要的角色,不管是在基于C++的服务端扩展其灵活性,还是在游戏引擎和框架中作为底层语言封装后的主要业务开发语言,Lua都具备高效灵活和简单易上手的优点。比如著名的游戏服务器框架Skynet和游戏引擎框架cocos2d-x-lua,都受到了许多研发团队的追捧。
曾经、LUA也作为游戏行业策划人员的必备技能,通过LUA脚本来编写任务、技能也经常是相关策划的主要工作、而在这个过程中,大量繁琐的测试和修改,也经常令策划人员感到崩溃。
本节我们将以InsCode AI IDE为例,打造一个策划人员的实用脚本生成流程,帮助策划人员从这种繁琐中解放出来。
一、安装与环境配置
首先,我们先去官网下载二进制lua,这里我下载了5.2.4版本的LUA二进制库和头文件。
下载后,解压出来,文件夹名称更换为lua-5.4.2。
然后 下载安装 InsCode AI IDE | InsCode AI IDE ,进入欢迎页后单击右边侧栏的"扩展",在弹出的插件商店里输入关键字"C",就可以看到许多的插件支持,其中华为云有提供"Cpp Project Wizard",下载安装一下,方便我们快速的创建C++工程。
安装好后,点击创建C/C++工程,在弹出的"新建工程"配置对话框中填写相关信息,创建一个C++工程。
创建好之后,我们配置一下编译命令,点击右上角的配置栏里的"编辑",在弹出的运行/配置对话框中,点击"+"号增加一个JAVASCRIPT调试终端,这里的JAVASCRIPT调试终端只是因为要选一个执行命令的选项罢了,跟JAVASCRIPT没什么关系哈。
然后在Command里输入:
bash
g++ ./main.cpp -o ./main.exe -L D:/lua-5.4.2 -llua54 -I D:/lua-5.4.2/include | ./main.exe
确定后,这样就可以在点击右上角的绿色三角按钮时对main.cpp进行编译并运行结果了,不过现在还没有用到LUA,我们在main.cpp里CTRL+A全选一下代码,然后再点CTRL+J,在弹出的对话框里输入:"增加一个通过LUA调用函数的实例",然后点击"生成"。
通过这种方式,我们可以只对当前main.cpp进行轻量化的修改,AI生成完成后,点击"全部接受",这时就可以看到LUA相关的代码了。
不过编译运行后,并没有什么反应,这是因为当前文件夹缺少lua54.dll,我们将其从Lua的文件夹拷贝过来,再次编译运行,就可以看到运行后打印"Hello from Lua!"。
这样我们第一步的工作就算完成了。
二、需求转脚本的实现
一般来说、在一个系统中使用LUA,主要的方法就是由高级程序员将一些功能处理封装成LUA可以调用的函数,然后整理这个函数列表和说明给到业务开发或策划人员,由他们在LUA中的特定函数中进行调用并编写逻辑,下面我们举例说明。
我们假设现在已经有一堆函数和说明,比如在一个txt文档中、我随手写了一些LUA函数:
Lua
#创建函数
#创建玩家,参数为玩家id,x位置,y位置,返回值为成功或失败
Lua_CreatePlayer(id,x,y)
#创建怪物,参数为怪物id,x位置,y位置,返回值为成功或失败
Lua_CreateMonster(id,x,y)
#创建NPC,参数为怪物id,x位置,y位置,返回值为成功或失败
Lua_NPC(id,x,y)
#掉落物品函数,x位置,y位置,物品id
Lua_DropObject(x,y,objectid)
#加血,参数为type类型(0代表player,1代表monster,2代表npc),对应id,增加的值
Lua_AddHP(type,id,hp)
#对话,参数为弹出对话的文字内容
Lua_Talk(text)
#对话一个问题,并等待玩家返回结果,参数为弹出对话的文字内容,返回True或False代表玩家选择了"是"或"否"
Lua_Wait_Ask(text)
#取得位置,参数为type类型(0代表player,1代表monster,2代表npc),对应id,返回x位置,y位置
Lua_GetPos(type,id)
#移动函数,参数为type类型(0代表player,1代表monster,2代表npc),对应id,目标x位置,y位置
Lua_MoveTo(type,id,x,y)
#在位置点附近随机移动函数,参数为type类型(0代表player,1代表monster,2代表npc),对应id,中心点x位置,y位置,radius移动半径
Lua_Rand_Walk(type,id,x,y,radius)
#跟随函数,参数为type类型(0代表player,1代表monster,2代表npc),对应id,目标type类型,目标对应id
Lua_Follow(type,id,type2,id2)
#普通攻击函数,参数为type类型(0代表player,1代表monster,2代表npc),对应id,目标type类型,目标对应id
Lua_Attack(type1,id1,type2,id2)
#技能攻击函数,参数为type类型(0代表player,1代表monster,2代表npc),对应id,目标type类型,目标对应id,技能id
Lua_SkillAttack(type1,id1,type2,id2,skillid)
有了这个函数列表,下面我们尝试为某id值为1012的NPC编写一个LUA脚本控制其逻辑,逻辑需求为下:"当玩家点击NPC时,会弹出对话问玩家:"你是否准备好去迎战恶龙?",玩家点击"是"后,NPC会掉落一个护身符,并给玩家加100滴血,然后会开始跟随玩家。",我们可以将其放置到npc_1012.txt中作为npc的逻辑需求描述策划案。
一般来说,NPC会有一个专门的脚本文件,并有一些特定的主动和被动函数供系统调用,策划的工作就是在这些函数中使用上述给定的Lua函数进行编写。
比如上述需求,可能是在某id值为1012的lua文件 npc_1012.lua中编写,这个lua文件中已经有玩家点击NPC时响应的处理函数player_click_npc,我们的工具是在这个函数填写具体的逻辑。
然后我在右点侧栏点击"AI",使用"改写"模式,在对话框中加入:"修改npc_1012.lua,从文件Function.txt中读取函数注释及函数声明,按照对应npc_1012.txt的策划案在player_click_npc函数中实现相应的功能。"
没错,AI很好的理解了策划案,并编写出了正确的LUA脚本。
Lua
function player_click_npc(player_id, npc_id)
-- 弹出对话框询问玩家是否准备好迎战恶龙
Lua_Talk("你是否准备好去迎战恶龙?")
-- 等待玩家选择
local result = Lua_Wait_Ask("你是否准备好去迎战恶龙?")
if result == true then
-- 玩家选择"是",NPC掉落一个护身符
local x, y = Lua_GetPos(2, npc_id) -- 获取NPC当前位置
Lua_DropObject(x, y, 1001) -- 假设护身符的物品id为1001
-- 给玩家加100滴血
Lua_AddHP(0, player_id, 100)
-- NPC开始跟随玩家
Lua_Follow(2, npc_id, 0, player_id)
end
end
看着完成的函数,我只能用震惊来表达此时此刻的心情。
因为,它意味着,我们稍做一些自动化的处理,就可以让AI为我们的策划案生成无数的技能、NPC逻辑、任务了。即便要修改,也只需要修改一下策划案,而不必再花费大量的脚本去看那些脚本代码了。
三、变革、就在今天
本节我基于AI IDE,成功的实现了让AI从策划案到脚本,按照系统程序员给定的函数列表说明完成脚本的过程、虽然这只是小小的一步,但懂的自然懂。
基于InsCode AI IDE的知识库服务、你可以从内部的WEB端文档,结合策划案,快速的打造出无限量的LUA脚本,从而再也不必花费大量的人力和精力让策划人员挠头掉发减寿。
变革、就在今天!