我的世界模組制作教程:資源包

§3 資源包
參考資源包,教程/制作資源包。資源包 (resourcepacks) 可以極大地提升原版模組的美觀程度,因此現(xiàn)在大部分原版模組都需要使用配套的資源包。資源包文件層次為
其中?assets
?的文件結(jié)構(gòu)和?§1.3.1 游戲文件結(jié)構(gòu)中?versions/版本號(hào)/版本號(hào).jar/assets
?的結(jié)構(gòu)是一樣的。
assets
?下所有文件和文件夾需使用小寫(xiě)英文、數(shù)字或-(折線),_(下劃線),.(點(diǎn))來(lái)命名,不可使用大寫(xiě)字母,所有文本文件為使用?UTF-8
?編碼的JSON文件,圖片為?png
?格式。資源包可以為文件夾格式或 zip 格式,發(fā)布時(shí)可將所有內(nèi)容壓縮為一個(gè) zip 文件。壓縮和解壓的時(shí)候,注意文件層次,應(yīng)當(dāng)打開(kāi) zip 文件就可以看到資源包的 pack.mcmeta、pack.png 和 assets 文件夾。穩(wěn)妥的做法是打開(kāi)文件夾->全選->右鍵->發(fā)送到->壓縮文件夾
。文件夾格式的資源包若有錯(cuò)誤文件仍可以加載,但?zip
?格式的會(huì)無(wú)法加載。
游戲內(nèi)選擇選項(xiàng)->資源包
可以列出所有的資源包。在資源包菜單中,加載次序由下至上,因此上方的資源包內(nèi)容會(huì)覆蓋下方的資源包同名內(nèi)容。由于原版模組往往會(huì)修改原版物品自定義模型,因此同時(shí)安裝多個(gè)原版模組的資源包時(shí),很容易出現(xiàn)文件沖突,此時(shí)需要玩家手動(dòng)合并資源包方可使用。具體而言,對(duì)比兩個(gè)資源包的同名文件,將相同的模型文件的?overrides
?合并,其它內(nèi)容選擇需要的留下即可。
若資源包位于?saves/世界名稱(chēng)/resources.zip
,則資源包會(huì)在進(jìn)入存檔時(shí)自動(dòng)加載(最頂層)。
本節(jié)中我們僅對(duì)資源包做簡(jiǎn)單介紹,更詳細(xì)的文件說(shuō)明請(qǐng)參閱資源包 - Minecraft Wiki,最詳細(xì)的官方我的世界百科或論壇紋理資源版相關(guān)內(nèi)容。
紋理包和資源包是不同的東西,目前 Minecraft Java 只有資源包,請(qǐng)不要使用錯(cuò)誤的名稱(chēng)。
§3.1 元信息和圖標(biāo)
Minecraft 通過(guò)文件?pack.mcmeta
?來(lái)識(shí)別資源包,因此該文件是不可或缺的。例如:
其中資源包描述為單個(gè)字符串或一個(gè)原始JSON文本。在資源包菜單頁(yè)面,它會(huì)顯示在資源包名稱(chēng)下方。
原版資源包里的?pack.mcmeta
?文件為
資源包可以包含一個(gè)?pack.png
,它是正方形的圖片,用于在資源包菜單中顯示。
§3.2 命名空間
命名空間 (Namespace) 為玩家自定義的、可操作的空間。使用獨(dú)立的命名空間也有利于解決和他人的沖突。資源包下可以有多個(gè)命名空間,如果不同資源包中有相同的命名空間,則其中相同的文件名內(nèi)容會(huì)根據(jù)加載先后順序被覆蓋。特別地,原版內(nèi)容被保存在?minecraft
?命名空間,想要修改和替換原版的模型紋理只需在你的資源包內(nèi)建立?minecraft
?命名空間和相應(yīng)的同名文件并修改即可。

若命名空間為?minecraft
,則可直接省略?minecraft:
。
建議和數(shù)據(jù)包使用相同的命名空間名。
§3.3 語(yǔ)言文件

語(yǔ)言
Language
語(yǔ)言文件 (Lang) 可以放在任一命名空間下的?lang
?文件夾下。原版的語(yǔ)言文件除了?en_us.json
?位于原版資源包外,其它的語(yǔ)言文件位于資源文件夾下。
語(yǔ)言文件中可以使用樣式代碼來(lái)實(shí)現(xiàn)彩色文字,但我們更建議使用原始JSON文本來(lái)實(shí)現(xiàn),以避免在鐵砧上重命名時(shí)出現(xiàn)多余的字符。建議至少支持簡(jiǎn)體中文(zh_cn
)、繁體中文(zh_tw
)和英文(en_us
)三種語(yǔ)言,建議所有物品、進(jìn)度、游戲提示等文本均采用?translate
?文本。
也可以用此方法修改物品的默認(rèn)名稱(chēng)等內(nèi)容。例如:
則未知的藥水的名稱(chēng)不再是不可合成的藥水
,而是神秘藥水
。
translate
?還有個(gè)有趣但不一定實(shí)用的用法。
則在數(shù)據(jù)包中輸出相應(yīng)文本時(shí),若無(wú)資源包或資源包錯(cuò)誤,則會(huì)顯示?The resourcepack does not Installl correctly or Launch
?以提示玩家資源包未加載。
§3.4 自定義物品模型
由于1.14添加了?CustomModelData
,我們可以擁有幾乎無(wú)窮多的物品模型。為了便于他人整合和解決沖突,建議將?CustomModelData
?的前四位固定以確定模組的獨(dú)有區(qū)段,后四位作為模組不同模型的值,例如?12340000-12349999
?之間。此外,建議?CustomModelData
?不要超過(guò)?16777216
,原因見(jiàn)?custom_model_data 的使用限制。
我們會(huì)給出一個(gè)例子來(lái)說(shuō)明實(shí)現(xiàn)流程。首先在?minecraft
?下的胡蘿卜釣竿物品模型中添加額外的模型 (overrides
),并引用我們自定義的模型。
注意?custom_model_data
?需要按照從小往大的次序,否則會(huì)導(dǎo)致后面的覆蓋前面的。然后創(chuàng)建自定義的模型
最后繪制紋理,并將其保存為?assets/craftingpp/textures/element/red_force_of_fire.png
。這樣我們就設(shè)計(jì)好了這個(gè)物品模型,在?§5 物品設(shè)計(jì)我們將會(huì)說(shuō)明如何使用該模型。
§3.5 模型

Models
模型 (Model) 是一個(gè)描述形狀和指定紋理的JSON文件。模型可以理解成一些可以旋轉(zhuǎn)的長(zhǎng)方體的拼接,每個(gè)長(zhǎng)方體的若干個(gè)面貼上了紋理圖案。長(zhǎng)方體的厚度可以為0,也可以只有若干個(gè)面。
只有?minecraft
?命名空間下特定名稱(chēng)的文件才對(duì)應(yīng)特定的物品/方塊模型,例如?minecraft/models/item/carrot_on_a_stick.json
?表示胡蘿卜釣竿的物品模型,minecraft/models/block/stone.json
?表示石頭的方塊模型。
我們通過(guò)幾個(gè)例子來(lái)理解下模型文件的語(yǔ)法。



更詳細(xì)的語(yǔ)法參考模型 - Minecraft Wiki,最詳細(xì)的官方我的世界百科。
如果我們循著模型?minecraft:item/handheld
?往上,最終會(huì)得到模型?builtin/generated
。這種模型是內(nèi)建的,不能通過(guò)資源包來(lái)修改。
由于?scale
?至多為4,而?from to
?至多為-16
到32
,因此模型最多可以放大至12
倍。想要更大的模型可以通過(guò)分段來(lái)旋轉(zhuǎn)拼接而成,參閱
因?yàn)椴恢腊l(fā)到哪里只好發(fā)過(guò)來(lái)了 也不知道火沒(méi)火星 畢竟我沒(méi)有畫(huà)紋理的朋友。。。
模型在不同位置僅有放縮旋轉(zhuǎn)平移的差別,想要實(shí)現(xiàn)視覺(jué)上的明顯不同,可參閱【1.14】物品頭部/背包/手持顯示不同紋理/模型。
方塊狀態(tài)我們一般不會(huì)用到,而且語(yǔ)法比較簡(jiǎn)單,可直接參閱 wiki,這里不做贅述。
§3.6 紋理

紋理
Textures
紋理 (Texture) 的繪制需要用到諸如 Photoshop 之類(lèi)的畫(huà)圖軟件,具體請(qǐng)參考紋理版或網(wǎng)絡(luò)上的相關(guān)教程。
當(dāng)模型調(diào)用的紋理不存在時(shí),會(huì)顯示紫黑色的紋理。如果模型是正確的,你仍然可以看出正確的模型形狀。
紋理可以是動(dòng)態(tài)的。動(dòng)態(tài)紋理需要高為寬的整數(shù)倍,除非指定了?width
?和?height
。當(dāng)紋理的高度為寬度的?x
?倍時(shí),可以有?x
?幀,分別對(duì)應(yīng)紋理自上而下均勻劃分的?x
?個(gè)塊,從?0
?開(kāi)始。還需要一個(gè)?mcmeta
?文件確定動(dòng)畫(huà),例如?foo.png
?對(duì)應(yīng)
§3.7 音效

音效
Sounds
sounds.json
音效 (Sound) 文件為?assets/命名空間/sounds
?文件夾下的?ogg
?文件,它需要JSON文件?assets/命名空間/sounds.json
?來(lái)調(diào)用。音效文件會(huì)覆蓋之前資源包的同名文件,但?sounds.json
?默認(rèn)會(huì)追加到上一個(gè)資源包中的相應(yīng)內(nèi)容。原版的音效文件和?sounds.json
?并不位于游戲本體資源包,而是位于資源文件夾下。
例:
§3.8 字體

字體
Fonts
【1.13】如何添加圖片?
字體 (Font) 提供了每個(gè)字符對(duì)應(yīng)的資源位置和額外信息,其中?minecraft:default
?給出了默認(rèn)字體的樣式,而?minecraft:alt
?給出了附魔臺(tái)所用的默認(rèn)字體。在原始JSON文本中,若未指定字體則為?minecraft:default
?的字體樣式。
如果?type
?為?space
,則表示該字符表示空格,此時(shí)格式為
我們來(lái)看一個(gè)例子。
我們可以用?\u
?開(kāi)頭來(lái)表示不容易打出的字符,參考Unicode? Character Table,這與直接使用相應(yīng)字符是等價(jià)的。
對(duì)于單純的空格,我們需要使用?space
?字形提供器。
利用這種方式,我們可以做到在成書(shū)、玩家快捷欄上方、聊天區(qū)域、物品名稱(chēng)等地方顯示圖片。利用負(fù)長(zhǎng)度空格和垂直偏移,我們可以將圖片顯示在屏幕的任一位置。
例:我們?cè)谧远x字體中將0~9和:的紋理放大了一倍,并將其移動(dòng)到左上角,使得其顯示比通常位置高。然后利用負(fù)寬度空格將字符位置重新定位到快捷欄左側(cè),顯示第二行文字。
§3.9 著色器
著色器
Shaders
原版著色器指導(dǎo)
幾個(gè)原版著色器示例
原版資源包著色器與動(dòng)畫(huà)研究心得
不會(huì)有人看的深度緩沖著色器分析&用途
核心著色器淺析
著色器 (Shader) 用于描繪如何渲染游戲,包含后處理著色器和核心著色器。
§3.9.1 后處理著色器

后處理著色器會(huì)在游戲已經(jīng)渲染好畫(huà)面以后再起效,它們能夠接受整個(gè)屏幕的像素作為輸入,然后逐像素地輸出。除了一些有限的特例以外,著色器所能接受到的唯一數(shù)據(jù)就是正顯示在屏幕上的內(nèi)容。我們只能通過(guò)在資源包替換?minecraft/shaders/post/文件名.json
?下的下述文件來(lái)修改:
creeper.json
?將在以苦力怕視角旁觀時(shí)啟用;invert.json
?將在以末影人視角旁觀時(shí)啟用;spider.json
?將在以蜘蛛視角旁觀時(shí)啟用;entity_outline.json
?將在屏幕中有具有發(fā)光狀態(tài)效果的實(shí)體時(shí)啟用;transparency.json
?將在玩家啟用了“極佳”圖像品質(zhì)時(shí)啟用。
在后處理著色器渲染管線中,除了玩家自定義的緩沖層,系統(tǒng)還預(yù)設(shè)了
為發(fā)光著色器準(zhǔn)備的、預(yù)先填充好的特殊緩沖層:
minecraft:main
?(沒(méi)有水、方塊實(shí)體和其他一些東西) 和?final
?(純色的實(shí)體,顏色是該實(shí)體所在隊(duì)伍的顏色);為實(shí)體視角著色器準(zhǔn)備的、預(yù)先填充好的特殊緩沖層:
minecraft:main
?(所有內(nèi)容都已渲染完成)。
當(dāng)屏幕渲染完成時(shí),若玩家處于上述5種情形,則會(huì)對(duì)調(diào)用相應(yīng)的后處理著色器渲染管線文件來(lái)依次對(duì)緩沖層進(jìn)行著色器程序操作,并最終返回到緩沖層?minecraft:main
。
我們可以在?minecraft/shaders/program
?文件夾下創(chuàng)建自定義名稱(chēng)的著色器程序文件。其中頂點(diǎn)著色器會(huì)對(duì)每個(gè)頂點(diǎn)起效,將頂點(diǎn)的位置作為輸入,并產(chǎn)生一個(gè)經(jīng)過(guò)變換的位置作為輸出。片段著色器會(huì)對(duì)每個(gè)像素起效,并逐像素產(chǎn)生輸出層。
這里全局變量的?count
?為?values
?數(shù)組的長(zhǎng)度,當(dāng)為浮點(diǎn)數(shù) (float
) 時(shí),實(shí)際為?count
?長(zhǎng)度的浮點(diǎn)數(shù)數(shù)組?float, vec2, vec3, vec4
;int
?類(lèi)似,為?int, ivec3, ivec3, ivec4
;矩陣為?matrix4x4, matrix3x3, matrix2x2
。
頂點(diǎn)著色器和片段著色器程序可參考原版著色器的?vsh, fsh
?文件。著色器中的數(shù)據(jù)類(lèi)型包括標(biāo)量?bool, int, uint, float, double
,向量?bven, iven, uven, ven, dven
,n=2,3,4
?為向量長(zhǎng)度;矩陣?matn, matnxm
?為列優(yōu)先的矩陣,n,m=2,3,4
。構(gòu)建變量時(shí),可以使用其它變量作為其部分。全局變量可以被聲明為
in
,只能被頂點(diǎn)著色器讀取,它自動(dòng)包含了當(dāng)前頂點(diǎn)的 Position(位置)屬性;uniform
,可以被頂點(diǎn)著色器與片段著色器讀取,對(duì)所有的頂點(diǎn)或像素都會(huì)保持恒定不變,它們的值可以通過(guò)后處理 JSON 文件傳入,否則將會(huì)使用在著色器程序 JSON 文件中定義的默認(rèn)值;out
,由頂點(diǎn)著色器聲明并賦值,然后可在片段著色器中被讀取,這些值會(huì)在頂點(diǎn)間插值計(jì)算出來(lái)。
著色器程序中的?main
?函數(shù)會(huì)在該著色器程序被調(diào)用時(shí)執(zhí)行。更多關(guān)于著色器程序的內(nèi)容請(qǐng)點(diǎn)擊上方鏈接來(lái)閱讀。
例:這個(gè)片段著色器會(huì)放大圖像中心圓形區(qū)域圖案。屏幕上左下角像素坐標(biāo)為?(0,0)
,右上角為?(1,1)
。
§3.9.2 核心著色器
所有能在屏幕上看到的東西都是由核心著色器渲染的,核心著色器文件位于?assets/minecraft/shaders/core
?文件夾下。游戲的每個(gè)部分會(huì)調(diào)用相應(yīng)的核心著色器來(lái)渲染。如果我們不希望對(duì)著色器進(jìn)行全局修改,我們可以通過(guò)紋理坐標(biāo)檢測(cè)在渲染什么,然后進(jìn)行相應(yīng)的著色器程序。然而,紋理的 atlas 依賴(lài)于加載的所有資源包,因此一旦添加了紋理,紋理坐標(biāo)將會(huì)發(fā)生改變。更詳細(xì)的內(nèi)容請(qǐng)點(diǎn)擊上方鏈接來(lái)閱讀。
§3.10 文本

文本
Texts
玩家首次進(jìn)入末地的主世界返回傳送門(mén)時(shí),會(huì)播放終末之詩(shī)和制作人員名單。文本PLAYERNAME將會(huì)被玩家名稱(chēng)代替。我們可以修改之以顯示模組的一些內(nèi)容。文件?splashes.txt
?中每一行表示一個(gè)單獨(dú)的閃爍標(biāo)語(yǔ),可以使用樣式代碼。
1.16以及更早版本可使用樣式代碼,以及使用?[C]
?來(lái)表示居中,且這些版本制作人員名單是txt格式。