這篇文章教你如何畫皮膚,以及製作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的檔案,然後以此為基礎進行修改。Steve皮膚的解析度是64x64。
- 可以開始編輯皮膚了。
右邊會有模型的部位,預設來說外層皮膚都是關閉的。點一下眼睛的圖案可以開關顯示,例如「帽子」的部位。
可善用這些功能來暫時關閉某個部位,例如畫左腳內側時暫時關閉顯示右腳。
皮膚外側的就是帽子、袖口部分的材質,會比玩家身體部分的材質大上一圈。點選「大綱」下面的「切換皮膚圖層」可關閉顯示。
使用筆刷開始繪製,右邊有調色盤。
此外也能夠使用油漆桶快速填充,和使用圖形工具畫圓形。
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,當作皮膚包的圖示。
皮膚包要打包給人安裝的話,則將資料夾壓縮成.zip,然後副檔名改成.mcpack。就能像 安裝Add-On一樣匯入。可以在本文結尾下載這個普通皮膚包範本。
註解:如果要自訂披風,你不是從這裡改,而是要改資源包,請往下看。
4. 使用Blockbench建模+製作4D皮膚#
前面說到,玩家不只改皮膚,也能自訂模型。
使用Blockbench建模,修改玩家的造型。
以下這個範例,我在預設的玩家模型上,讓玩家的雙手有額外裝備。
接著按下「文件」,項目,修改模型ID。
圖中輸入有錯,文件名和模型ID應該全部都叫做"beefist"
再對左下角的材質右鍵,按「調整大小」成128x128,這樣才有空間畫額外材質。
接下來,實現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模型的原理。
接著參考上一章節的資源包或者皮膚包的步驟,把模型和材質檔案放進去。
6. 我製作的皮膚包範本下載#
這些可以自由修改,但MMD模型的部分請勿隨意商用,並請註明作者。
普通皮膚包範本下載,內含2個皮膚。
4D皮膚資源包範本下載,內含2個4D皮膚和模型,按齒輪切換。
4D皮膚包範本下載,這個是皮膚包,內含一個「蜜蜂拳套」的4D皮膚。
obj皮膚資源包範本下載,內含一個BB的obj模型。
MMD模型來源: 【Fate/MMD】BBペレちゃん【モデル配布】
作者: つみだんご