魔兽地图编辑器完整教程
的有关信息介绍如下:RPG地图制作教程
教你如来自何做自己的RPG---么推战--制图教学说到魔兽争霸3大家肯定不会陌生,那么各位在玩过特色各异的地图以后有没有想过360问答自己动手做一张地图?摇头拒绝的家伙们听我把话说完,其实做意区一张地图并不是各位想象的那么沙困难。下面我将会简单介绍一下集说玉先升生或候合了几种常见功能的地图的制作方法,有兴趣的朋友不妨跟着做做业越指乱已。
这次要做的是一个3C中的人物选择功能,也就是当小精灵进入能量圆的时候选择对应的英雄,这是一个3C最普通的选人功能。那么动手了。
首先找到地图编辑器,编辑器位于魔兽目录下,名为WorldEditor.exe(世界编辑器),双击打开。第一次使用地图编首比免天这培构院些书部辑器,系统会自动为我们创建一张6沿4*64大小,环境为罗丹仑的夏天的新地图。如很宁他缩督飞货夫八果想要手动创建新地图,可以通过点击菜单栏的文件-新地图/Fil渐妈宗殖江持e-NewMap来创建。如果想要关闭在打开编辑器的同时创建新地图的功能,可以法案段同过选择文件-参数设置-常规-打开时创建新地图/File-Preferences-General-Createanewmaponstart_up,将前面延德赵普好的勾去掉来实现。
地图创建完毕以后看见的就是这个地图编辑器的组成了,按2下真烧G关闭坐标格的显示。在制作上面提到的功能以前,让我们先延牛弱述兴等非海席田宁做点准备工作。首先既拿罪常然是选择英雄,那么英雄自然是必不可少的,按U打开单位编辑面板,在这里可以选择我们所煤立列际沿生希望的单位放置到地图上,我选择了恶魔猎人(DemonHunter),血巫师(BloodMage)和巫妖王(LichKing),当然各位如果看上其他英雄请随意,这并不会影响后面的制作。顺势格见价湖达视便说说在单位面板中切换种族的方法是在第三行左边的那个扩展菜单里面选择希望的种族,由于选择英雄的时候所看见的英雄是不被我们克控制的,必须选择额活展了以后才能控制,因此一般的做法是将英雄更改为中立单位,更改的方法是双击放置在地图上的英雄,选择常规-玩家-中立无敌意/General-Player-NeutralPassive。注意各英雄之间不要间隔太远,否则让小精灵跑来跑去的很麻烦。放好英雄以后当然还要在英雄面前放个能量圆作为小精灵进入选择用,能量圆可以在单位面板的中立敌对分支中找到。最后再放上选英雄用的小精灵,由于多个玩家的选择英雄的原理是相同的,所以这里我们只做3个玩家的选择,因此只放属于3个势力玩家的小精灵。如
工作就算是完毕了,接着开始做功能部分,要用到触发器。
由于是初次介绍,为了不扰乱大家的思维,所以我对触发器的原理不做太多的介绍,大家只需要知道触发器的作用就是可以以事件的方式来实现一些功能就可以了。按F4打开触发器编辑器/TriggerEditor,删除默认的那个触发器,那是为MEELE准备的。可以看见在魔兽地图编辑器中,一个触发器是由事件(Events),环境(Conditions),动作(Actions)三部分左右,这三个部分之间的关系可以用一个简单的例子说明:“火药接触火以后爆炸”。在这里,火药与火接触就是事件,只有二者接触才会发生以后的动作;而火药接触的对象必须是火才会爆炸,所以火在这里作为环境,限制火药爆炸需要的条件;火药爆炸就是动作,是在与火接触以后引发的动作。在触发器里面我们可以根据需要自己修改事件,环境,动作这三部分的内容,比如可以将火药与火接触爆炸改为与水接触爆炸。那么有了以上概念,来看看选择英雄的制作方法,首先英雄必须在发生了一个事件以后才会被选择,而这个事件在这里就是:小精灵进入能量圆;但是在这里必须限制只有小精灵进入能量圆的时候英雄才会被选择,其他种类的单位进入则什么都不会发生,于是整个触发的环境-也就是限制条件也有了,就是:进入能量圆的单位类型是“小精灵”;最后就是动作了,英雄被选择,其实选择英雄的动作就是把英雄的从中立单位更改为玩家势力控制的单位。把上面所说的步骤以触发的方式写出来就是这样的:
事件(Events)
一个单位进入能量圆范围内
环境(Conditions)
进入的单位的类别是“小精灵”
动作(Actions)
把能量圆对应的英雄的控制者改为选择英雄的玩家
现在再按照写出来的触发在地图编辑器中寻找对应的选项。
创建一个新的触发/NewTrigger,方法是在触发编辑器右方的窗口中按鼠标右键选择新<触发器/NewTrigger>,新触器发会被自动命名为“为命名触发00X”,触发器的名字可以通过在选择触发以后按F2来修改。然后点击新建的那个触发,在右下方的触发编辑窗口中鼠标右键,选择新事件/NewEvent,在出现的选单中选择单位-单位进入区域/Unit-UnitEntersRegion,接着点击红色字体部分-选择区域/-SelectRegion,这时候窗口会自动切换到大地图,要求我们选择一个区域,这里要解释一下在魔兽中,我们平时所看见的例如进入能量圆,或者进入花园,进入洞穴诸如此类“进入某个地点”的情况,其实并不是进入了我们看见的地方,而是进入了事先放置在能量圆,花园,洞穴等位置上的一个区域(Region)。而现在我们要做的正是放置这么一个区域并且在事件中选择他作为小精灵进入的区域,在大地图上可以看见
面板已经自动切换到区域面板(直接打开区域面板的快截键是R),点击面板上坐标样的按钮使之处于按下的状态,按住右键拖动鼠标在能量圆上画一个和能量圆大小差不多的区域出来,再次点击面板上的按钮使之处于弹起的状态,然后点选刚才放置的区域,会自动切换回触发编辑窗,红色字体部分也会被刚才所选的区域的名字取代,连续确定2次,事件便做好了。
接着是环境/Condition,选择<新环境-单位类型判断/NewConditions-UnitTypeComparison>,将进入区域的单位类型限制为“小精灵”
其中EnteringUnit的意思是“进入单位”这里指进入区域的单位,Equalto的意思是“等同于”。
最后是动作/Actions,在这里先整理一下有哪些动作需要执行:
1,由于选择好英雄以后小精灵会消失,所以在动作的开头要从游戏中移除小精灵。
2,更改被选英雄所属的势力为玩家操纵的势力。
3,将选好的英雄移动到指定位置,也就是3C中的基地。
4,由于英雄只能被选择一次,所以在动作的最后要关闭整个触发使之不再执行。
对应以上4条的动作分别是:
1,新动作-单位-移除-从游戏中移除进入单位/NewAction-Unit-Remove-Unit-Remove(Enteringunit)fromthegame
2,<新动作-单位-改变拥有者-改变恶魔猎人的拥有者为进入单位的拥有者并且改变颜色/NewAction-Unit-Changeowner-Unit-ChangeownershipofDemonHunter0002<gen>to(Ownerof(Enteringunit))andChangecolor
3,新动作-单位-移动-移动恶魔猎人到区域001的中心/NewAction-Unit-MoveDemonHunter0002<gen>instantlyto(CenterofRegion001<gen>)当然区域001也是自己创建的区域;
4,新动作-触发-关闭此触发/NewAction-Trigger-Turnoff(Thistrigger)
这样整个触发就完成了,对照这个触发再将选择另外2个英雄的也完成。最后保存地图,保存的时候会提醒你为每个势力放置开始点,如果没有放置,会自动为你在地图任意区域放置,手动放置的方法是在单位面板中选择开始点的图标然后进行放置。保存地图以后按Ctrl+F9测试一下吧~。另外别忘记在菜单栏设定-玩家/Scenario-Player>中将势力2和3的控制者设置为玩家/User,否则在游戏里就不能选择势力2,3了。
刷兵(有的地方把这个叫做孵蛋,我完全不能理解…………)。简单解释就是每隔一定时间产生一些单位在基地附近,那么废话不多说,下面开始介绍怎样制作。
大家都知道在3C中兵是每隔一定时间就会自动产生的,在触发器中,我们将这种每隔固定时间就会自动发生一次的事件叫做“周期性事件”,一般来说经常通过以下两种途径来实现事件的周期发生:
==========================方法1=========================================
第一种是通过触发器中的循环事件来实现的(也有将这个叫做回圈的),在触发器中新建一个Action(动作),在下拉菜单中找到这样的句子--ForEachIntegerA,DoMultipleActions(对于所有的整数数值A,执行若干动作),点击确定以后会看见在Actions(动作)这个类下面已经增加了这样的一个Action(动作):
Foreach(IntegerA)from1to10,do(Actions)
Loop-Actions
(对于所有的整数值A,从1到10,执行动作循环-动作)
我详细解释一下这个Action的作用,Foreach(IntegerA)from1to10(对于所有的整数值A,从1到10)的意思是重复执行10次Loop-
Actions(循环-动作)中指定的Actions(动作),同样的道理如果将后面的from1to10(从1到10)改成from1to20(从1到20)那么就
会重复执行20次动作,假设是from5to10则只会执行5次动作,至于为什么不直接用from1to5来代替from5to10,这是在某些时候必须
用到的功能,至于具体使用的时机,为了不使大家头脑混乱,现在暂时不做解释,等到实际使用中遇到类似情况再做说明。
--------------------------范例-------------------------------------
现在为了更形象的说明这个功能,我们来做个简单的范例,按F4打开触发器编辑器,新键一个Event(事件):Player-Player1(Red)
skipsacinematicsequence“玩家-玩家1(红色)跳过一段电影序列”,这个事件的建立方法是鼠标右键-NewEvent(新事件)-
Player(玩家)-CinematicSkipped(电影被跳过),这个事件的作用是当玩家1按下ESC键的时候就会触发动作。接着增加一个动作
Foreach(IntegerA)from1to10,do(Actions)
Loop-Actions
这样就将需要重复执行动作的次数定为10次,然后在Loop-Actions下面依次添加这些动作:
Game-Displayto(Allplayers)thetext:(String((IntegerA)))
(游戏-向所有玩家显示信息:将作为循环序列的整数A的值转换为字符串类型[关于数据类型,这里不多做解释,大家只需要知道只有字符串类型的数据才能被作为信息显示出来就可以了]。在这里“作为循环序列的整数A”其实就是用来记录已经重复执行了多少次动作的一个数值。)添加这个动作的顺序为NewAction(新动作)-Game(游戏)-TextMessage(Auto-Timed)(显示信息,自动调整信息显示时间)
Wait1.00seconds
(等待1.00秒,这样在每次执行动作以后都会间隔1秒才执行下一次动作)添加这个动作的顺序为NewAction(新动作)-All(所有)-Wait(等待)。
然后在整个循环Action(动作)的后面(注意,是在整个ForEachInteger的后面,不要添加到Loop-Actions下面去了)添加这个
Action(动作):
Game-Displayto(Allplayers)thetext:(finish)
作用是在整个循环结束以后显示一句话以标明循环结束了。当然其中的finish大家可以随自己爱好随意更改。
最后将MeleeInitialization(地图初始化)这个触发删除掉,在地图上放置玩家开始点,按Ctrl+F9进游戏测试,可以看见在游戏中当按下ESC键以后会分10次每秒一次依次显示数字1~10,最后则会显示finish。通过这个例子可以很清楚的看出。Foreach(IntegerA)from1to10,do(Actions)这个动作可以让位于Loop-Actions下面的动作重复执行from1to10中后面数字+1减去前面数字的次数,而当所有的重复次数被执行完毕以后,则会继续执行整个循环后面的动作。这样就很简单方便的实现了周期性事件的执行,但是用这个Action(动作)实现的周期性事件有两个弊端,第一是循环执行的次数有限,大家也看见了,在这个Action中无论如何也要求输入2个数字以确定执行次数;第二是每次执行动作之间的时间间隔有最小限制,在上面的例子中,大家将Wait1.00seconds(等待1秒)改为Wait0.00seconds(等待0秒)以后进入游戏测试,会发现即使是0秒,也会有微小的等待时间(大概0.1~0.4秒左右,视电脑配置而定),这样在执行某些重复时间间隔很小的周期性事件的时候,就完全无法实现了,对于必须排除以上两种限制的周期事件,就必须用到另外一种方法,periodicevent(周期循环事件),和ForeachInteger不同的是,这是一个Event(事件)而不是一个Action(动作)。
==========================方法2=========================================
添加这个事件的方法:NewEvent(新事件)-Time(时间)-PeriodicEvent(周期事件),添加完成以后可以看见在Event这一类下面出现了这样的Event(事件):
Time-Every1.00secondsofgametime
(时间-每1.00秒游戏时间)作用很明显,就是每1秒都会执行一次Actions(动作)中包含的所有动作,Every1.00seconds中的数字用于指定每多少秒执行动作。对于这个事件的功能,我们仍然可以用1个简单的范例来说明。
--------------------------范例-------------------------------------
新建一个触发器,Event(事件)就用上面那个事件,将1.00调整为0.50,也就是每0.5秒执行1次,然后按下Ctrl+B打开变量编辑面板,(由于变量是第一次接触,所以我暂时不详细说明,大家按照我说的做就是了,以后会对变量和数据类型做详细介绍。)点击面板上方的绿叉按钮,在出现的窗口中下方的下拉菜单选择Integer(整数)然后在上面的输入栏中为这个变量随便起一个名字,[图:var.gif]这里我用的名字是i1便于下面统一介绍,这样就建立好了一个类型为“整数”型的变量。暂时将这个变量放在这里备用,回到刚才建的触发,在Actions(动作)类中添加如下动作:
Seti1=(i1+1)
添加顺序:NewAction(新动作)-All(所有)-SetVarible(设置变量)
这个Action(动作)的作用是每次循环执行动作的时候让i1这个整数的值等于它当前的值+1,比方i1当前的值是5那么执行动作以后i1的值就是
5+1,也就是6。
接着添加:
Game-Displayto(Allplayers)thetext:(String(i1))
添加方法同上,作用是显示i1的值。
然后进入游戏测试,会看见在游戏中将自动以每0.5秒的速度显示数字,数值为上一次显示的数字+1。由此总结出PeriodicEvent(周期循环事件)的特点是会在激活触发以后以Event(事件)中规定的时间间隔来重复执行Actions(动作)中包含的所有动作,并且只要该触发没有被关闭,就会一直执行下去。
========================================================================
以上就是两种最常见的周期性事件的实现方法,那么在此理论基础上我简单叙述一下刷兵触发的原理。
刷兵触发就是一个周期事件,其动作的内容就是在指定位置创建单位,下面我简单的将这个触发写一下,并且加上少许说明。相信大家在对上面所讲的内容理解了的情况下应该立刻明白其中的道理。
UntitledTrigger003
Events
Time-Every3.00secondsofgametime[这个就是前面讲到的周期事件,在这里将周期的时间间隔设置为3秒]
Conditions
(Farm0009<gen>isalive)EqualtoTrue[这里Farm0009<gen>是一个农场,整个Condition(条件)的意思是,如果农场0009仍然生存,则继续执行Actions(动作)中的指令]添加这个Condition的方法是NewConditions(新条件)-BooleanComparison(布尔判断,也就是逻辑判断)-选择图示位置[图:boolean.gif]-Unit-UnitisAlive(单位-单位仍然生存)
Actions
Unit-Create1GiantWolfforPlayer1(Red)at(PositionofFarm0009<gen>)facingDefaultbuildingfacingdegrees
[单位-为玩家1(红色)创建一只狼在农场0009所在的位置面向系统默认的方向]
整个触发如果用语言表达的意思就是,每隔3秒钟只要农场0009依然存活,就创建一只狼在农场所在的位置。
进入游戏进行测试以后,大家应该不难发现这个触发有这样一个弊端:创建的单位没有数量限制,哪怕地图上已经有了几百,几千只狼,只要农场0009仍然存活,就会不断有新的狼产生,对于这种情况,我们可以通过加入如下的一个简单条件来给予限制:
(Numberofunitsin(Unitsin(Playablemaparea)matching(((Unit-typeof(Matchingunit))EqualtoGiantWolf)and(((Matchingunit)isalive)EqualtoTrue))))Lessthan5
整句条件的意思是,如果地图上所有存活的狼的数量小于5只,则继续执行Actions(动作)类中指定的动作。其中unitsinUnitsin(Playablemaparea)就是指整个地图上的单位,而(Unit-typeof(Matchingunit))EqualtoGiantWolf是指符合“单位类型为狼”这个条件的所有单位,(Matchingunit)isalive)EqualtoTrue是指所有“仍然存活”的单位。由于这个条件比较复杂,下面列出详细的添加方法:
NewConditions(新条件)-IntegerComparison(整数判断)
-在下拉菜单中选择“UnitinRegionMatchingCondition(区域内匹配条件的单位)”
-在下拉菜单中选择“And”-点击“Condition1(条件1)”-在下拉菜单中选择“Unit-TypeComparison(单位-类型判断)”
-点击“TriggeringUnit(触发单位)”将之改为“MatchingUnit(匹配单位)”-连续确定2次,点击“FootMan(步兵)”将之改为你在Action(动作)中所指定的生产单位种类,在这里我选择的是“狼”接下来点击“Condition2(条件2)”-点击图示位置[图bolc.gif]-在下拉菜单中选择“UnitisAlive(单位仍然存活)”-点击“TriggeringUnit(触发单位)”将之改为“MatchingUnit(匹配单位)”,连续确定2次
最后一直点击确定回到第一层菜单将中间的“Equalto(等同于)”改为“LessThan(小于)”,再点击最后那个0将其改为你所希望的最大出兵数量,到此整个Condition(条件)就完成了
以上就是一个限制了出兵最大数量的刷兵触发的基本原理,但是在实际制作中并不是这么简单,对应很多情况需要做出调整,有兴趣的可以自己去研究研究。
Q:什么是ObjectEditor?
ObjectEditor就是对象编辑器,其中包含了单位编辑器,技能编辑器,装饰物编辑器,科技编辑器等,可以允许地图制作者修改已有的上述对象或者建立新的对象。
打开对象编辑器的方法是在地图编辑窗口按F6或者点击快截工具栏中的头盔样按钮。
Q:什么是Trigger?
Trigger就是触发器,在地图编辑窗口按F4或者点击快截工具栏中的带有a字的按钮即可打开TriggerEditor(触发器编辑器)。
触发器是地图编辑器中用于控制地图中所发生的事件的工具,一个基本的触发器由Event(事件),Condition(环境/条件),Action(动作)三部分组成。下面用一个简单的例子来说明这三部分之间的关系:“你在此论坛提出的有价值的问题都会得到解答”
如果将上面这句话看做一个触发器,那么“你提出问题”就是整个触发器的Event(事件),接下来要发生的一切,不管是“我们为你解答问题”或者“我们不理会你”,都是在“你提出问题”之后发生的。
而限制你所提出的问题是否会得到解答的条件则是“你提出的问题有价值”,也就是整个触发器的条件,这个条件直接影响你“是否得到我们的解答”。
最后,当你提出的问题满足“有价值”这个条件的时候,就会发生“我们为你解答问题”这个动作,也就是整个触发器的动作。
Q:什么是JASS?
JASS是用于编辑地图的一种简单的语言,可以说是文本化以后的触发器(地图脚本:MAPSCRIPTS),但是由于触发器并没有提供JASS所具备的
所有功能,所以可以说JASS在某种意义上是触发器功能的扩展。
编辑JASS可以通过以下三种途径:
1,在触发编辑器(TRIGGEREDITOR)中,通过MENU->EDIT->CONVERTTOCUSTOMTEXT可以将当前选定的触发转换成脚本模式,也就是以JASS编辑的模式。
2,在触发编辑器中点击触发树(TRIGGERTREE,就是最左边列出所有触发的地方)的最顶端地图名,可以进入自定义脚本功能块,在这里可以用JASS写需要的函数,并且在其他的触发器中通过命令来调用。
3,使用ACTIONS中的CUSTOMSCRIPT动作可以在触发中插入一行JASS脚本代码。
Q:什么是“高级-游戏平衡常数”(英文名称Advanced-GameplayConstants)
最上方菜单左起第7个菜单上数第4个选择,这个选项里面包括了很多不能用T修改但是很有用的设置。比如买卖东西的距离,各种攻击类型对防御类型的伤害,英雄的等级经验复活数据等等。
Q:地图扩展名中的w3m,w3x,w3n,w3g分别是什么意思?
w3m:混乱之制(roc)版本的地图。
w3x:冰封王座(tft)版本的地图。
w3n:战役地图,这类地图必须放在War3(魔兽)目录下的Campaigns(战役)文件夹中才能使用。
w3g:游戏录象,位于War3(魔兽)目录下的Replay文件夹下。
E:地图类型解释
Melee-对战地图,即War3默认的游戏方式,BNLadder指定游戏类型。
Non-Melee-除了melee以外的所有类型统称。
Custom-非官方地图,但是通常表示非官方的non-melee地图。
RPG-RolePlayGames(角色扮演)~~但是现在很多人把所有Non-Melee地图都叫成RPG。
Mini-迷你游戏,通常指没有突出剧情、快节奏、游戏周期短的地图,没有固定的游戏方式,不含rpg。
Offence-通常是对抗性地图统称,有时也表示一些进攻npc为主题的地图。
3C-Offence的一种,本来只是一个地图的名称,通常是指有3条进攻路线的Offence。
Arena-Offence一种,竞技场,通常是指选定英雄后在固定区域内进行决斗的地图。
Defence-通常是指防守性地图统称,有时候也表示一些在非平衡的NPC进攻前提下的防守与反攻。
TD-Defence的一种,建造Tower(炮台)防守NPC有规律的进攻。
Cutscene-通常是指剪辑影片,内容比较简单。(非CG)
Cinematic-通常是指完整影片,内容比较丰富。(非CG)
常见问题解答
Q:我已经把Player1的种族设成Human,为什么进入地图的时候又变回Random?
A:把Scenario=>ForceProperties=>FixedPlayerSettings打勾,如此一来,前面PlayerProperties设定的种族、操控者、颜色,都会被锁定
Q:如何在WE中的ObjectEditor输入负数而不会自动归零?
A:因为B社担心一些非法数值会对游戏稳定度造成影响,因此限制了数值的范围。进入WE后,工具列File=>Preferences=>AllownegativerealvalueintheObjectEditor打勾,就能在ObjectEditor中输入real负数而不会自动归零(Integer仍会自动归零)。另外,按住shift+enter再修改数值,不会受到任何限制。请注意,虽然可以输入数值而不被限制,不过如果因为非法的数值导致电脑读不出来,玩游戏时可能会当机。
Q:如何提升世界编辑器的速度?
A:
关掉笔刷--把工具列的Windows=>BrushList关掉。可以大幅提升速度。
减少自订资料--在ObjectEditor(物件编辑器)允许自订物件,但是自订的物件越多,WE就会越lag,其中尤以自订单位的影响最严重。笔者曾经建立200多个自订单位,结果WE速度大约慢到剩1/3,而且按什么钮都会lag一下;后来把自订单位删掉,直接修改内建的单位,速度就大幅地改善了。所以,尽量直接修改内建的物件(含单位、可破坏物件、物品、技能、……等),少用自订物件。减少预置的物件--放置的单位、物品、可破坏物件和饰物放得越多,WE的速度就越慢(但是并不明显)。区域、摄影机和地形的影响则很小,几乎可以忽略。
Q:为什么在测试地图时,所有的随机数值都一样?例如武士(Footman,dmg=12~13)第一次攻击一定是12?
A:进入WE后,工具列File=>Preferences=>TestMap=>UseFixedRandomSeed取消打勾。
Q:如何把英雄等级上限设定超过10级?Q:如何使英雄5级后打中立怪还有经验值?Q:TFT版本中英雄即使不在战场,也会吸到经验值,如