Quick answer: The SkinnedMeshRenderer’s bounds are baked from the import pose. Big animations push verts outside it — enable Update When Offscreen or set a generous custom localBounds.
A character disappears when a big attack animation extends a weapon past the body, or when only the body’s edge is on screen. The skinned bounds are too small.
Bounds Are From the Import Pose
Unity computes the SkinnedMeshRenderer’s bounds from the mesh in its bind/import pose. An animation that throws an arm or weapon way out moves verts outside that box — the renderer is culled the moment the box leaves the frustum, even though geometry is still visible.
Option 1: Update When Offscreen
On the SkinnedMeshRenderer, enable Update When Offscreen. Unity recalculates the bounds every frame from the current pose — always correct, at a small CPU cost per renderer.
Option 2: Custom Bounds
var smr = GetComponent<SkinnedMeshRenderer>();
smr.localBounds = new Bounds(Vector3.zero, new Vector3(4, 4, 4));
Set one box big enough to contain every animation’s extent. No per-frame recompute — cheaper than Update When Offscreen for many characters.
Pick Per Use
- A handful of hero characters: Update When Offscreen is fine.
- A crowd of NPCs: generous custom bounds — the per-frame recompute adds up.
Verifying
Play the big attack animation at the screen edge — the character stays visible. Crowds cull only when genuinely off-screen.
“Skinned bounds are baked from the import pose. Update them per-frame, or set a box that fits every animation.”
Visualize the bounds with a gizmo — the right custom box size is obvious once you can see it against the widest animation.