How Custom Heads Work in Bedrock
In Bedrock Edition, a custom head is fundamentally a custom block. Because every block deposited in a player's inventory automatically generates a corresponding block-item, you do not need to create a separate item definition file in your behavior pack to make the head wearable. Instead, you apply item-specific components directly inside the block's behavior file.
A complete head implementation relies on three pieces working together: a behavior pack block definition that handles placement, rotation, and helmet slot equipping; a resource pack geometry file that defines the 8x8x8 pixel cube; and a standard 64x64 or 64x32 skin texture mapped to that cube. While vanilla skulls support 16-direction rotation on the floor and wall attachment, the most reliable approach using stable, non-experimental components is a 4-direction cardinal rotation using standard block traits.
Block Behavior Definition
The behavior file sets up the block's physical properties, how it faces the player when placed, and its ability to be worn. By adding the placement direction trait, the game automatically provides the cardinal direction block state, which you then read inside permutations to rotate the model via the transformation component.
To let players put the block on their head, include the wearable component directly in the main component list. Even though it is an item component, Bedrock reads it when the block is held as an item in the inventory. You should also tune light dampening to zero so the small model does not cast a full-block shadow onto the block beneath it.
| Component | What it does | Notes |
|---|---|---|
| minecraft:wearable | Allows the block item to be equipped in an armor slot. | Set slot to slot.armor.head. Optional protection integer can be added. |
| minecraft:collision_box | Defines the physical hitbox for entity movement. | Origin [-4, 0, -4] and size [8, 8, 8] centers an 8-pixel cube on the floor. |
| minecraft:light_dampening | Controls how much sky and block light this block absorbs. | Must be 0 for small blocks, otherwise the ground underneath turns dark. |
| minecraft:placement_direction | Block trait that records which way the player was facing on placement. | Offset of 180 degrees makes the front of the head face the player. |
{
"format_version": "1.20.80",
"minecraft:block": {
"description": {
"identifier": "my_pack:goblin_head",
"menu_category": {
"category": "items"
},
"traits": {
"minecraft:placement_direction": {
"enabled_states": [
"minecraft:cardinal_direction"
],
"y_rotation_offset": 180.0
}
}
},
"components": {
"minecraft:geometry": "geometry.custom_head",
"minecraft:material_instances": {
"*": {
"texture": "goblin_head",
"render_method": "alpha_test"
}
},
"minecraft:collision_box": {
"origin": [-4.0, 0.0, -4.0],
"size": [8.0, 8.0, 8.0]
},
"minecraft:selection_box": {
"origin": [-4.0, 0.0, -4.0],
"size": [8.0, 8.0, 8.0]
},
"minecraft:light_dampening": 0,
"minecraft:destructible_by_mining": {
"seconds_to_destroy": 1.0
},
"minecraft:wearable": {
"slot": "slot.armor.head"
}
},
"permutations": [
{
"condition": "q.block_state('minecraft:cardinal_direction') == 'north'",
"components": {
"minecraft:transformation": {
"rotation": [0, 0, 0]
}
}
},
{
"condition": "q.block_state('minecraft:cardinal_direction') == 'south'",
"components": {
"minecraft:transformation": {
"rotation": [0, 180, 0]
}
}
},
{
"condition": "q.block_state('minecraft:cardinal_direction') == 'west'",
"components": {
"minecraft:transformation": {
"rotation": [0, 90, 0]
}
}
},
{
"condition": "q.block_state('minecraft:cardinal_direction') == 'east'",
"components": {
"minecraft:transformation": {
"rotation": [0, 270, 0]
}
}
}
]
}
}Head Geometry and UV Mapping
Standard player and humanoid mob heads measure 8x8x8 pixels. When creating a block geometry in the resource pack, the origin [0, 0, 0] corresponds to the bottom center of the block space. Therefore, to sit flush on the floor and centered in the block grid, your base cube needs an origin of [-4, 0, -4] and a size of [8, 8, 8].
If you want your custom head to support the outer hat or overlay layer common on player skins, add a second cube to the same bone. Give it the exact same origin and size, then apply an inflate value of 0.5. By using standard box UVs at [0, 0] for the inner head and [32, 0] for the outer layer on a 64x64 texture size, you can drop any standard player skin file into your pack and use it as a block texture without editing the image.
{
"format_version": "1.12.0",
"minecraft:geometry": [
{
"description": {
"identifier": "geometry.custom_head",
"texture_width": 64,
"texture_height": 64,
"visible_bounds_width": 2,
"visible_bounds_height": 2,
"visible_bounds_offset": [0, 0.5, 0]
},
"bones": [
{
"name": "head",
"pivot": [0, 4, 0],
"cubes": [
{
"origin": [-4, 0, -4],
"size": [8, 8, 8],
"uv": [0, 0]
},
{
"origin": [-4, 0, -4],
"size": [8, 8, 8],
"inflate": 0.5,
"uv": [32, 0]
}
]
}
]
}
]
}Registering the Texture
Because the head is defined as a block, its texture shortname must be registered inside your resource pack's terrain texture file, not the item texture file. The shortname you pick here must match the string passed into the material instances component in your behavior pack.
Make sure the render method in your block behavior is set to alpha_test if you use the second hat layer. Without alpha testing, the transparent pixels of the outer cube will render as solid black or white, completely hiding the inner face.
{
"resource_pack_name": "my_pack",
"texture_name": "atlas.terrain",
"padding": 8,
"num_mip_levels": 4,
"texture_data": {
"goblin_head": {
"textures": "textures/blocks/goblin_skin"
}
}
}Adjusting Worn Position with Attachables
When you equip a custom block on your head using the wearable component, the game uses default item-rendering transforms to position the block model on the player's head bone. Depending on your geometry's pivot point, you may notice the head floating slightly too high or clipping into the player's shoulders in third-person view.
If the default block-item positioning does not look right, you can override how it renders when worn by creating an attachable file in your resource pack. Give the attachable the exact same identifier as your custom block. Inside the attachable definition, bind your geometry to the player's head bone and adjust its vertical offset in a separate wearable geometry copy, or use a render controller and animation to scale and translate the model so it fits snugly over the player's actual head.
Which versions this applies to
Applies to Bedrock Edition 1.20.80 and newer. All components used (traits, transformation, wearable on blocks, geometry, material_instances) are stable and do not require any experimental toggles.
When it does not work
| What you see | Why | The fix |
|---|---|---|
| [Blocks][error]-my_pack:goblin_head | minecraft:collision_box: box must stays within the block unit | Your collision or selection box coordinates extend outside the allowed [-8, 0, -8] to [8, 16, 8] pixel boundaries. This often happens if you enter the size as [8, 8, 8] but leave the origin at [0, 0, 0] and then add an offset that pushes it past 8. | Set the origin to [-4.0, 0.0, -4.0] and the size to [8.0, 8.0, 8.0] so the box stays centered within the 16x16x16 block space. |
| The outer hat layer of the head renders solid black or hides the face underneath. | The material_instances component defaults to the 'opaque' render method, which ignores alpha channels on block textures. | Change 'render_method' inside 'minecraft:material_instances' to 'alpha_test' so transparent pixels on the outer cube are discarded. |
| The head places backwards, facing away from the player instead of looking at them. | By default, 'minecraft:cardinal_direction' records the direction the player is looking, meaning placing a block while looking north sets the state to north, which aligns the front of the model away from you. | Add '"y_rotation_offset": 180.0' inside the 'minecraft:placement_direction' trait object, or swap the rotation values between north/south and east/west in your permutations. |
Reference, straight from the game files
Read out of the game itself, so the ids match the version you are building for.
