[暴躁教學3]展示實體與你:數(shù)據(jù)包的究極加強
前言
觀前提示:本教程是零基礎傻瓜式教程,會做資源包的/會寫點指令的/會做點模型的建議自行找別的高級教程自學。
另外用BlockBuster的就不用看了。不過基巖版倒是真能用,就是資源包什么的麻煩點——雖然可拓展性更強。

歡迎回到這個我也不知道到底多久一更新的奇怪教程。老規(guī)矩,這是上一期:

在上一期——那時候終曲告誡還在拍攝中——我大概說明了一下1.19制作MCARG(實際上是MC短片)的可選方案。
在那時,Taterzens+Replay的搭配似乎已經(jīng)能夠讓我們小小地爆一下BlockBuster的金幣。然而,奈何BB終究有一個恐怖的功能令高版本玩家們望塵莫及:

自定義模型。
簡單來說,BB在不需要其他模組的情況下,允許玩家自己導入各種亂七八糟的模型,并控制它們的運動——在曾經(jīng)的1.19,若要實現(xiàn)這種效果,唯一的辦法似乎就是給盔甲架頭上套個帶CustomModelData的玩意然后想辦法讓他動兩下。
這么做可行嗎?確實可行,但一是用指令控制盔甲架的移動實在太麻煩,二是但凡你的模型大一點就沒轍(何況只能導入JAVA版的JSON模型,雖然到現(xiàn)在也是這樣)。
也因此高一點技術力的MC動畫都會選擇BB起步C4D封頂?shù)闹谱鞣绞健?/p>
直到1.20的更新。
數(shù)據(jù)包的史詩級加強
想象如何在MC中實現(xiàn)以下畫面:
一架帶有航行燈J20垂直起飛,噴射出大量煙霧,緩緩上升后收起起落架,水平飛行后以15度仰角向上飛行;
50架無人機,以不同的上升速率緩緩上升;
坦克與步兵在地面共同行進,要求坦克炮塔需要旋轉;
克蘇魯畫風的生物,要求觸手會轉;
一架武 裝 直 升 機的旋翼開始不斷旋轉,由慢到快,最后機身脫離地面開始上升;
B-2轟炸機在飛行中打開彈艙,制導炸彈向下墜落一段時間,然后啟動發(fā)動機噴射煙霧以更高的加速度向前飛行;
一架客機在空中發(fā)生劇烈爆炸,產(chǎn)生大量粒子效果,碎片分成幾塊拖著煙霧下墜;
直徑幾百格甚至上千格的巨型BOSS,頭頂有煙霧云在旋轉;
一整個航母戰(zhàn)斗群在海面上航行,激起浪花,飛機從上方起飛,驅逐艦上的1130近防炮旋轉并搜尋目標;
……
我現(xiàn)在告訴你:1.20原版就可以實現(xiàn)以上所有畫面,不嫌麻煩你連Replay都不用裝。
而實現(xiàn)這一切,都拜它所賜——
minecraft:item_display
詳解
第一部分:CustomModelData
簡單來說,item_display(物品展示實體)是一個極其牛b的東西,在為它賦予如下NBT時,物品展示實體可以自由展示任何CustomModelData(下文簡稱CMD)的模型:
其中的X是介于±16777215之間的整數(shù),多了會溢出。
這串NBT描述了一個ID為diamond,也就是鉆石的物品(其實選什么都可以),數(shù)量為1,而他的物品標簽謂詞中包含了這么一個值:CMD=X。
在你做好資源包后,游戲就會用資源包中指定的模型替換CMD=X的物品模型。這么說可能有些迷惑,那我實際演示一下:

ok,找到儲存物品模型的文件夾models/item了嗎?下面打開我們要找的diamond.json:
正常情況下,你看到的應該就是這個。
"parent"代表這個模型是從哪個模型繼承來的,如果沒其他情況他就會使用parent這個模型;"textures"則定義了這個模型的材質。我們看到這個模型的parent是“item/generated”,這個意思大概就是鉆石的模型是由鉆石的材質自己生成(generate)的,大概就是這樣:

略微偏題了,現(xiàn)在我們回來講怎么讓鉆石顯示不同的模型。
格式大概是這樣:
一臉懵逼?我們細看一下。
首先最開始的部分就是未經(jīng)修改的diamond.json,而之后的"overrides"則制定了“在什么情況下用什么模型替換原模型”,而下面的“predicate”就是條件。
的意思就是:“在custom_model_data為1的情況下,將鉆石的模型顯示為model_1.json”。
根據(jù)上面那個模板,你可以一直往下寫下去,具體可以參考WIKI。

第二部分:物品展示實體
我們先貼指令:
這一指令會在玩家所在處生成一個物品展示實體。你可以直接改變它的CustomModelData以便于直接顯示不同模型,但我們先從基礎的開始。你應該會看見這個:

目前為止,這玩意似乎像是盔甲架手持物品的Pro版本。確實,它沒有碰撞箱,不產(chǎn)生更新,幾乎不會造成任何性能負擔。那么它還有什么神奇的地方嗎?
把下面這段指令輸?shù)矫罘綁K里,然后啟動它感受一下就知道這玩意潛力有多大了。
發(fā)生了什么?這玩意為什么能平滑地變 大 變 高?現(xiàn)在我們分析一下這段指令:
/data 是用于修改或查詢物品NBT數(shù)據(jù)的指令。/data merge entity 可以將一段NBT與某個實體的NBT合并并覆蓋,后面的選擇器則是選擇類型為物品展示實體(type=XXX)、數(shù)量限制為1(limit=1),并且距離最近(sort=nearest)。
至于后面的一大串NBT則是展示實體專有的“插值變換”屬性——他們是這么定義的:
transformation:包含后面所有,聲明整個插值過程。
translation:在XYZ軸上的位置變化,即平移。格式為[Xf, Yf, Zf],其中f代表浮點數(shù),XYZ代表展示實體在XYZ三軸上的位移。
scale:在XYZ軸上的大小變化,即縮放。和上面差不多,[1.0f, 1.0f, 1.0f]即原大小,XYZ代表每個軸上的縮放格數(shù)。
left_rotation或right_rotation:比較難的地方來了:旋轉變換。這里用的是軸角寫法,angle是弧度值,最大6.28,例如90度就是1/2π=1.57。后面的axis定義旋轉軸,依然是XYZ形式,如[0.0f, 0.0f, 1.0f]代表繞Z軸旋轉。旋轉變換還有一種四元數(shù)寫法,但太特么麻煩了所以此處略過。
然而,超過3.14的angle值將會被自動計算為沿反方向旋轉的angle值——例如,4將被自動換算為3.14-4=0.86。因此,只設置其中一個最多讓實體旋轉半圈(180°=π)。但你可以同時將兩個angle值設置為3.14,由此讓實體旋轉一圈(360°=2π)。
至于為什么有兩個旋轉變換參數(shù),我也不知道,反正不重要。
start_interpolation:動畫開始的時間,0就是立刻開始,100就是延遲100刻開始。
interpolation_duration:動畫持續(xù)時間,0就是瞬間變化,100就是在100內完成變化。
關于插值變換,必須要說明一些有些反直覺的事實:
在你敲下命令的一瞬間,實體的變換值就已經(jīng)設置完成,例如translation從[0f, 0f, 0f]到[1f, 0f, 0f],這個值是瞬間完成變換的,中間并不存在[0.5f, 0f, 0f]這樣的“過程”。
插值變換只會在渲染上變換,實體真正的XYZ坐標是不變的。translation的那個坐標只是它“看起來”移動了多少,不信可以開F3+B。
但無論如何,它仍然提供了一種導入任意大小的自定義模型并使其運動的方式(scale和translation的大小沒有上限?。f到如何制作MC中的自定義模型,我們最終還是繞不開一款著名的建模軟件:BlockBench。

第三部分:簡易建模教程
BlockBench的介紹這里略過,你只需要知道BB(不是BlockBuster!)可以做JAVA版、基巖版、模組格式甚至其它游戲的體素風格模型就可以。我們只介紹它的JAVA版模型制作。
JAVA版模型本質上是描述一堆方塊堆起來的JSON文件,它有幾個限制:
任何方塊在一個軸上旋轉22.5°的倍數(shù)。例如,你不能在X軸上把一個方塊旋轉30°,或者在XY兩個軸上旋轉45°。
模型體積不能大于3x3x3,默認顯示的縮放倍數(shù)無法超過4。
很容易發(fā)生Z-fighting。
無法內置動畫(我們在后面會想辦法解決這個問題)。
不過,這些限制也算不了什么。安裝(BB官網(wǎng)是很慢的,建議找個鏡像)并打開BB后,你將看到這個界面。


文件名建議用小寫字母加下劃線,父級模型不用填,后面用默認的就行。

添加地一個方塊后,你可以試試自己上手。BB是個相當簡單好用的建模軟件,簡單到我第一次用就能做出這玩意。

可觀看此教程:

現(xiàn)在假設你已經(jīng)整了一個自己的模型,那么是時候開啟第四部分——數(shù)據(jù)包制作了。

第四部分:數(shù)據(jù)包
回到我們的游戲。把BB的模型(.json,不是.bbmodel!)導出到models/item,按照第一部分的教程設置好CustomModelData,然后刷新資源包。用如下命令修改CMD:
一切順利的話你就能看見你做的模型出現(xiàn)在MC里了。
順便說下,模型的材質在\assets\minecraft\textures\block或者\item里面,選哪個都問題不大。
其實模型也可以調用models\block中的模型(
現(xiàn)在使用/tag命令給你的展示實體分類,以后就可以精確選擇了:
他將為離你最近的一個展示實體添加標簽tag1。在之后修改實體的插值只需要
即可。
現(xiàn)在,按照差不多這樣的格式(更詳細的教程自己找)創(chuàng)建一個數(shù)據(jù)包:

如果你看過數(shù)據(jù)包教程,你就會知道tick.json定義了每刻執(zhí)行的MCFUNCTION函數(shù)。換句話說,這些命令都會不斷地執(zhí)行。
那么使用數(shù)據(jù)包制作展示實體動畫的思路就很明確了:每刻使計分板timeline增加1,并檢測timeline的值,若達到X則執(zhí)行對應的插值變換。相同地,我們也能生成粒子效果之類的特效。
實操步驟如下:
首先創(chuàng)建loop.mcfunction,用于每刻執(zhí)行函數(shù):
tickloop.mcfunction,用于增加timeline的值:
stop.mcfunction,用于停止動畫執(zhí)行:
start.mcfunction,用于開始動畫:
animation.mcfunction,定義整個動畫時間軸:
上面這個只是提供一個參考,即:在timeline達到某個值時,要求tag為“展示實體tag”的展示實體修改自身的transformation。你可以把這段復制很多行,然后修改游戲刻條件,例如交疊理論PV最后的那段B2墜毀畫面(部分):
我個人十分建議你在animation.mcfunction的開頭把被動畫影響的展示實體的transformation值重新寫一遍,也就是開頭將動畫“恢復到初始狀態(tài)”。
當然,tick.json也需要定義。
最終的效果應該是:執(zhí)行/function namespace:start后,動畫開始自行播放;執(zhí)行/function namespace:stop后,動畫停止播放。
盡管JAVA版模型無法設置動畫,你可以通過將許多個模型設置相同的tag,然后令其中一些模型在“相對運動”的基礎上自行運動。如一開始說的直升機,你可以將旋翼和機身分別導出,將他們的相對位置設置好,并讓他們以相同的位移上升,但只給旋翼加上旋轉動畫。投彈、炮塔旋轉之類的動畫也是如此。
由于實體的translation值旋轉并不會影響它的實際坐標,你可能會遇見為實體添加粒子效果的時候,實體在移動而粒子效果無法移動的現(xiàn)象。一種解決方案是在實體的移動路線上每隔一段時間就釋放粒子。你也可以嘗試如生物綁定之類的方法。

第五部分:尾聲
這次的教程顯然比較復雜,但合理地運用物品展示實體確實能做出驚人的效果。在此我推薦幾個教程:
展示實體/數(shù)據(jù)包

資源包/BlockBench

/execute與/data命令詳解

當然,最后,也是最重要的網(wǎng)站:
在任何情況下,查wiki都能解決你95%的疑惑!而且wiki里是有技術向教程的!
(熱心提示:這個鏈接指向MC維基在BWIKI的鏡像站,速度非??欤?/p>
END。