|
【研究】对SetUnitPosition和SetX,SetY的说明
老狼当初说SetUnitPosition相对SetUnitX,SetUnitY效率低下,今天打算把以前写的SetSetUnitPosition替换掉。
但忽然发现以前写的冲锋出了神奇的BUG。
[codes=jass]
function Assault takes nothing returns nothing
local timer t = GetExpiredTimer()
local unit ua =GetHandleUnit(t,"Assault_ua")
local integer i = GetHandleInt(t,"Assault_i")
local real ang = GetUnitFacing(ua)
local real UnitLocX = GetUnitX(ua)
local real UnitLocY = GetUnitY(ua)
local real teplocX
local real teplocY
local effect e
set i = i + 1
call SetHandleInt(t,"Assault_i",i)
if (i < 30 ) and (IsUnitAliveBJ(ua)==true)then
set teplocX = UnitLocX+ 2 * i*Cos(ang*bj_DEGTORAD)
set teplocY = UnitLocY+ 2 * i*Sin(ang*bj_DEGTORAD)
if ( MoveAble(teplocX,teplocY,55) == true ) then
call SetUnitXY(ua,teplocX,teplocY)//一个函数,相当于SetFacing,SetX,SetY
call SetUnitAnimationByIndex( ua, 2 )
set e = AddSpecialEffect("Abilities\\Spells\\NightElf\\Blink\\BlinkTarget.mdl", teplocX, teplocY)
call DestroyEffect( e )
set e = null
endif
else
call EndTimer(t)
call SetUnitAnimationByIndex(ua,7)
call SetUnitPathing( ua, true )
call UnitRemoveAbility( ua, 'A01P' )
endif
endfunction
function Assault_Actions takes unit ua returns nothing
local timer t = CreateTimer()
local integer lv = GetUnitAbilityLevel(ua, 'A01G')
call SetUnitAnimationByIndex( ua, 2 )
call SetUnitPathing( ua, false )
call UnitAddAbility( ua, 'A01P' )
call SetUnitAbilityLevel( ua, 'A01P', lv )
call SetHandleHandle(t,"Assault_ua",ua)
call SetHandleInt(t,"Assault_i",1)
call TimerStart(t,0.05,true,function Assault)
set ua = null
set t = null
endfunction
[/codes]
然后发现神奇的结果是单位会在冲锋的过程中转动身体,于是我增加了角度判定,但单位会在接受命令时迅速被打断动作,视觉效果非常差。
个人猜测SetUnitPosition对单位发布命令有一定延迟作用,从而快速移动导致的问题。
这个命令就是SetUnitPosition拥有的打断技能的效果。
从以上可以看出,
只要是单纯的模拟效果类技能(比如模拟球体围绕单位旋转),这样不需要单位释放命令的技能都可以使用效率较高的SetUnitX,SetUnitY
如果是冲锋类没有禁止玩家控制的话,那么最好使用SetUnitPosition视觉效果比较好。
应该不是什么新鲜东西,不过似乎没人写下来过,给不知道的人看看。 |
评分
-
查看全部评分
|