当前位置: 首页 > article >正文

基于AI IDE 打造快速化的游戏LUA脚本的生成系统

        前面写了一篇关于使用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里输入:

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函数:

#创建函数
#创建玩家,参数为玩家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脚本。

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脚本,从而再也不必花费大量的人力和精力让策划人员挠头掉发减寿。

        变革、就在今天!


http://www.kler.cn/a/457598.html

相关文章:

  • MySQL 08 章——聚合函数
  • UniApp | 从入门到精通:开启全平台开发的大门
  • RP2K:一个面向细粒度图像的大规模零售商品数据集
  • 多文件比对
  • 动态规划<八> 完全背包问题及其余背包问题
  • leetcode 173.二叉搜索树迭代器栈绝妙思路
  • 自学记录鸿蒙API 13:实现多目标识别Object Detection
  • 学习测试day1
  • ClickHouse 日常操作记录
  • 跟着问题学18——大模型基础transformer详解(2)多头自注意力机制
  • Linux 使用入门指南
  • 如何在 Spring Boot 中配置数据库?
  • 【bluedroid】A2dp Source播放流程源码分析(3)
  • C#控件开发2—流动管道
  • 小猫咪抽奖系统源码1.11(有卡密功能)
  • 【潜意识Java】探寻Java子类构造器的神秘面纱与独特魅力,深度学习子类构造器特点
  • 4. 指针和动态内存
  • Pytorch | 利用PC-I-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击
  • 【13】Selenium+Python UI自动化测试 集成日志(某积载系统实例-07)
  • 【学习笔记】ChatGPT原理与应用开发——基础科普
  • No.29 笔记 | CTF 学习干货
  • C++ 设计模式:策略模式(Strategy Pattern)
  • 「Mac畅玩鸿蒙与硬件48」UI互动应用篇25 - 简易购物车功能实现
  • 【Spring】基于注解的Spring容器配置——@Scope注解
  • 如何通过采购管理系统提升供应链协同效率?
  • Android Bluetooth 问题:BluetoothAdapter enable 方法失效