How Bedrock Calculates Entity Shadows
Entity shadows in Bedrock Edition are not dynamic projections of the geometry bones. Instead, the rendering engine draws a flat, semi-transparent octagon texture onto the blocks below the entity's origin point. The size and opacity of this dark spot are determined by a combination of the behavior pack collision box, a resource pack runtime identifier, or an explicit render controller array.
When you build a new custom entity from scratch, the game looks at its collision box width to guess how large the shadow should be. If you copy a vanilla entity's runtime identifier in your behavior pack, your entity may also inherit hard-coded shadow properties from that vanilla mob. Understanding which file controls the shadow lets you turn it off without breaking your entity's hitbox or movement.
Method 1: Shrink the Collision Box (Dummy Entities)
If you are creating a non-interactive marker, a floating text anchor, or a visual effect entity that players never need to click or collide with, the fastest way to remove the shadow is to set the collision box width and height to zero in the behavior pack.
Because the default shadow radius scales directly with the width value of the collision box component, a width of 0.0 produces a shadow of zero radius. You should also disable pushability and damage sensor interactions so the invisible marker does not interfere with gameplay.
{
"format_version": "1.20.0",
"minecraft:entity": {
"description": {
"identifier": "my_pack:marker_entity",
"is_spawnable": false,
"is_summonable": true
},
"components": {
"minecraft:collision_box": {
"width": 0.0,
"height": 0.0
},
"minecraft:physics": {
"has_gravity": false,
"has_collision": false
},
"minecraft:pushable": {
"is_pushable": false,
"is_pushable_by_piston": false
}
}
}
}Method 2: Use a Shadowless Runtime Identifier
Sometimes your entity needs a physical hitbox so players can attack it, ride it, or walk into it, which means you cannot set the collision box width to zero. In this case, you can instruct the engine to treat your entity like a vanilla non-shadowed entity by adding a runtime identifier to the behavior pack description.
The vanilla armor stand and area effect cloud do not cast ground shadows regardless of how wide their collision box is made. Assigning the armor stand identifier in your behavior pack description strips the shadow while keeping your custom collision box intact. Be aware that runtime identifiers also pass along other hard-coded vanilla behaviors, such as how the entity reacts to water currents or minecarts, so test thoroughly before shipping.
{
"format_version": "1.20.0",
"minecraft:entity": {
"description": {
"identifier": "my_pack:custom_statue",
"runtime_identifier": "minecraft:armor_stand",
"is_spawnable": true,
"is_summonable": true
},
"components": {
"minecraft:collision_box": {
"width": 0.9,
"height": 1.8
},
"minecraft:health": {
"value": 20,
"max": 20
}
}
}
}Method 3: Client Entity and Render Controllers
If you cannot use a runtime identifier because its hard-coded mechanics conflict with your mob's AI, you must handle the shadow on the client side in your resource pack. In older resource pack formats, creators often omitted the render controller entirely for invisible entities, which stops both the geometry and the shadow from drawing.
When you have visible geometry that must render without a shadow, check how your client entity definition sets up its rendering. If an entity has no render controllers listed in its client entity file, no shadow is drawn, though only particle effects or attached animations will be visible. For visible models, you can also lift the geometry inside Blockbench and offset the entity's position, or use custom entity materials that skip standard shadow passes if you are only rendering glowing planes.
{
"format_version": "1.10.0",
"minecraft:client_entity": {
"description": {
"identifier": "my_pack:invisible_emitter",
"particle_effects": {
"ambient_glow": "my_pack:glow_particle"
},
"scripts": {
"animate": [
"emit_particles"
]
},
"animations": {
"emit_particles": "animation.invisible_emitter.emit"
}
}
}
}Comparing Shadow Removal Techniques
Choosing the right approach depends entirely on whether the player needs to physically interact with the entity and whether the entity needs a visible 3D model. Use the table below to pick the cleanest method for your specific use case.
| Method | Keeps Hitbox? | Keeps Visible Model? | Best Used For |
|---|---|---|---|
| Zero Collision Box | No | Yes | Floating holograms, cutscene cameras, pure visual props |
| Armor Stand Runtime ID | Yes | Yes | Custom furniture, statues, Ghosts, interactive hitboxes |
| Omit Render Controllers | Yes | No (Particles only) | Invisible logic markers, sound emitters, area triggers |
Which versions this applies to
Applies to Minecraft Bedrock 1.10.0 through 1.21+. None of these methods require experimental toggles.
When it does not work
| What you see | Why | The fix |
|---|---|---|
| The entity shadow is gone, but players can no longer attack or interact with the entity. | You set both width and height in minecraft:collision_box to 0.0. In Bedrock, the interaction and attack raycast relies on the collision box volume. | Restore the width and height in minecraft:collision_box to a positive number (such as 0.6 and 1.8) and use "runtime_identifier": "minecraft:armor_stand" in the entity description instead. |
| Content Log Error: [Entity][error]-my_pack:custom_statue | runtime_identifier is not a valid vanilla entity identifier. | The runtime_identifier field only accepts vanilla Minecraft entity identifiers that include the minecraft: namespace, or you misspelled the identifier. | Ensure the value is written exactly as "minecraft:armor_stand" inside the description object of the behavior pack entity JSON. |
| After adding the armor_stand runtime identifier, the custom entity makes wooden breaking sounds when hit. | Runtime identifiers inherit hard-coded client and server traits from the vanilla entity, including default hurt and death sound events tied to the armor stand. | Override the sounds for your entity identifier inside RP/sounds.json under the entity_sounds category so your custom sounds replace the inherited armor stand defaults. |
Reference, straight from the game files
Read out of the game itself, so the ids match the version you are building for.
