马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
本帖最后由 晴天之铭_UEI69 于 2024-1-10 09:59 编辑
战役AI是一个非常简单、好做、好用的AI,今天手把手教大家怎么做战役AI。
1、首先下载vscode
https://segmentfault.com/a/1190000017464740
这是vscode设置中文的教程链接
2、安装好vscode,并且设置好中文后。下载jass扩展。
这是vscode下载扩展的方式,点击左边的方框,再搜jass。
3、现在可以开始制作战役AI了,随便创建一个记事本,把后缀改成ai格式。
注意AI命名必须要用英文,不能用中文,首字母是英文后面接上数字。
4、敲出函数结构,没有接触过jass的萌新可以理解成触发器,当成没有事件的触发器,里面是写动作的。
这么理解就行了,虽然不是一个东西。
这里是函数名,改成main,理解成触发器改名字就行了。
5、我们编辑器打开物编,按Ctrl+d,可以看单位id字符串
看见这个人族农场了吗?hhou,这个单位id,这是ai识别地图上面单位类型的名称,可以理解成单位真名,单位你叫啥名字都无所谓,ai不看那个,ai只看你真名。
这里强调一遍,有ai脚本的地图,所有建筑必须要有路径纹理,路径纹理是建筑物占地体积。
大家想必都知道,建筑物的碰撞体积是没有意义的, 建筑占地只能看路径纹理。
如果有建筑没有路径纹理,AI寻路一旦遇到没有路径纹理的建筑,地图就会崩溃。
6、这是战役AI的脑子,这个动作,这里是写AI人口房子。AI如果是兽族,就写兽族的房子。
反正你农民可以造什么加人口,就写什么房子。
右边写null,右边是涉及AI英雄学习技能的,对于萌新来说有点复杂,这里不讲。
- //主函数
-
- function main takes nothing returns nothing
- //战役AI核心,传递房子给common.ai内部,它会自动补充人口建筑
- //右边的null,你可以自己写一个AI的英雄学习技能的函数,传递进去
- call CampaignAI('hhou',null)
复制代码
按tab,可以对齐空格。
- //主函数
-
- function main takes nothing returns nothing
- //战役AI核心,传递房子给common.ai内部,它会自动补充人口建筑
- //右边的null,你可以自己写一个AI的英雄学习技能的函数,传递进去
- call CampaignAI('hhou',null)
- //AI有站岗的单位被杀,它会再训练一个单位,去到原本的地方站岗
- //这是它再次训练的次数,3个参数表示1、容易难度2、普通难度3、困难难度
- //我这里的写法意思是,AI在容易难度会补充张岗单位2次,普通难度4次,困难难度6次
- call SetReplacements(2,4,6)
- //开启替换守卫,如果输入的是false那么不会替换
- call GroupTimedLife(true)
- endfunction
复制代码
7、这些是暴雪给我们准备好的AI函数,直接输入启动,AI就会附带这些功能,它们本身运行原理萌新没必要去考虑。
- //主函数
-
- function main takes nothing returns nothing
- //战役AI核心,传递房子给common.ai内部,它会自动补充人口建筑
- //右边的null,你可以自己写一个AI的英雄学习技能的函数,传递进去
- call CampaignAI('hhou',null)
- //AI有站岗的单位被杀,它会再训练一个单位,去到原本的地方站岗
- //这是它再次训练的次数,3个参数表示1、容易难度2、普通难度3、困难难度
- //我这里的写法意思是,AI在容易难度会补充张岗单位2次,普通难度4次,困难难度6次
- call SetReplacements(2,4,6)
- //开启替换守卫,如果输入的是false那么不会替换
- call GroupTimedLife(true)
- //AI初始化
- //是否保护玩家
- call SetDefendPlayer( false )
- //设置随机路径
- call SetRandomPaths( false )
- //维修建筑
- call SetPeonsRepair( true )
- //英雄路过商店购买基础物品,比如血瓶,回程卷轴
- call SetHeroesBuyItems( false )
- //AI不对玩家放水。放水意思大概是AI像老年人一样,等你造好兵慢吞吞来
- //写false就是放水
- call SetWatchMegaTargets( true )
- //AI基地没了可以在另一个矿开基地
- call SetCaptainChanges( false )
- endfunction
复制代码
设置工人采集数量,这两个变量,common.ai库里面已经定义好了,我们直接调用就行了。
8、训练单位,比如说,我们演示图的人族对吧,那肯定要出人族农民,人族农民的字符串是hpea。
这是AI身体部分的开始,AI检查自己身体,会不停从上,往下检查,所以AI最开始检查自己农民就没错,数量不够8个AI会自己出8个。
当然我们可以写成468,AI根据当前什么难度检查自己应该有多少个这个单位的数量。这个难度是战役难度那个,触发器可以设置。
括号内的空格不影响什么,但是也没有存在的必要,我们可以写的紧凑一点。
好了,我们把身体写好,把基础建筑写好,有铁匠铺,我们肯定要让AI研究一下科技对吧?
9、防守兵力,好了,现在我们身体也完成了。可以捏手了。
防御自己基地的,就是出兵防御
- //铁剑术
- call SetBuildUpgrEx( 3,3,3,'Rhme')
- //出6个步兵防御
- call CampaignDefenderEx(6,6,6,'hfoo')
- //出6个火枪手防御
- call CampaignDefenderEx(6,6,6,'hrif')
复制代码
战役AI会忽视地图上面摆放的单位,新训练单位来防御和进攻。
也就是说,你开始给战役AI放6个步兵在地图上不算,它要自己造6个步兵派去防守或者进攻,所以地图上初始单位可以供给AI防守,AI不会派这些兵去进攻的。
10、进攻兵力,防守写好了,我们来写第一波进攻。
注意这个Player(2)是指玩家3,玩家1是Player(0),玩家id-1
- call SetBuildUpgrEx( 3,3,3,'Rhme')
- //出6个步兵防御
- call CampaignDefenderEx(6,6,6,'hfoo')
- //出6个火枪手防御
- call CampaignDefenderEx(6,6,6,'hrif')
- //进攻组
- //===============第一波进攻=====================
- //进攻初始化,让AI大脑动起来,去喊人去打人
- call InitAssaultGroup()
- //从防守组中抽3个步兵去打人
- call CampaignAttackerEx(3,3,3, 'hfoo')
- //从防守组中抽3个火枪手去打人
- call CampaignAttackerEx(3,3,3, 'hrif')
- //多少秒后打,打谁?
- //3秒后,打玩家3
- //这些兵是不会回来的,一路走好
- call SuicideOnPlayerEx(3,3,3,Player(2))
复制代码
第一波进攻我们就写好了,我们写第二波进攻。
- //多少秒后打,打谁?
- //3秒后,打玩家3
- //这些兵是不会回来的,一路走好
- call SuicideOnPlayerEx(3,3,3,Player(2))
- //===============第二波进攻=====================
- //进攻初始化,让AI大脑动起来,去喊人去打人
- call InitAssaultGroup()
- //从防守组中抽6个步兵去打人
- call CampaignAttackerEx(6,6,6, 'hfoo')
- //从防守组中抽4个火枪手去打人
- call CampaignAttackerEx(4,4,4, 'hrif')
- //多少秒后打,打谁?
- //10秒后,打玩家4
- //这些兵是不会回来的,一路走好
- call SuicideOnPlayerEx(10,10,10,Player(3))
复制代码
我们可以一直续下去,但是我累了,所以用loop,让它无限循环。
- //开始无限循环重复动作
- loop
- //===============第n波进攻=====================
- //进攻初始化,让AI大脑动起来,去喊人去打人
- call InitAssaultGroup()
- //从防守组中抽6个步兵去打人
- call CampaignAttackerEx(6,6,6, 'hfoo')
- //从防守组中抽4个火枪手去打人
- call CampaignAttackerEx(4,4,4, 'hrif')
- //多少秒后打,打谁?
- //70秒后,打玩家3
- //这些兵是不会回来的,一路走好
- call SuicideOnPlayerEx(70,70,70,Player(2))
- endloop
复制代码
好了,一个人族的战役AI制作完毕。
我们创建一个演示图,运行演示一下。
空白图设置
设置好一个队友,和一个敌人。
1个基地5个农民,触发两个触发。
我们导入地图运行
最终效果:
下面给出全部代码和附件
testb.zip
(1.86 KB, 下载次数: 4)
- //主函数
-
- function main takes nothing returns nothing
- //战役AI核心,传递房子给common.ai内部,它会自动补充人口建筑
- //右边的null,你可以自己写一个AI的英雄学习技能的函数,传递进去
- call CampaignAI('hhou',null)
- //AI有站岗的单位被杀,它会再训练一个单位,去到原本的地方站岗
- //这是它再次训练的次数,3个参数表示1、容易难度2、普通难度3、困难难度
- //我这里的写法意思是,AI在容易难度会补充张岗单位2次,普通难度4次,困难难度6次
- call SetReplacements(2,4,6)
- //开启替换守卫,如果输入的是false那么不会替换
- call GroupTimedLife(true)
- //AI初始化
- //是否保护玩家
- call SetDefendPlayer( false )
- //设置随机路径
- call SetRandomPaths( false )
- //维修建筑
- call SetPeonsRepair( true )
- //英雄路过商店购买基础物品,比如血瓶,回程卷轴
- call SetHeroesBuyItems( false )
- //AI不对玩家放水。放水意思大概是AI像老年人一样,等你造好兵慢吞吞来
- //写false就是放水
- call SetWatchMegaTargets( true )
- //AI基地没了可以在另一个矿开基地
- call SetCaptainChanges( false )
- //设置资源采集工人
- set campaign_wood_peons = 3
- set campaign_gold_peons = 5
- //训练农民
- //AI会自己遍历搜索所有建筑,能够训练这个单位id的建筑,进行训练
- //3个数字同意代表战役3个难度,容易、普通、困难
- //不同难度出不同数量的农民,出不同数量的兵
- call SetBuildUnitEx(8,8,8,'hpea')
- //城镇大厅
- //如果升本就按照格式,写下一本的建筑
- //关于自定义建筑,会出现升级二本后,又造一本,
- //因为AI识别等价物不对,把二本和一本判断成两个建筑
- call SetBuildUnitEx(1,1,1,'htow')
- //兵营
- call SetBuildUnitEx(2,2,2,'hbar')
- //伐木场
- call SetBuildUnitEx(1,1,1,'hlum')
- //铁匠铺
- call SetBuildUnitEx(1,1,1,'hbla')
- //升级二本
- call SetBuildUnitEx(1,1,1,'hkee')
- //科技研究
- //铁甲
- call SetBuildUpgrEx( 3,3,3,'Rhar')
- //铁剑术
- call SetBuildUpgrEx( 3,3,3,'Rhme')
- //出6个步兵防御
- call CampaignDefenderEx(6,6,6,'hfoo')
- //出6个火枪手防御
- call CampaignDefenderEx(6,6,6,'hrif')
- //进攻组
- //等待地图触发器那边发送进攻允许指令
- //call WaitForSignal()
- //===============第一波进攻=====================
- //进攻初始化,让AI大脑动起来,去喊人去打人
- call InitAssaultGroup()
- //从防守组中抽3个步兵去打人
- call CampaignAttackerEx(3,3,3, 'hfoo')
- //从防守组中抽3个火枪手去打人
- call CampaignAttackerEx(3,3,3, 'hrif')
- //多少秒后打,打谁?
- //3秒后,打玩家3
- //这些兵是不会回来的,一路走好
- call SuicideOnPlayerEx(3,3,3,Player(2))
- //===============第二波进攻=====================
- //进攻初始化,让AI大脑动起来,去喊人去打人
- call InitAssaultGroup()
- //从防守组中抽6个步兵去打人
- call CampaignAttackerEx(6,6,6, 'hfoo')
- //从防守组中抽4个火枪手去打人
- call CampaignAttackerEx(4,4,4, 'hrif')
- //多少秒后打,打谁?
- //10秒后,打玩家4
- //这些兵是不会回来的,一路走好
- call SuicideOnPlayerEx(10,10,10,Player(3))
- //开始无限循环重复动作
- loop
- //===============第n波进攻=====================
- //进攻初始化,让AI大脑动起来,去喊人去打人
- call InitAssaultGroup()
- //从防守组中抽6个步兵去打人
- call CampaignAttackerEx(6,6,6, 'hfoo')
- //从防守组中抽4个火枪手去打人
- call CampaignAttackerEx(4,4,4, 'hrif')
- //多少秒后打,打谁?
- //70秒后,打玩家3
- //这些兵是不会回来的,一路走好
- call SuicideOnPlayerEx(70,70,70,Player(2))
- endloop
- endfunction
复制代码
2024年1月10日内有错误已经更正,训练农民那个我写成兽族的opeo,现在已经修正回为人族的hpea。
|