這篇文章教你如何畫皮膚,以及製作4D皮膚模型。

皮膚(skin)的正式名稱叫做「外觀」,多個外觀組成的檔案就叫「外觀包」(skin pack)。

不管是4D還是5D皮膚,Minecraft基岩版都允許玩家自訂模型,除了像市集一樣能夠在方塊人身上增添配件外,也可以修改披風、使用更進階的.obj模型,讓玩家完全變成另一個遊戲的樣子,例如MMD的角色。

這篇文章結尾可以下載我製作的皮膚包範本,裡面包含一個普通模型(只改skin)、一個4D模型+皮膚,還有一個從MMD移植來的模型(請勿用於商業用途,並請註明作者)。

1. 了解Minecraft皮膚的格式#確保你已經知道怎麼在基岩版中更改皮膚。

Minecraft內建支援的是64x64像素解析度的png檔案,也就是所謂雙層皮膚,能製作帽子、外套、袖口。

使用圖片編輯器開啟檔案可以查看圖片的解析度。

因此,檔案格式或像素大小不對,Minecraft都會拒絕匯入,或者顯示錯誤。此外,如果玩家自己做模型,則皮膚的解析度就沒有限制。

以上是預設的Steve皮膚,該檔案就像是摺紙的立方體展開圖(引用自Minecraft Wiki):

看起來有點抽象,所以採用顯示玩家3D模型,並能直接在上面畫畫的軟體會比較直觀,在這個教學中,我會使用Blockbench做示範。

2. 使用Blockbench畫皮膚#Blockbench這個軟體能在網頁上直接使用,或者安裝到電腦。

你可以直接畫一個新的皮膚,或匯入現有的皮膚並進行編輯。

點選新建皮膚

選取要使用Steve還是Alex的模型,分辨率設64x64 (或按照你匯入的皮膚解析度做選擇)。

「材質」可以按這裡下載Steve的檔案,然後以此為基礎進行修改。Steve皮膚的解析度是64x64。

取消勾選「動作」,勾選「貼圖圖層」。

可以開始編輯皮膚了。右邊會有模型的部位,預設來說外層皮膚都是關閉的。點一下眼睛的圖案可以開關顯示,例如「帽子」的部位。

可善用這些功能來暫時關閉某個部位,例如畫左腳內側時暫時關閉顯示右腳。

4.按一下網格的圖案可顯示網格

皮膚外側的就是帽子、袖口部分的材質,會比玩家身體部分的材質大上一圈。點選「大綱」下面的「切換皮膚圖層」可關閉顯示。

使用筆刷開始繪製,右邊有調色盤。

此外也能夠使用油漆桶快速填充,和使用圖形工具畫圓形。

畫好皮膚後,點選左下角的皮膚,右鍵儲存檔案。

P.S. Blockbench還可按左上角「文件」,保存項目,儲存目前的專案。

這樣就完成了,匯入至Minecraft中試試!

3. 製作皮膚包#如果皮膚只有一個,則不需要使用到皮膚包。不過,自己做一個皮膚包,能像商城購買的皮膚包一樣能顯示一組皮膚,便於在遊戲中快速切換,而且可以自訂玩家模型。

假設我們現在已經擁有兩個不同的皮膚,我們要把他做成一個皮膚包。

註解: 以下步驟也可改用bridge.製作,操作上比較快。

在com.mojang的skin_packs/裡新建一個資料夾,新增manifest.json,輸入以下內容:(兩個uuid的數值要不一樣,按這裡取得UUID)

{

"format_version": 2,

"header": {

"name": "pack.name",

"description": "pack.description",

"min_engine_version": [

1,

17,

0

],

"uuid": "9c2e8104-71f9-442e-92f0-52dcf4a43338",

"version": [

1,

0,

0

]

},

"modules": [

{

"description": "自製皮膚包範本",

"type": "skin_pack",

"uuid": "541c25fb-f836-4460-975c-f08732c8eef1",

"version": [

1,

0,

0

]

}

]

}

再來新增記載這個皮膚包有哪些皮膚的skins.json,裡面輸入二個:{

"geometry": "skinpacks/skins.json",

"skins": [

//第一個皮膚

{

"localization_name": "skin1",

//皮膚ID

"geometry": "geometry.humanoid.custom",

//皮膚使用的模型

"texture": "skin1.png",

//皮膚材質名稱

"type": "free"

},

//第二個皮膚

{

"localization_name": "skin2",

"geometry": "geometry.humanoid.custom",

"texture": "skin2.png",

"type": "free"

}

],

//皮膚包名稱

"serialize_name": "CustomSkinPack",

"localization_name": "CustomSkinPack"

}

請注意texture的部分,這代表的是要使用的皮膚檔案名稱。

新建一個texts資料夾,裡面新增"zh_TW.lang",這個檔案代表中文語言。輸入:

pack.name=普通皮膚包範本

pack.description=這是自製皮膚包 by Twitter@Ivon852

skinpack.CustomSkinPack=自製皮膚包

skin.CustomSkinPack.skin1=第一個皮膚

skin.CustomSkinPack.skin2=第二個皮膚

將皮膚檔案放進去,注意必須跟texture裡面所寫的,檔案名稱要一致。可放入一張圖片,取名為pack_icon.png,當作皮膚包的圖示。

重新開啟Minecraft,應該就會在「已擁有」看到你所製作的皮膚包。

皮膚包要打包給人安裝的話,則將資料夾壓縮成.zip,然後副檔名改成.mcpack。就能像安裝Add-On一樣匯入。可以在本文結尾下載這個普通皮膚包範本。

註解:如果要自訂披風,你不是從這裡改,而是要改資源包,請往下看。

4. 使用Blockbench建模+製作4D皮膚#前面說到,玩家不只改皮膚,也能自訂模型。

使用Blockbench建模,修改玩家的造型。

以下這個範例,我在預設的玩家模型上,讓玩家的雙手有額外裝備。

先用Blockbench建立一個皮膚,然後按左上角「文件」,轉換項目,選擇基岩版模型。

接著按下「文件」,項目,修改模型ID。

圖中輸入有錯,文件名和模型ID應該全部都叫做"beefist"

再對左下角的材質右鍵,按「調整大小」成128x128,這樣才有空間畫額外材質。

Blockbench切換到編輯模式,點選左右手的cube,右鍵各複製一個,然後按右邊的尺寸,膨脹。

按左邊的UV,移動UV到沒有像素的材質部位。然後開始畫材質。

按左上角文件,導出,導出基岩版幾何體,取名beefist.geo.json

將畫好的皮膚也匯出,取名beefist.png

接下來,實現4D皮膚有二種方法,選擇其中一個。不管你採用哪種方法,本文結尾都可以下載到各自的範本檔案。

資源包方法#這個方法可以順便改披風。

首先先建模,然後:

選擇「整個取代掉」

或是只給玩家模型添加「配件」

但請注意,使用「整個取代掉」的方法,必須把你安裝的皮膚換回預設的史蒂夫,否則不會生效。

如果使用「只添加配件」方法,則你可以繼續使用自己的皮膚,如圖。

將建模匯出的模型放到資源包/resource_packs/models/entity/

材質則是放到/textures/entity/

接下來選擇其中一種方法來達成4D效果。

整個取代掉

這個方法比較簡單,直接修改玩家預設使用的模型。

缺點是無法隨便換skin。適合用於把玩家整個身體都改掉的模型,甚至能讓頭不見。

從原版範本資源包複製/entity/player.json到自己的資源包,進行如下修改:

{

"format_version": "1.10.0",

"minecraft:client_entity": {

"description": {

"identifier": "minecraft:player",

"materials": {

"default": "entity_alphatest",

"cape": "entity_alphatest",

"animated": "player_animated"

},

"textures": {

"default": "textures/entity/beefist",

//把玩家材質直接換成模型的

"cape": "textures/entity/cape_invisible"

},

"geometry": {

"default": "geometry.beefist",

//修改玩家模型,換成beefist

"cape": "geometry.cape"

}

//(下略)

}

}

}

接著在世界中啟用資源包。

只添加配件

這個方法的原理是利用多重render_controller,達到在同一個實體上顯示多個模型的效果。

就像是市集購買的皮膚配件一樣,可以讓任何皮膚的玩家都穿戴上「配件」。

因為我這個模型只是在玩家手上加二個拳套而已,其實模型部分的史蒂夫根本不需要。所以在Blockbench其他cube全部刪除,只留下bone的資料夾,以及拳套的那二個cube。匯出模型。

然後修改player.json,插入新的material、材質、geometry、render_controller。

{

"format_version": "1.10.0",

"minecraft:client_entity": {

"description": {

"identifier": "minecraft:player",

"materials": {

"default": "entity_alphatest",

"cape": "entity_alphatest",

"animated": "player_animated",

"beefist": "entity_alphatest"

//添加material

},

"textures": {

"default": "textures/entity/steve",

"cape": "textures/entity/cape_invisible",

"beefist": "textures/entity/beefist"

//添加材質

},

"geometry": {

"default": "geometry.humanoid.custom",

"cape": "geometry.cape",

"beefist": "geometry.beefist"

//添加geometry

},

"scripts": {

"scale": "0.9375",

"initialize": [

"variable.is_holding_right = 0.0;",

"variable.is_blinking = 0.0;",

"variable.last_blink_time = 0.0;",

"variable.hand_bob = 0.0;"

],

"pre_animation": [

"variable.helmet_layer_visible = 1.0;",

"variable.leg_layer_visible = 1.0;",

"variable.boot_layer_visible = 1.0;",

"variable.chest_layer_visible = 1.0;",

"variable.attack_body_rot_y = Math.sin(360*Math.sqrt(variable.attack_time)) * 5.0;",

"variable.tcos0 = (math.cos(query.modified_distance_moved * 38.17) * query.modified_move_speed / variable.gliding_speed_value) * 57.3;",

"variable.first_person_rotation_factor = math.sin((1 - variable.attack_time) * 180.0);",

"variable.hand_bob = query.life_time < 0.01 ? 0.0 : variable.hand_bob + ((query.is_on_ground && query.is_alive ? math.clamp(math.sqrt(math.pow(query.position_delta(0), 2.0) + math.pow(query.position_delta(2), 2.0)), 0.0, 0.1) : 0.0) - variable.hand_bob) * 0.02;",

"variable.map_angle = math.clamp(1 - variable.player_x_rotation / 45.1, 0.0, 1.0);",

"variable.item_use_normalized = query.main_hand_item_use_duration / query.main_hand_item_max_duration;"

],

"animate": [

"root"

]

},

"animations": {

"root": "controller.animation.player.root",

"base_controller": "controller.animation.player.base",

"hudplayer": "controller.animation.player.hudplayer",

"humanoid_base_pose": "animation.humanoid.base_pose",

"look_at_target": "controller.animation.humanoid.look_at_target",

"look_at_target_ui": "animation.player.look_at_target.ui",

"look_at_target_default": "animation.humanoid.look_at_target.default",

"look_at_target_gliding": "animation.humanoid.look_at_target.gliding",

"look_at_target_swimming": "animation.humanoid.look_at_target.swimming",

"look_at_target_inverted": "animation.player.look_at_target.inverted",

"cape": "animation.player.cape",

"move.arms": "animation.player.move.arms",

"move.legs": "animation.player.move.legs",

"swimming": "animation.player.swim",

"swimming.legs": "animation.player.swim.legs",

"riding.arms": "animation.player.riding.arms",

"riding.legs": "animation.player.riding.legs",

"holding": "animation.player.holding",

"brandish_spear": "animation.humanoid.brandish_spear",

"holding_spyglass": "animation.humanoid.holding_spyglass",

"charging": "animation.humanoid.charging",

"attack.positions": "animation.player.attack.positions",

"attack.rotations": "animation.player.attack.rotations",

"sneaking": "animation.player.sneaking",

"bob": "animation.player.bob",

"damage_nearby_mobs": "animation.humanoid.damage_nearby_mobs",

"bow_and_arrow": "animation.humanoid.bow_and_arrow",

"use_item_progress": "animation.humanoid.use_item_progress",

"skeleton_attack": "animation.skeleton.attack",

"sleeping": "animation.player.sleeping",

"first_person_base_pose": "animation.player.first_person.base_pose",

"first_person_empty_hand": "animation.player.first_person.empty_hand",

"first_person_swap_item": "animation.player.first_person.swap_item",

"first_person_attack_controller": "controller.animation.player.first_person_attack",

"first_person_attack_rotation": "animation.player.first_person.attack_rotation",

"first_person_vr_attack_rotation": "animation.player.first_person.vr_attack_rotation",

"first_person_walk": "animation.player.first_person.walk",

"first_person_map_controller": "controller.animation.player.first_person_map",

"first_person_map_hold": "animation.player.first_person.map_hold",

"first_person_map_hold_attack": "animation.player.first_person.map_hold_attack",

"first_person_map_hold_off_hand": "animation.player.first_person.map_hold_off_hand",

"first_person_map_hold_main_hand": "animation.player.first_person.map_hold_main_hand",

"first_person_crossbow_equipped": "animation.player.first_person.crossbow_equipped",

"third_person_crossbow_equipped": "animation.player.crossbow_equipped",

"third_person_bow_equipped": "animation.player.bow_equipped",

"crossbow_hold": "animation.player.crossbow_hold",

"crossbow_controller": "controller.animation.player.crossbow",

"shield_block_main_hand": "animation.player.shield_block_main_hand",

"shield_block_off_hand": "animation.player.shield_block_off_hand",

"blink": "controller.animation.persona.blink"

},

//插入新的render controller,這裡設成第三人稱才顯示

"render_controllers": [

{

"controller.render.player.beefist": "!variable.is_first_person && !variable.map_face_icon"

},

{

"controller.render.player.first_person": "variable.is_first_person"

},

{

"controller.render.player.third_person": "!variable.is_first_person && !variable.map_face_icon"

},

{

"controller.render.player.map": "variable.map_face_icon"

}

],

"enable_attachables": true

}

}

}

再在資源包的render_controllers資料夾,新增一個新的render_controller,叫做beefist.json :{

"format_version": "1.8.0",

"render_controllers": {

"controller.render.player.beefist": {

"geometry": "Geometry.beefist",

//entity/player.json所新增的geometry

"materials": [

{

"*": "Material.beefist"

}

],

//entity/player.json所新增的material

"textures": [

"Texture.beefist"

]

//entity/player.json所新增的材質

}

}

}

完成。

但是這裡只設定在第三人稱顯示,如果要在其他視角顯示,就請自行複製player的render controller進行細部調整吧!

請參閱NPA這個Add-On了解這方面的問題。改用「全部取代掉」的方法,再把自己的皮膚檔案複製到這個資源包的/textures/entiy/裡面,再重新命名成steve.png即可。

另外,想改披風的話,請下載這個資源包依樣畫葫蘆。

皮膚包方法#不推薦。

這個製作方法很麻煩,而且只適用Windows 10版本,Android要安裝別人修改過的apk,iOS更是不可能,而且遊戲主程式一更新就要重裝,因此不推薦。

基岩版雖允許玩家安裝皮膚包,但非市集購買的皮膚包一律只會使用史蒂夫的模型。只有從市集購買的皮膚包,才能使用自訂模型。

原理: 把做好的皮膚包取代掉系統檔案,就能夠讓皮膚包載入自訂的模型。

本文撰寫時遊戲版本為1.17.10,也許未來會開放。

將做好的模型檔案的匯出到皮膚包,改名為geometry.json。如果有多個模型,則每個geometry之間要有逗號隔開。

在這個範例中,確保geometry的ID為geometry.beefist。

Blockbnech輸出的模型檔案結構應該長這樣:

{

"format_version": "1.12.0",

"minecraft:geometry": [

{

//...(中略)

}

]

}

修改成1.8.0的結構:

{

"format_version": "1.8.0",

"geometry.Beefist": {

"texturewidth": 128,

"textureheight": 128,

"visible_bounds_width": 3,

"visible_bounds_height": 3.5,

"visible_bounds_offset": [0, 1.25, 0],

"bones": [

//(中略)

]

}

}

再將皮膚檔案放置進來。

然後在skins.json,針對這個修改過的模型,填入要使用的geometry(即模型ID):{

"skins": [

//第一個皮膚

{

"localization_name": "Beefist",

//皮膚ID

"geometry": "geometry.Beefist",

//皮膚使用的模型

"texture": "Beefist.png",

//皮膚材質名稱

"type": "free"

}

],

//皮膚包名稱

"serialize_name": "Custom4DSkinPack",

"localization_name": "Custom4DSkinPack"

}

皮膚包資料夾改名為"persona",現在資料夾應該長這樣。

下載這套軟體: [IOUnlocker](IObit Unlocker),用於修改系統檔案。

按下「添加」,找到這個persona資料夾。

該資料夾位於C:\Users\使用者名稱\AppData\Local\Packages\Microsoft.MinecraftUWPConsole_8wekyb3d8bbwe\data\skin_packs

(WindowsApp這個資料夾要調整使用者群組給權限才能開啟)

按解鎖旁邊的按鈕「解鎖&刪除」,刪除內建的皮膚包"persona"。然後退出程式,重新開啟。

把自己做的皮膚包資料夾拖曳到「選擇的檔案&資料夾」,按下「解鎖&複製」將資料夾複製到剛剛刪除皮膚包的位置。

安裝這個皮膚包,避免無法載入。

這個皮膚包其實就是skin_packs裡面原本的檔案,不安裝這個的話,皮膚的介面會一直處在載入畫面。

開啟遊戲,應該就會看到自己的模型了。

總結: 技術上來說,即使這樣可以讓玩家使用自訂模型,但還是做不到市集那種「自訂額外配件」。

這樣的好處大概就只有方便玩家在多個造型間切換而已,但資源包的subpack也是能達到類似效果。

5. 將obj模型做為皮膚#在閱讀完上一章節後,請參考以下二篇文章了解obj模型的原理。

在Minecraft基岩版中導入obj模型MMD模型移植到Minecraft基岩版接著參考上一章節的資源包或者皮膚包的步驟,把模型和材質檔案放進去。

6. 我製作的皮膚包範本下載#這些可以自由修改,但MMD模型的部分請勿隨意商用,並請註明作者。

普通皮膚包範本下載,內含2個皮膚。

4D皮膚資源包範本下載,內含2個4D皮膚和模型,按齒輪切換。

4D皮膚包範本下載,這個是皮膚包,內含一個「蜜蜂拳套」的4D皮膚。

obj皮膚資源包範本下載,內含一個BB的obj模型。

MMD模型來源: 【Fate/MMD】BBペレちゃん【モデル配布】

作者: つみだんご