关于dota里的术语
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于dota里的术语相关的知识,希望对你有一定的参考价值。
我是那种很菜的新手。。。。和同学玩,语音时,他们说的好多我都不懂,所以求亲们给我补习一下~~像什么游走,打野,正补啊。。。还有一些常用英雄的简称。。。拜托啦
DPSDamage Per Second,指秒伤害。
而在魔兽争霸3的DOTA ALLSTARS地图的战术中,它的意思是攻击输出。就是高输出高攻单位
高攻单位在DOTA里多是敏捷型英雄,比如如巨魔战将(绿皮)、矮人狙击手(火枪)、黑暗游侠(小黑)、沉默术士(破法)、幻影刺客、复仇电魂(电魂)、骷髅射手(骨射)、影魔、魅惑魔女(小鹿)、黑耀毁灭者(黑鸟)敌法师 灵魂守卫 等等。其中小鹿、破法和黑鸟是智力型。
在这些DPS英雄中,绝大多数是要在游戏的中后期才得以发威的,不过小鹿和黑鸟是例外,它们的技能决定它们在前期就有很多的攻击优势。
其它的DPS英雄,需要靠等级和装备的起来才得以成长。它们大多数合成的装备有大炮,金箍棒,疯狂头盔,振奋宝石,蝴蝶剑以及最牛的圣剑+不朽之守护(圣盾系列)。
这些DPS英雄,在前期多半是很脆弱的,它们需要在其它魔法英雄的GANK中好好的保存自己。才能好好的打钱,出装备,让己方部队在后期得到攻击支持。
作为一个DPS英雄其实不应该完全的在前期单独行动,有时也需要配合己方英雄去进行GANK和反GANK。
Pushers - 能够快速的摧毁敌方炮台和兵营的英雄,这些英雄可以召唤额外的单位或者对一片敌方小兵造成伤害。
这些英雄通常装备梅肯斯姆和圣殿指环这样的装备来增强他们召唤生物的威力。
Pushers的例子:先知(自然之力),死亡先知(食腐群蜂和恶灵驱使)和光之守卫(冲击波)。
gank
Gank,Gangbang Kill的缩写,一说为Gangbang flank的缩写,为DotA游戏中的一种常用战术,用来指在游戏中两个以上的英雄同时行动,对对方的英雄进行偷袭、包抄、围杀。这种战术在比赛中广为使用,特别在东南亚的DotA比赛中更是大放异彩。谁容易被Gank?往往容易被Gank的英雄是更加依靠装备的后期DPS,如巨魔战将(绿皮)、矮人狙击手(火枪)、黑暗游侠(小黑)、食尸鬼(小狗)、沉默术士(破法)、幻影刺客、复仇电魂(电魂)等他们往往在前期相对无力,很多还缺少逃命自保的技能,而且这些英雄后期有了装备后往往会十分强大,所以成为在前期被Gank的首要目标。谁来实施Gank?一些前期的强力法师,如水晶室女(冰女)、秀逗魔导师(火女)、巫妖、恶魔巫师、剧毒术士(刺蛇),一些有限制型技能(如晕、减速)的英雄,如流浪剑客、骷髅王、复仇之魂(换位女VS)、冥界亚龙(毒龙),能够隐身偷袭的英雄,如赏金猎人、隐形刺客、骷髅射手(小骷髅、骨弓)、地穴刺客(小强),一些追杀能力超强的英雄,如暗夜魔王、狼人 沙王。如何防范Gank?随时注意小地图,当你是容易被Gank的英雄且对方几个红点不在时,请注意防范,采用抱塔(龟缩在己方塔边)等战术确保安全插眼睛,在自己打钱的地方以及河道中、重要路口插眼睛。如果对面有屠夫,那么还要在屠夫容易拉钩子偷袭的地方插眼以防暗钩偷袭。如果对面能够隐身偷袭的英雄,还应该买具有真视能力的眼睛或带真视宝石和强力队友一路,让他保护你打钱。提高自己的战术意识
noob
在魔兽对战RPG地图DotA中noob为英语newbie的简称,意思为新手、初学者、菜鸟。但所要注意的是,noob在一些地方是带有较强负面感情色彩的词,比如在骂打得不好的队友时常会说这个词,和sb或者小白类似。这个些词汇有时后会引起听者的不快。
补刀
补刀为魔兽对战RPG DotA术语,指的是抢最后一次攻击杀死小兵的技术,又叫做补兵,分为正补与反补(Deny),正补是指抢最后一次攻击杀死敌方小兵而获取金钱,反补是指通过抢最后一次攻击杀死己方小兵使对方无法获得金钱与经验。补兵的英文名为last hit,补兵作为DotA的基本功,往往从某个方面反映了一个玩家的DotA水平。
兵线
在魔兽对战RPG DotA中,兵线是指双方小兵交战的位置,通过控线把兵线控制在己方范围从而干扰对方补兵打钱使自己更容易补兵、反补、打钱、Gank是很重要的战术
控线
控线,魔兽对战RPG地图DotA术语,是指通过反补把兵线控制在靠近己方的位置(如己方塔下),这样能够使自己在一个相对比较安全的位置补兵打钱,也能够迫使同路的对手不得不进入相对危险的位置补钱,从而给Gank创造机会,并更多的压制对手。一个控线的高手往往能够把兵线控制在己方塔下或者河道坡口处
外塔
外塔,魔兽RPG地图DotA术语,指双方基地外三条路上的塔,每方每路两个,共12个。只有把一路的2个外塔全部拆掉,才能够拆掉高地塔打开基地的入口。因此外塔是基地的一道屏障。而且外塔在兵线控制以及在防守时提供相当的支援火力。由于每拆掉对方的一个塔拆塔的那个英雄将获得400-500元金钱,其塔拆塔方英雄获得200元,并且能够使下一级塔变得可以被攻击,推进自己的战线,所以每次针对防御塔的攻防战相当激烈。
ganker
ganker,Gangbang Killer的缩写。 就是gank的衍生词。
一些前期的强力法师,如水晶室女(冰女)、秀逗魔导师(火女)、巫妖、恶魔巫师、剧毒术士(刺蛇),一些有限制型技能(如晕、减速)的英雄,如流浪剑客、骷髅王、复仇之魂(换位女VS)、冥界亚龙(毒龙),能够隐身偷袭的英雄,如赏金猎人、隐形刺客、骷髅射手(小骷髅、骨弓)、地穴刺客(小强),一些追杀能力超强的英雄,如暗夜魔王、狼人。
路人
DotA、3C等多人组队对战类魔兽RPG术语,和黑店及团战相对,指一群互不认识的人通过网络在一起对战。又叫pub
路人局的特点:
配合水平较低
由于参予游戏的人互相不认识且来自天南海北,没有一起训练过,所以配合的默契程度较低,有时候甚至热衷于单挑
拼装备、拼打钱速度
由于配合不好,大家都往往拼命打钱早出装备,往往是打钱快的一方用好装备推掉对手,所以在DotA路人局中,辉耀飞鞋流的刷钱战术往往被大量使用
随着路人局参予者素质的提高,现在路人局的配合较之以往也多了起来,Gank等战术也大量使用。
黑店
在魔兽团队对战类RPG,如3C、真三、DotA中,黑店指的是一群相互认识、交流方便(如都在同一间网吧里坐在一起)的人组成一队进行游戏的行为,由于他们能够方便的进行交流,因此能够打出较好的配合,而且会默契的选择一些很占优势的英雄组合(如双晕、双慢、五法速推等),如果对面都是互相不认识的路人的话,这是占有很大的优势的。当然并不是开黑店就一定能够取得胜利,如果玩家击败了对面的黑店组合,这种行为叫做拆店,如果两方都是黑店,这种比赛就叫做HvH,或叫对拆。与黑店作战虽然比较困难,对于新手几乎没有取胜的可能,但是与黑店作战确实能够提高自己的战术意识、配合水平和操作细节,因此有不少高手以拆黑店为乐。
黑店虽然占据着很大的优势,但是只要不作出养人等违规行为,并不被认为是不道德、不正规的游戏行为。但是有一种六人黑店,却是十分不道德的。
六人黑店是指除了本方的五个人以外,再派一个人到对方去当内应,及时报告对方Gank企图或者后期英雄打野的位置。同时有的内应还会装小白不停地送钱送经验,或者故意误操作来帮助黑店取胜,如内应选复仇之魂把潮汐猎人或水晶室女换进来来放大技。这种六人黑店是严重破坏游戏平衡的。
ih
IH,In House的缩写,为魔兽对战RPG地图DotA术语,可译作“室内战”,是指两队的十名选手在同一个网吧、俱乐部内进行的对战,和团战(CW)比较类似。由于队友都坐在一起,所以交流方便,能够打出十分精妙的配合,而且参加ih的玩家的水平相对比路人战要高。整体说来,ih是一个比较注重配合,体现水平的游戏模式。随着大量DotA群如雨后春笋般地涌现,ih的词义也有了拓展,现在ih主要是指一个群里面的内战,与传统的ih所不同的是,这里的ih参与者是来自各处,也并没有聚集在同一个地方,而是通过网络一起对战,只是这10个人都来自同一个群里。
CW
Clan War(团队战)的缩写,在魔兽对战RPG地图DotA中,是指两个战队间进行的比赛,由于参加战队的都是水平相对较高的人,所以团战在配合和技术上都高出路人一筹,而且团战中有着与路人战截然不同的策略。各电子竞技赛事中的DotA比赛都是团战,如CDL联赛等
三刀
指在魔兽对战RPG地图DotA中散夜对剑+夜叉的装备组合
法球
法球是DotA中的一种攻击附加效果,能够起到减速、附加伤害等效果。 DotA的法球对于新手来说不是很好理解.所以恋恋简要地介绍下,力求让大家不再为它费神. 之所以会有"法球"这个名称,因为这些"技能"或"物品"是用魔兽中的球类物品改出来的,所以有了这个名字.当某个英雄同时具有两个法球时,有的会叠加,有的会覆盖.准确地把握这点,对于出装备很有好处.
Combo
2个以上英雄一起配合放出一系列技能将对方赶尽杀绝的战术。
IAS
increase attack speed,指攻击速度加成。
Imba
imbalance,指不平衡,可以是过分弱小,也可以是过分强大。
ks
Kill Steal,抢kill
AOE Heroes
- AOE是"Area Of Effect"的缩写,指有范围效果的技能。 AOE heroes指的是那些可以造成范围伤害的英雄。
精确的说,AOE法术是一些特定英雄施放的,能造成高额伤害或者能在短时间内造成长时间范围眩晕的法术。
拥有AOE法术的英雄经常在高水平游戏和团战中出现,因为他们可以在短时间内迅速的重创对方的队伍甚至杀死对方的英雄。
Assassins - 专精于快速杀死对方英雄的英雄。
这类英雄通常使用物理攻击。痛苦女王和地穴刺客是主要使用法术攻击的例子。这类英雄通常具有某种隐形的技能或者偷袭技能。大多数的assassins是敏捷型英雄。
Disablers - 拥有能够限制其他角色技能的英雄,这些英雄能够让对方在试图进攻或者逃跑时处于不利的境地。
Disabling skills(限制技能): 包括所有通过以下方式使对方英雄受到影响的技能
强行使对方移动,例如:巨力重击(裂魂人), 狂战士的怒吼(斧王),移形换位(复仇之魂)。
Nukers - 拥有能够在短时间内施放主动技能而造成高额伤害能力的英雄。
几乎所有的nukers都是智力型英雄,因为很少有其他类型的英雄拥有足够的魔法值,来同时施放一系列能对目标造成显著伤害的技能。
Spammers - 能够重复施放进攻性魔法来杀死对方或者使对方不能正常的游戏的英雄。
这些英雄通常能使对方英雄回到他们的生命之泉治疗,因此造成时间的浪费和经验的损失。
Stunners - 拥有能够眩晕其他角色能力的英雄。
某些英雄拥有能够造成眩晕的主动技能。
其他一些英雄拥有有机会在攻击时造成眩晕的被动技能。当这些英雄能够使敌方英雄持续眩晕时,我们称之为:无限晕。
这些拥有被动晕技的英雄通常会装备增加攻击速度的物品和碎骨锤来增加他们眩晕敌方英雄的机会。
Support - 拥有能够直接治疗其他队友技能的英雄。拥有治疗和状态技能的英雄属于此类。"Pushers"也可以归入此类,虽然他们也可以不同队友配合而单独行动。
梅肯斯姆,甚至是圣殿指环通常被用来治疗和增加队友的护甲(梅肯斯姆在5.84版中的对应物品是玄冥盾牌)。
Support英雄的例子:全能骑士(洗礼,驱逐和守护天使)和树精卫士(活体护甲,森林之眼和大自然的掩护)。
Tankers - 可以吸收巨额伤害的英雄,这些英雄通常兼具高额生命值和护甲值。
此类英雄通常用来吸引炮台火力和引诱对方英雄在他们身上浪费魔法或者吸引对方进入陷阱。
为了增强肉盾的能力,这些英雄通常装备能够增加护甲值,生命值和自身回血速度的物品(魔龙之心)或者是能够偷取/消费小兵生命值的物品(撒旦的邪力)。
例子:树精守卫(活体护甲和游戏中最高的基础力量),半人马酋长(很高的基础力量和刚毅不屈),斧王(狂战士的召唤),屠夫(堆积腐肉)和变体精灵(变形)。
backdoor - 这个术语被用来描述一个英雄绕过对方小兵而直接潜入对方基地对炮台和兵营造成伤害的行为。如果你一路杀小兵直到到达对方基地,则不是backdoor。Backdoor通常被大多数玩家所反感。根据官方的规则唯一一种违反规则的backdoor是直接传送到没有小兵的对方基地拆炮台和兵营的行为(比如先知)。其他绕过小兵攻击兵营和建筑的行为并不犯规,但是很容易引起其他玩家的反感。有一些战队和公共游戏玩家或许对backdoor是否合理有着不同的看法,所以他们可能因为你这么做了而禁止你同他们一起游戏,在这里特别提醒大家注意。
dropper - 这是在游戏中失去连接并且被其他玩家T掉的玩家。一些玩家并没有很好的把"droppers"同"leavers"区分开来,这可能导致不公平的禁令,因为掉线并不基于玩家的意愿。
leaver/quitter - 故意中途退出游戏的玩家。这是一个DotA世界中很令人头疼的问题,因为当一个玩家离开游戏时,会造成对面队伍的优势。
feeder - 让自己重复被对方玩家杀死的玩家,有时候是因为没有经验但是也可能是蓄意的给对方提供金钱和经验,从而给这些对方玩家提供优势。
ff - "Forfeit"的缩写,主要在TDA的游戏和其他一些高水平游戏中使用,指一个队伍在自己的世界之树/冰封王座被摧毁前就放弃并退出游戏。
gg - Good game. 一个玩家出于尊敬对手而使用的术语,意思是这场游戏非常棒。这个术语通常在游戏结束的时候使用(虽然并不仅仅是在DotA中)。有时这个术语也可以被用来嘲讽对方;因为gg通常在游戏结束时说,玩家在游戏之前说出gg可以暗示对方队伍或者自己的队友比赛结果已经被注定。
gj - Good job. 用来鼓励队友的一次成功杀敌,特别是多杀或者包含团队合作的杀敌。
n1 - Nice one. 类似于'gj',但是通常同'gj'有一点区别。
imba - Imbalanced.。用来指一个英雄,物品或者队伍不正常的过于强大。
ks - Kill Steal(抢杀)。用来指一个英雄"窃取"另外一个英雄认为是他自己的猎物;例如一个英雄攻击对方英雄直到濒死,同时"ks"的英雄对濒死的敌方英雄作出了最后的伤害,因此得到了一个杀人分数(适用于DotA的任何版本)。也可以扩展到抢塔。通常这类行动是不被鼓励的。一个KS的玩家被称为:KSer。
mh - "maphack"的简称。这个缩写通常用来指控通过不公平的第三方程序来使得整个地图全部显示的玩家。
noob, newb - 表示以下列出的几种情况之一:
"newbie"的缩写,一个游戏的新玩家或者不熟练的玩家。相关术语:pro, godlike。
某些时候用来指某个不听建议,不上进,或者对其他玩家粗鲁的玩家。
将另外一个玩家同某个新玩家对比来侮辱他。
afk - away from keyboard,玩家不在电脑前。
3: 这个词在国内平台就是"闪"的意思,多配合地图信标使用。
buff - 在游戏里是特指对己方有益的魔法效果。
De-Buff:.............显然,这个指的就是负面魔法,比如减速和诅咒。
Combo - 2个以上英雄一起配合放出一系列技能将对方赶尽杀绝的战术。
Creep - 非玩家控制的小兵,roshan不算 。
Creeping - 杀小兵赚钱升级的意思。
CM - Clan Match,战队之间的比赛。
CW - Clan War,同上。
PUB - 指路人局。
BLINK - 闪烁 闪耀。
H&R - Hit & Run的简称。是种操作,白话一点说就是打带跑。
MC - Micro Control,微操作。
MF - 打野怪练级。
EP - Replay,录象。
OB - Observer,观察者,以观察者身份进入游戏。
LAG - 网络延迟,也叫KA。通常导致ALT+Q(退出游戏)。
Solo - 单干,Dota一方有5个队员,3条主干道,5除以3除不尽,所以总有人要单干的。 因为Solo的升级快,所以单干通常意味着担杆,重担在肩。
stun - 带有眩晕效果的技能的总称。
slow - 带有缓慢效果技能的总称。
ult - ultimate,英雄需要6级才能习得的技能的总称,又称大绝。
HOD流:指出HOD招野而产生的速推和无限晕 光环效应 等打法..
A
Alchemist 炼金术士
am/anti/DH/magina 敌法师
Axe 斧王
B
Bane 痛苦之源
Bear 德鲁伊
bear/ursa 熊战士
beast/BM 兽王
bh/gondar 赏金猎人
bm/jugg 剑圣
BM/beast 兽王
bone/clinkz 骷髅射手(小骷髅)
bristle/pig 刚背兽(菊花猪)
brood/BA/spider 育母蜘蛛
BS 血魔
C
cent/warchief 半人马酋长
chaos/ck 混沌骑士
chen 圣骑士
ck/chaos 混沌骑士
clinkz/bone 骷髅射手(小骷髅)
cm 水晶室女
D
destroyer/OD 黑曜毁灭者(黑鸟)
DH/am/anti/magina 敌法师
dk 龙骑士
DK 地狱领主
doctor/wd 巫医(51)
doom/lucy/Lucifer 末日使者
DP 死亡先知
DR/drow 黑暗游侠(黑弓)
dragon/THD 双头龙
dryad/enchant 魅惑魔女
DS/Kardel/sniper 矮人狙击手
E
enchant/dryad 魅惑魔女
enigma 谜团
F
furion 先知
FV/void 虚空假面(J8脸)
G
geo/Meeop 地卜师(狗头)
gondar/bh 赏金猎人
J
jugg/bm 剑圣
K
Kardel/DS/sniper 矮人狙击手
kotl 光之守卫(光法)
L
lancer/PL 幻影长矛手(猴子)
layer/Lina 秀逗魔导师(火女)
Levi/TH/Tide 潮汐猎人
Lich 巫妖
Lina/layer 秀逗魔导师(火女)
Lion 恶魔巫师
lucy/doom/Lucifer 末日使者
Lucifer/doom/lucy 末日使者
luna/moon 月之骑士
lycan/wolf 狼人
M
magina/am/anti/DH 敌法师
magnus 半人猛犸
medusa 蛇发女妖(大那加)
Meepo/geo 地卜师(狗头)
MK/Zues 众神之王(矮子)
moon/luna 月之骑士
morph 变体精灵
N
NA 地穴刺客
NAGA/Siren 娜迦海妖(小那加)
Naix 食尸鬼
Necro 死灵法师
Nevermore 影魔
NS 暗夜魔王
O
OD/destroyer 黑曜毁灭者(黑鸟)
omni/omniknight 全能骑士
omniknight/omni 全能骑士
orge 食人鬼魔法师(蓝胖子)
P
PA 幻影刺客(幻刺)
panda/PB 熊猫酒仙
PB/panda 熊猫酒仙
pig/bristle 刚背兽(菊花猪)
PL/lancer 幻影长矛手(猴子)
potm 月之女祭师
priest 暗影牧师
Pudge 屠夫(胖子)
Pugna 遗忘法师
Q
qop痛苦女王
R
Raigor/shaker 撼地神牛
Razor 复仇电魂(电棍)
rhasta/ss 暗影萨满(小歪,青蛙)
S
SA 隐形刺客(隐刺)
SB 裂魂人(白牛)
shaker/Raigor 撼地神牛
silencer 沉默术士
Siren/NAGA 娜迦海妖(小那加)
SK 沙王
sk/sk king 骷髅王(大骷髅)
Slardar 鱼人守卫
sniper/DS/Kardel 矮人狙击手
Spectre 幽鬼(UG)
spider/BA/brood 育母蜘蛛
ss/rhasta 暗影萨满(小歪,青蛙)
ss/wl 术士
Sven 流浪剑客
T
TB 灵魂守卫
techies 哥布林工程师(本拉登)
TH/Levi/Tide 潮汐猎人
THD/dragon 双头龙
Tide/Levi/TH 潮汐猎人
Tinker 修补匠
tiny 山岭巨人(小小)
TP/treant 树精卫士
treant/TP 树精卫士
Troll 巨魔战将(绿皮)
TS 受折磨的灵魂(光鹿)
U
ursa/bear 熊战士
V
veno 剧毒术士
viper 冥界亚龙(毒龙)
Visage 死灵飞龙(40龙)
void/FV 虚空假面(J8脸)
VS 复仇之魂
W
warchief/cent 半人马酋长
wd/doctor 巫医(51)
weaver 地穴编织者(蚂蚁)
wl/ss 术士
wolf/lycan 狼人
Z
Zues/MK 众神之王
注:BM一般指剑圣;或者兽王
DK一般指地狱领主
三刀:散夜对剑+夜叉。
碎骨锤:晕锤。
散夜对剑:双刀 SY。
米达斯之手:点金手。
远行鞋:NIKE 飞鞋。
散失之刃:净化刀 消魔刀。
梅肯思姆:MEK MK。
支配头盔:HOD。
黯灭刀:减防刀 前期小圣剑。
狂战斧:金斧子 溅射斧。
黑黄杖:魔免杖 BKB。
洛萨之锋:风刀 隐刀。
达贡之神力:大根 红仗。
死灵书:40书 小人书。
金箍棒:MKB。
斯喀蒂之眼:冰眼 Skadi。
Aghanim的神杖:A杖 蓝杖。
Guinsoo的邪恶镰刀:羊刀。
Eul的神圣权杖:风杖。
回复指环:Ring。
逃脱匕首:跳刀。
回城卷轴:TP。
铁树枝干:Branch。 参考技术A 先说点最普通的。。。顺便回答下你的问题
游走:通过对地图的理解以及全地图的走动来试图击杀对方英雄 等同于GANK
打野:顾名思义在己方或敌方野区打野怪来获得经验以及金钱
正补:在补刀的时候对敌方小兵作出使其死亡的一击 也就是打最后一下来获得金钱和经验 反补:……己方小兵……阻止对方获得金钱和经验 这个很重要 多练习
常用英雄的简称
复仇之魂 :VS 黑暗游侠:DR 杀王:SNK
水晶室女:CM 修补匠:TK 恶魔巫师:Lion
撼地神牛:ES 月亮女祭司: POM 潮汐猎人:TH
暗影萨满:SS 骷髅王:SNK 影魔:SF
就先这些了 说实话 告诉你你也不一定记得 这个还是要多打打 才会记住的本回答被提问者采纳 参考技术B 游走指的是,不打兵,四处走来走去,拿符,帮助杀人,拿一血。
打野指的是,不打兵打野味。不过要小心被抓。
正补指的是,对面小兵红血的时候打他一下,钱就是你的了。
英雄的简称到一般是英雄名字的首字母+空格后面的首字母。 参考技术C 游走就是看地图上敌方的位置不好的,走过去,杀掉他。一般这样的英雄都是会有晕技能的人。正补就是你杀敌方的小兵,给你钱,就算一个正补。杀掉已方的一个小兵出个叹号就算一个反补。英雄简称去浩方上有每个英雄的介绍,慢慢看吧。 参考技术D 游走指的是,不打兵,四处走来走去,拿符,帮助杀人。
打野指的是,不打兵打野味,不过要小心被抓。
正补指的是,对面小兵红血的时候打他一下,钱就是你的了。
反补指的是,自己小兵红血的时候打他一下,也是可以的(按a键左击鼠标)。
英雄的简称到一般是英雄名字的首字母+空格后面的首字母。
游戏开发小技Unity中实现Dota里的角色技能地面贴花效果(URP | ShaderGraph | Decal)
本文最终效果
文章目录
一、前言
嗨,大家好,我是新发。
我平时偶尔会打打Dota2
,在Dota
里面,技能释放前会有一个地面贴花效果来作为范围的显示,比如深渊领主的这个技能,如下
我们可以看到技能范围特效是可以投射到场景地面和物体上(比如树木),这个在Unity
中如何去实现呢?本文我以URP
渲染管线为例,讲一下这个技能地面贴花效果的制作过程吧~
注:本文我使用的
Unity
版本为2021.3.1f1c1
,Universal RP
版本为12.1.6
二、环境准备
1、URP环境准备
首先通过PackageManager
安装Universal RP
,在Project
窗口中右键鼠标,点击菜单Create / Rendering / URP Asset (with Universal Renderer)
,
此时会创建出两个文件,如下
打开Project Settings
窗口,点击Graphics
,把Uinversal Render Pipeline Asset
文件拖给Scriptable Render Pipeline Settings
,如下
2、技能范围图案
接着我们去找一张技能范围的图案,我找了一张这样的,
接下来就是具体的实现过程了。有两个方案,下面我分别给大家讲解一下。
二、方案一:写Shader实现
1、Shader脚本:UrpDecal.shader
我在GitHub
上看到有个外国小哥写了个URP
渲染管线的贴花Shader
,
GitHub
地址:https://github.com/ColinLeung-NiloCat/UnityURPUnlitScreenSpaceDecalShader
我给他的Shader
添加了中文注释,方便大家阅读,如下
// see README here:
// github.com/ColinLeung-NiloCat/UnityURPUnlitScreenSpaceDecalShader
Shader "Universal Render Pipeline/NiloCat Extension/Screen Space Decal/Unlit"
Properties
[Header(Basic)]
_MainTex("Texture", 2D) = "white"
[HDR]_Color("_Color (default = 1,1,1,1)", color) = (1,1,1,1)
[Header(Blending)]
// BlendMode官方手册:https://docs.unity3d.com/ScriptReference/Rendering.BlendMode.html
// 混合模式
[Enum(UnityEngine.Rendering.BlendMode)]_SrcBlend("_SrcBlend (default = SrcAlpha)", Float) = 5 // 5 = SrcAlpha
[Enum(UnityEngine.Rendering.BlendMode)]_DstBlend("_DstBlend (default = OneMinusSrcAlpha)", Float) = 10 // 10 = OneMinusSrcAlpha
[Header(Alpha remap(extra alpha control))]
_AlphaRemap("_AlphaRemap (default = 1,0,0,0) _____alpha will first mul x, then add y (zw unused)", vector) = (1,0,0,0)
[Header(Prevent Side Stretching(Compare projection direction with scene normal and Discard if needed))]
[Toggle(_ProjectionAngleDiscardEnable)] _ProjectionAngleDiscardEnable("_ProjectionAngleDiscardEnable (default = off)", float) = 0
_ProjectionAngleDiscardThreshold("_ProjectionAngleDiscardThreshold (default = 0)", range(-1,1)) = 0
[Header(Mul alpha to rgb)]
[Toggle]_MulAlphaToRGB("_MulAlphaToRGB (default = off)", Float) = 0
[Header(Ignore texture wrap mode setting)]
[Toggle(_FracUVEnable)] _FracUVEnable("_FracUVEnable (default = off)", Float) = 0
//====================================== 在常规的用例中,通常可以忽略下面这些设置 =====================================================================
[Header(Stencil Masking)]
// https://docs.unity3d.com/ScriptReference/Rendering.CompareFunction.html
_StencilRef("_StencilRef", Float) = 0
[Enum(UnityEngine.Rendering.CompareFunction)]_StencilComp("_StencilComp (default = Disable) _____Set to NotEqual if you want to mask by specific _StencilRef value, else set to Disable", Float) = 0 //0 = disable
[Header(ZTest)]
// https://docs.unity3d.com/ScriptReference/Rendering.CompareFunction.html
// 默认Disable, 因为我们需要确保即使相机进入贴花立方体体积,贴花渲染也正确,尽管默认禁用ZTest将阻止EarlyZ(不利于GPU性能)
[Enum(UnityEngine.Rendering.CompareFunction)]_ZTest("_ZTest (default = Disable) _____to improve GPU performance, Set to LessEqual if camera never goes into cube volume, else set to Disable", Float) = 0 //0 = disable
[Header(Cull)]
// CullMode官方手册: https://docs.unity3d.com/ScriptReference/Rendering.CullMode.html
// 默认为Front, 因为我们需要确保即使相机进入贴花立方体体积,贴花渲染也正确
[Enum(UnityEngine.Rendering.CullMode)]_Cull("_Cull (default = Front) _____to improve GPU performance, Set to Back if camera never goes into cube volume, else set to Front", Float) = 1 //1 = Front
[Header(Unity Fog)]
[Toggle(_UnityFogEnable)] _UnityFogEnable("_UnityFogEnable (default = on)", Float) = 1
[Header(Support Orthographic camera)]
[Toggle(_SupportOrthographicCamera)] _SupportOrthographicCamera("_SupportOrthographicCamera (default = off)", Float) = 0
SubShader
// 关于tags的内容可以查阅官网手册:https://docs.unity3d.com/Manual/SL-SubShaderTags.html
// 为了避免渲染顺序问题, Queue必须 >= 2501, 它位于透明队列中
// 在透明队列中,Unity总是从后到前渲染
// 2500以下是不透明物体队列,会进行渲染优化,比如被遮住的就剔除掉不进行渲染
// 2500以上是透明物体队列,它会根据距离摄像机的距离进行排序
// 从最远的开始渲染,到最近的结束
// 天空盒被渲染在所有不透明和透明物体之间
// "Queue" = "Transparent-499" 即 "Queue" = "2501", 使得它早于所有透明物体进行渲染
Tags "RenderType" = "Overlay" "Queue" = "Transparent-499" "DisableBatching" = "True"
Pass
Stencil
Ref[_StencilRef]
Comp[_StencilComp]
Cull[_Cull]
ZTest[_ZTest]
// 为了支持透明度混合,关闭深度写入
ZWrite off
Blend[_SrcBlend][_DstBlend]
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
// 雾效
#pragma multi_compile_fog
// 为了使用 ddx() & ddy()
#pragma target 3.0
#pragma shader_feature_local_fragment _ProjectionAngleDiscardEnable
#pragma shader_feature_local _UnityFogEnable
#pragma shader_feature_local_fragment _FracUVEnable
#pragma shader_feature_local_fragment _SupportOrthographicCamera
// 所有URP渲染管线的shader都必须引入这个Core.hlsl
// 它包含内置shader的变量,比如光照相关的变量,文档:https://docs.unity3d.com/Manual/SL-UnityShaderVariables.html
// 同时它也包含很多工具方法
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
struct appdata
// 模型空间下的坐标,OS: Object Space
float3 positionOS : POSITION;
;
struct v2f
// 齐次裁剪空间坐标,CS: Clip Space
float4 positionCS : SV_POSITION;
// 屏幕坐标
float4 screenPos : TEXCOORD0;
// xyz分量: 表示viewRayOS, 即模型空间 (Object Space)下的摄像机到顶点的射线
// w分量: 拷贝positionVS.z的值,即观察空间 (View Space) 下的顶点坐标的z分量
float4 viewRayOS : TEXCOORD1;
// rgb分量:表示模型空间下的摄像机坐标,
// a分量:表示雾的强度
float4 cameraPosOSAndFogFactor : TEXCOORD2;
;
sampler2D _MainTex;
sampler2D _CameraDepthTexture;
// 支持SRP Batcher
CBUFFER_START(UnityPerMaterial)
float4 _MainTex_ST;
float _ProjectionAngleDiscardThreshold;
half4 _Color;
half2 _AlphaRemap;
half _MulAlphaToRGB;
CBUFFER_END
// 顶点着色器
v2f vert(appdata input)
v2f o;
// VertexPositionInputs包含多个空间坐标系中的位置(world, view, homogeneous clip space, ndc)
// Unity编译器将剥离所有未使用的引用 (比如你没有使用view space)
// 因此,这种结构具有更大的灵活性,无需额外的成本
VertexPositionInputs vertexPositionInput = GetVertexPositionInputs(input.positionOS);
// 得到齐次裁剪空间 (clip space) 下的坐标
o.positionCS = vertexPositionInput.positionCS;
// Unity雾效
#if _UnityFogEnable
o.cameraPosOSAndFogFactor.a = ComputeFogFactor(o.positionCS.z);
#else
o.cameraPosOSAndFogFactor.a = 0;
#endif
// 准备深度纹理的屏幕空间UV
o.screenPos = ComputeScreenPos(o.positionCS);
// 观察空间 (view space) 坐标,即在观察空间中摄像机到顶点的射线向量
float3 viewRay = vertexPositionInput.positionVS;
// [注意,这一步很关键]
//=========================================================
// viewRay除以z分量必须在片元着色器中执行,不能在顶点着色器中执行! (由于光栅化变化插值的透视校正)
// 我们先把viewRay.z存到o.viewRayOS.w中,等到片元着色器阶段在进行处理
o.viewRayOS.w = viewRay.z;
//=========================================================
// unity的相机空间是右手坐标系(z轴负方向指向屏幕),我们希望片段着色器中z射线是正的,所以取反
viewRay *= -1;
// 观察空间到模型空间的变换矩阵
float4x4 ViewToObjectMatrix = mul(UNITY_MATRIX_I_M, UNITY_MATRIX_I_V);
// 观察空间 (view space) 转模型空间 (object space)
o.viewRayOS.xyz = mul((float3x3)ViewToObjectMatrix, viewRay);
// 模型空间下摄像机的坐标
o.cameraPosOSAndFogFactor.xyz = mul(ViewToObjectMatrix, float4(0,0,0,1)).xyz;
return o;
half4 frag(v2f i) : SV_Target
// [注意,这一步很关键]
//========================================================================
// 去齐次
i.viewRayOS.xyz /= i.viewRayOS.w;
//========================================================================
// 深度纹理的UV
float2 screenSpaceUV = i.screenPos.xy / i.screenPos.w;
// 对深度纹理进行采样,得到深度信息
float sceneRawDepth = tex2D(_CameraDepthTexture, screenSpaceUV).r;
float3 decalSpaceScenePos;
// 正交相机
#if _SupportOrthographicCamera
// 我们必须支持正交和透视两种投影
// unity_OrthoParams:
// unity_OrthoParams是内置着色器遍历,存储的信息如下:
// x 是正交摄像机的宽度,y 是正交摄像机的高度,z 未使用,w 在摄像机为正交模式时是 1.0,而在摄像机为透视模式时是 0.0。
// 更多的内置着色器遍历可查看官方手册: https://docs.unity.cn/cn/2019.4/Manual/SL-UnityShaderVariables.html
// (这里要放 UNITY_BRANCH 吗?) 我决定不放,原因看这里: https://forum.unity.com/threads/correct-use-of-unity_branch.476804/
if(unity_OrthoParams.w)
// 如果是正交摄像机, _CameraDepthTexture在[0,1]内线性存储场景深度
#if defined(UNITY_REVERSED_Z)
// 如果platform使用反向深度,要使用1-depth
// https://docs.unity3d.com/Manual/SL-PlatformDifferences.html
sceneRawDepth = 1-sceneRawDepth;
#endif
// 使用简单的lerp插值: lerp(near,far, [0,1] linear depth), 得到观察空间 (view space)的深度信息
float sceneDepthVS = lerp(_ProjectionParams.y, _ProjectionParams.z, sceneRawDepth);
// 投影
float2 viewRayEndPosVS_xy = float2(unity_OrthoParams.xy * (i.screenPos.xy - 0.5) * 2 /* 裁剪空间 */);
// 构建观察空间坐标
float4 vposOrtho = float4(viewRayEndPosVS_xy, -sceneDepthVS, 1);
// 观察空间转世界空间
float3 wposOrtho = mul(UNITY_MATRIX_I_V, vposOrtho).xyz;
//----------------------------------------------------------------------------
// 世界空间转模型空间 (贴花空间)
decalSpaceScenePos = mul(GetWorldToObjectMatrix(), float4(wposOrtho, 1)).xyz;
else
#endif
// 如果是透视相机,LinearEyeDepth将为用户处理一切
// 记住,我们不能使用LinearEyeDepth处理正交相机!
// _ZBufferParams:
// 用于线性化 Z 缓冲区值。x 是 (1-远/近),y 是 (远/近),z 是 (x/远),w 是 (y/远)。
float sceneDepthVS = LinearEyeDepth(sceneRawDepth, _ZBufferParams);
// 在任何空间中,场景深度 = rayStartPos + rayDir * rayLength
// 这里所有的数据在 模型空间 (object space) 或 贴花空间 (decal space)
// 注意,viewRayOS 不是一个单位向量,所以不要规一化它,它是一个方向向量,视图空间z的长度是1
decalSpaceScenePos = i.cameraPosOSAndFogFactor.xyz + i.viewRayOS.xyz * sceneDepthVS;
#if _SupportOrthographicCamera
#endif
// unity 的 cube 的顶点坐标范围是 [-0.5, 0.5,],我们把它转到 [0,1] 的范围,用于映射UV
// 只有你使用 cube 作为 mesh filter 时才能这么干
float2 decalSpaceUV = decalSpaceScenePos.xy + 0.5;
// 剔除逻辑
//===================================================
// 剔除在 cube 以外的像素信息
float shouldClip = 0;
#if _ProjectionAngleDiscardEnable
// 也丢弃 “场景法向不面对贴花投射器方向” 的像素
// 使用 ddx 和 ddy 重建场景法线信息
// ddx 就是右边的像素块的值减去左边像素块的值,而ddy就是下面像素块的值减去上面像素块的值。
// ddx 和 ddy 的结果就是副切线和切线方向,利用右手定理,叉乘 (cross) 后就是法线,最后执行归一化 (normalize) 得到法线单位向量
float3 decalSpaceHardNormal = normalize(cross(ddx(decalSpaceScenePos), ddy(decalSpaceScenePos)));
// 判断是否进行剔除
// 注:decalSpaceHardNormal.z = dot(decalForwardDir, sceneHardNormalDir)
shouldClip = decalSpaceHardNormal.z > _ProjectionAngleDiscardThreshold ? 0 : 1;
#endif
// 执行剔除
// 如果 ZWrite 关闭,在移动设备上 clip() 函数是足够效率的,因为它不会写入深度缓冲,所以GPU渲染管线不会卡住(经过ARM官方人员确认过)
clip(0.5 - abs(decalSpaceScenePos) - shouldClip);
//===================================================
// 贴花UV计算
// _MainTex_ST.xy: 表示uv的tilling
// _MainTex_ST.zw: 表示uv的offset
float2 uv = decalSpaceUV.xy * _MainTex_ST.xy + _MainTex_ST.zw;//Texture tiling & offset
#if _FracUVEnable
// UV裂缝处理
uv = frac(uv);
#endif
// 贴花纹理采样
half4 col = tex2D(_MainTex, uv);
// 与颜色相乘
col *= _Color;
// 透明通道重新映射
col.a = saturate(col.a * _AlphaRemap.x + _AlphaRemap.y);
// 插值
col.rgb *= lerp(1, col.a, _MulAlphaToRGB);
#if _UnityFogEnable
// 混合像素颜色与雾色。你可以选择使用MixFogColor来覆盖雾色
col.rgb = MixFog(col.rgb, i.cameraPosOSAndFogFactor.a);
#endif
return col;
ENDHLSL
首先有一个前提,就是模型必须使用Cube
。
最核心的一步就是通过深度信息还原世界空间坐标,再转模型空间坐标(也就是贴花空间坐标),计算出贴花UV
,对贴花图案采样输出。
其中关于如何通过深度纹理重建世界坐标,大家可以阅读 冯乐乐 写的 《Unity Shader 入门精要》 这本书第13章的13.3.1
小结,她讲得很好,建议大家多看书学习
我们把上面的Shader
保存为UrpDecal.shader
,如下
2、材质球
我们创建一个材质球,重命名为UrpDecal
,并使用刚刚的shader
,如下
设置一下材质球参数,如下
3、创建Cube
创建一个Cube
,重命名为DecalCube
,
把上面的材质球赋给这个Cube
,
4、地面场景
简单搭建一下地面场景,
5、添加Renderer Feature: Decal
点击Universal Render Pipeline Asset_Renderer
,点击Add Renderer Feature
,然后点击Decal
,
如下
6、移动DecalCube,与地面交叉
选中DecalCube
,调整下角度和缩放,
然后移动DecalCube
,让它与地面交叉,此时我们就可以看到想要的贴花效果了
7、运行效果
运行效果如下
三、方案二:使用URP Decal Projector
在默认渲染管线中,我们可以使用Projector
来实现贴花效果,比较常见的是假阴影的实现。
在URP
渲染管线中,我们可以使用URP Decal Projector
。
1、添加Renderer Feature: Decal
跟上面一样,也得添加Decal
,
2、创建Decal Shader Graph
点击菜单Create / Shader Graph / URP / Decal Shader Graph
,如下
双击打开它ShaderGraph
,
连线图如下
3、材质球
我们创建一个材质球并重命名为DecalShaderGraph
,把上面的ShaderGraph
赋给它,如下
设置一下材质球参数
4、空物体挂 URPDecalProjector组件
创建一个空物体,重命名为URPDecalProjector
,
给它挂上URPDecalProjector
组件
4、设置组件参数
设置一下组件参数,如下
5、运行效果
调整一下URPDecalProjector
的角度和缩放,
移动URPDecalProjector
使其与地面交叉,效果如下
我们还可以在ShaderGraph
中给加个UV
旋转,让图案转起来,
效果如下
四、工程源码
以上两种方案放在一起,效果如下,
本文工程源码我已上传到GitCode
,地址:https://gitcode.net/linxinfa/unityurpdecaldemo
感兴趣的同学可自行下载学习
五、完毕
好了,夜深了,收工睡觉。
我是林新发,https://blog.csdn.net/linxinfa
一个在小公司默默奋斗的Unity
开发者,希望可以帮助更多想学Unity
的人,共勉~
以上是关于关于dota里的术语的主要内容,如果未能解决你的问题,请参考以下文章
steam中国版上线在即,未来CSGO与Dota两款游戏将永久锁区