この記事でのバージョン
Unity 2017.4.7f1
はじめに
今回はカメラが近づくと消えてしまうメッシュの話!
![]() |
なお、本記事に出てくるキャラクターは以下のアセットを使っています。
![]() |
Unity Mask Man | 3D Humanoids | Unity Asset Store |
原因
さっそく本題ですが、原因はメッシュの座標と実際に表示されている場所にズレが生じている事です。
さらになぜズレるのかと言えば、
アニメーションした時にメッシュがあるとされている場所が動かない(対応してない)からです。
具体的には下の画像のような感じ。(白い立方体がメッシュがあるとされている場所)
![]() |
![]() |
こうなると、
カメラが近づいた時にそのメッシュがカメラ外にあると判定され、描画されなくなってしまうわけです。
対処法(正攻法)
ズレが原因ならズレないようにするべきですが、元のモデル(もしくはアニメ?)を修正する必要があり、
おそらくUnityエディタ上だけでは対応出来ません。
(やり方を知っている方がいればご一報頂ければ幸いです!)
なので、応急処置的な方法を紹介しておきます。
記事公開後に正攻法の修正方法を教えて頂きましたので、こちらを先にご紹介します!
補足:
— 湊 江哉 (@mina10ko8) 2018年8月30日
バウンティングボックスという機能で、カメラから特定のMESHが映らなくなったら消える機能なので、RootBoneの設定を変更することで、そのBoneに追従するので、カメラから消えなくなります。とても長いムチとかは、Bounds Extentを大きくするしか無い気がします・・・
消えてしまうSkinned Mesh Renderer(今回はWrist_LとWrist_R)の
Root Boneに対応するTransform(今回はリストバンドなので手)を設定、Centerも(0, 0, 0)にします。
![]() |
これでアニメーションしてもRoot Boneに追従し、ズレがなくなるため消えなくなります!
![]() |
対処法(応急処置)
以下の2つは正攻法じゃない対処法ですが、一応残しておきます。
Update When Offscreen
1つ目はSkinned Mesh RendererにあるUpdate When Offscreenを有効にする方法です。
こうする事でカメラの外でも描画されるようになるため、消える事がなくなります。
![]() |
ただし、本当にカメラ外に行っても描画され続けてしまうため、負荷は増えます。
Bounds Extent
2つ目はSkinned Mesh RendererのExtentをかなり大きくする方法です。
こうする事でそのメッシュがかなり大きいものと判定され、
多少ズレていてもカメラの範囲外にはならず、消えなくなります。
![]() |
しかし、実際のサイズと全く違くなるため、なにかしら不都合が生じるかもしれません。
(特に思いつく不都合があるわけではありませんが……。)
参考