最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

談?wù)凪C戰(zhàn)斗(四):移速

2022-08-26 13:34 作者:道家深湖  | 我要投稿

關(guān)鍵結(jié)論:

  1. 設(shè)某常規(guī)生物,在常規(guī)地面上的移動(dòng)速度屬性(movement_speed)為SPD,單位格每刻,則有:

    1. SPD值小于1時(shí),則生物的實(shí)際速度為v%3D%5Cfrac%7B490%7D%7B227%7D%20%5Ccdot%20SPD%5E2%20%5Capprox%202.16%20%5Ccdot%20%20SPD%5E2%20,

    2. SPD值大于等于1時(shí),則沒(méi)有平方,改為v%5Capprox%202.16%5Ccdot%20SPD

  2. 代碼里的motionX、motionY、motionZ等變量并不是實(shí)際速度在對(duì)應(yīng)方向的分量,而是實(shí)際速度乘了磨損系數(shù)后的一個(gè)沒(méi)什么意義的值。

  3. 常規(guī)地面是指“slippery”值為0.6的方塊,該值以后簡(jiǎn)稱(chēng)光滑系數(shù)。不在此列的方塊包括冰與浮冰(0.98)、粘液塊(0.8)??紤]方塊摩擦系數(shù)的公式較為復(fù)雜,將在過(guò)程中給出。

  4. 常規(guī)生物是指使用了默認(rèn)的MoveHelper的步行生物,史萊姆、惱鬼、魷魚(yú)等移動(dòng)方式特殊的生物除外。

  5. 以上速度指的是加速完畢、到達(dá)穩(wěn)態(tài)的情況,生物需要一個(gè)起步和加速的過(guò)程,詳細(xì)公式后面給出。在特殊的光滑系數(shù)下,生物可以無(wú)限加速,沒(méi)有速度上限;或者根本跑不起來(lái)。

  6. 以上速度公式不含生物在液體中、浮空、陷入蜘蛛網(wǎng)等特殊效應(yīng),但任何直接影響速度屬性的效果(如藥水、小僵尸移速加成)都適用。

wiki當(dāng)下的解釋?zhuān)梢哉f(shuō)錯(cuò)的離譜

好,接下來(lái)給出詳細(xì)的分析。需要注意的是,我們需要優(yōu)先探尋最普遍、最基本的規(guī)律,因此要擱置很多特例,如史萊姆等不走尋常路的,就留待以后分析,不然根本看不完了。

如果你看wiki的話(huà),不僅公式是錯(cuò)的,格/秒的數(shù)據(jù)是錯(cuò)的(wiki上僵尸是9.9m/s,想想上學(xué)時(shí)自己跑50m、100m的速度就知道有多離譜),而且也沒(méi)有把特殊的生物分開(kāi)看待。要知道,生物進(jìn)水之后還會(huì)受到SWIM_SPEED影響呢,和陸地生物混為一談也太過(guò)分了。等我全弄完了就去修改。

多數(shù)的AI生物運(yùn)動(dòng)是由多個(gè)模塊綜合驅(qū)動(dòng)的,大體上可以分為四個(gè):

  1. 負(fù)責(zé)選擇攻擊目標(biāo)的targetTask;

  2. 負(fù)責(zé)執(zhí)行攻擊、前往目標(biāo)等行為的task。比如魷魚(yú)作為水生動(dòng)物,就有一個(gè)很特別的行動(dòng)AI,EntitySquid.AIMoveRandom;

  3. 落實(shí)移動(dòng)或者花式移動(dòng)的EntityMoveHelper,以及PathNavigate。惱鬼、惡魂、守衛(wèi)者、兔子、史萊姆有自己的特殊Helper;

  4. 實(shí)體自己update里的邏輯,最后以Entity::move中調(diào)用Entity::resetPositionToBB()收尾。對(duì),MC是先改包圍盒,然后根據(jù)包圍盒反推位置來(lái)移動(dòng)的,想不到吧。

targetTask只負(fù)責(zé)選定攻擊目標(biāo),不執(zhí)行具體操作。比如僵尸看到玩家,前來(lái)追殺;其中僵尸心里選擇目標(biāo)就是靠targetTask里的EntityAINearestAttackableTarget做到的,實(shí)際跑起來(lái)追殺則是后面的事。

僵尸能實(shí)際跑起來(lái)追殺它的攻擊目標(biāo),靠的是EntityAIZombieAttack,這個(gè)ZombieAttack其實(shí)就是繼承自EntityAIAttackMelee,并且加了個(gè)抬手動(dòng)畫(huà)而已。這個(gè)Melee在爬行者、末影人、末影螨、鐵傀儡、蠹蟲(chóng)、衛(wèi)道士、狼里都用到了,是最常見(jiàn)的一種怪物攻擊AI:接近目標(biāo),并近戰(zhàn)攻擊。蜘蛛和北極熊有這個(gè)AI的其他變種,先擱置。

如果你去觀察EntityAIAttackMelee的構(gòu)造函數(shù)調(diào)用,你會(huì)發(fā)現(xiàn)這里面可以傳一個(gè)速度參數(shù),它的作用是與移速屬性值相乘。比如你填0.5,就等于怪物出擊時(shí)移速屬性折半。實(shí)際上,一般這里填的都是1,畢竟,一般你想讓一個(gè)怪跑的快點(diǎn)或者慢點(diǎn)的時(shí)候,你都是直接去調(diào)它的屬性值,沒(méi)必要分兩個(gè)地方各填寫(xiě)一個(gè)因子。僵尸這里的系數(shù)是1,所以也很適合用來(lái)分析。

那么這個(gè)近戰(zhàn)攻擊,手有多長(zhǎng)?

哈哈,不是一個(gè)常數(shù),與自己和對(duì)方的包圍盒尺寸都有關(guān),這個(gè)計(jì)算公式連量綱都很混亂,總之是略長(zhǎng)于自己包圍盒邊長(zhǎng)的兩倍。對(duì)于僵尸這個(gè)width為0.6的生物來(lái)說(shuō),近戰(zhàn)范圍就是1.2格多一點(diǎn)。

包圍盒是方形且軸對(duì)齊的,但是算距離的時(shí)候卻是兩點(diǎn)直接拉一條線(xiàn)過(guò)去看距離的,忽略了包圍盒的形狀和角度,所以僵尸實(shí)際上可觸及的范圍,只分析XZ平面的話(huà),那就是個(gè)圓形。

我們看Melee的shouldExecute部分,第61和70行,都有一個(gè)關(guān)鍵的接口調(diào)用:

也就是說(shuō),AI對(duì)象本身并不是每一個(gè)Tick,都在算到底這一步子該邁到哪的,它只會(huì)通知尋路類(lèi)去處理這事。他不精確到步,只精確到宏觀目標(biāo)。

我們的下一個(gè)階段就登場(chǎng)啦,實(shí)體隱藏的小寵物,PathNavigate和EntityMoveHelper。

看看EntityLiving的構(gòu)造函數(shù)吧。多數(shù)生物都會(huì)自己構(gòu)建一個(gè)PathNavigateGround對(duì)象留著用,準(zhǔn)備在地面上走來(lái)走去,守衛(wèi)者、蜘蛛和鸚鵡有他們特殊的尋路對(duì)象構(gòu)造,就不管了。還有一些棄療的生物連這個(gè)navigator都不用,就直接在AI和update里強(qiáng)行移動(dòng),比如魷魚(yú),我們也先不管他。

LivingBase的onLivingUpdate里會(huì)調(diào)用updateEntityActionState?,進(jìn)一步在EntityLiving里調(diào)用helper的onUpdateMoveHelper??傊@個(gè)東西也是在tick里實(shí)時(shí)更新的主。這個(gè)tick只維護(hù)基本的狀態(tài),實(shí)際的移動(dòng)執(zhí)行在另一個(gè)地方。


我們看EntityLivingBase::onLivingUpdate:2616,這里直接調(diào)用了一個(gè)實(shí)體的travel,這里也就是最復(fù)雜的加減速對(duì)決發(fā)生之處了。


那個(gè)f6,我們可以很明顯地看出,他是0.91倍的方塊光滑系數(shù)。物品實(shí)體等不是0.91,但我們先不管。至于為什么是0.91不是0.92,我推測(cè)只是mojang當(dāng)時(shí)隨便填了一個(gè)覺(jué)得還行的數(shù)值。

這getSlipperiness獲得到的是多少呢?0.6。絕大多數(shù)方塊都是這數(shù)值。冰塊0.98,粘液塊0.8,也就是這倆方塊更滑。更滑的方塊移動(dòng)速度更快還是慢呢?我們后面算完就知道了。

f7很詭異,他給出了0.16277136這么一個(gè)莫名其妙的數(shù)字,但你實(shí)際推演過(guò)就會(huì)發(fā)現(xiàn),當(dāng)方塊光滑系數(shù)為0.6時(shí),f7的計(jì)算值約為1,這個(gè)數(shù)值實(shí)際上是(0.91x0.6)的立方。也就是說(shuō),對(duì)于多數(shù)方塊而言,f7這個(gè)乘數(shù)的影響可以直接忽略。當(dāng)方塊光滑系數(shù)變?yōu)?.6μ的時(shí)候,把f7當(dāng)做μ的負(fù)三次方即可。

getAIMoveSpeed返回什么呢?多數(shù)情況,它就直接等于移動(dòng)速度的屬性值。

好了,歸了包堆算這么一大圈,f8在多數(shù)情況下就等于移速本身。

我們接著看。接著調(diào)用了一個(gè)moveRelative,這也是最熱鬧的地方了。我們考慮最簡(jiǎn)單的情況,實(shí)體朝正前方以沖鋒,速度系數(shù)1,那么此時(shí)strafe、vertical都為0,forward等于移速屬性SPD*0.98,f8等于SPDμ^-3,在μ為1的時(shí)候就傳了倆SPD進(jìn)去。

你說(shuō)這0.98哪來(lái)的?

好,解釋了哪來(lái)的0.98,再繼續(xù)看流程。

你看到這可能要說(shuō)了,這motionXYZ不就是速度分量嗎?是,這時(shí)候確實(shí)是,但后面就不是了。先別急,看看這moveRelative的實(shí)現(xiàn)吧。

我給他簡(jiǎn)化一下。

前面我們說(shuō)了,foward是SPD*0.98,strafe和up是0,那么f一開(kāi)始就等于SPD*0.98。

step2里,如果SPD*0.98小于1,那么step1就會(huì)使得除以f 變成除以1,即忽略這一步驟,f直接變成friction;motion增加forward * friction = SPD * SPD *?μ^-3*0.98。多數(shù)情況下μ=1,那么這里就是直接增加了SPD * SPD*0.98。

如果大于1的話(huà),就會(huì)變成friction / SPD,直接等于μ^-3,motion增加的就是forward,也就是SPD??*?μ^-3*0.98。 多數(shù)情況下μ=1,那么就是增加了SPD*0.98。一般來(lái)說(shuō),我們不會(huì)去太卡這個(gè)臨界區(qū),可以簡(jiǎn)單地把0.98SPD>1的判據(jù)改為SPD>1,誤差不大。


this.move和這個(gè)moveRelative之間還算了個(gè)f6=0.6μ,這f6干嘛的呢?得在執(zhí)行完了move之后你才看到。

好么,這都move移動(dòng)完了,您還跟這改motion執(zhí)行衰減呢,有意思么?您就不能把這個(gè)放到下一幀的開(kāi)頭么,非得把motion放在一個(gè)不當(dāng)不正的位置,與實(shí)際速度脫節(jié)?改完了還在下一幀里影響moveRelative,作為下一次運(yùn)動(dòng)速度的初始值。

哦對(duì),還有這:

這是咱們一開(kāi)始看到的0.98的來(lái)源。您在travel之前先給moveForward做了個(gè)98%衰減,以至于前面我們分析時(shí)認(rèn)為moveForward=SPD的假設(shè)也不精確了。我真是……

被Mojang氣暈

我該不會(huì)是地球上第一個(gè)理清楚這玩意的人吧?

談?wù)凪C戰(zhàn)斗(四):移速的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
井陉县| 鄂州市| 大田县| 从江县| 兰坪| 柞水县| 贺兰县| 尚志市| 龙口市| 丰顺县| 宿松县| 合阳县| 沙河市| 洛隆县| 凌云县| 南安市| 抚州市| 高唐县| 花莲市| 大新县| 永清县| 汕头市| 大丰市| 石楼县| 玉林市| 手机| 富锦市| 滨海县| 赤峰市| 九寨沟县| 民县| 特克斯县| 桐柏县| 望奎县| 尤溪县| 高邮市| 嘉荫县| 舟曲县| 灵石县| 杨浦区| 福泉市|