公式チュートリアル玉転がし 13:14 より。
2回見ても何言ってんのかさっぱりだったので、自分なりに噛み砕きました。
(英字幕で見たほうが理解しやすかったです) 日本語字幕ルー大柴過ぎて意味不
静的コライダーを動かす度、シーン全体の静的コライダーが再計算される様です
Q:コライダーとは?
A:衝突判定してる枠。
Unityでは2種類のコライダーがあります。
- 静的コライダー
static Collider
- 動的コライダー
dynamic Collider
静的コライダーは、Unityでは_動かないもの_と定義されています。
動かないので、ゲームが開始して時間が進んでも、_フレーム毎に再計算する必要がない_ですよね?
だからUnityは__始めに__シーン内領域にある_静的コライダーの全てを計算して、キャッシュに保存_します。
では、__静的コライダーをtransform
で回転、移動させてる場合どうなる__と思います?
見出しの通りです。
重要なのはtransform
させてる静的コライダー1個ではなく、__全体が再計算され静的コライダーのキャッシュが更新されている__事です。
パフォーマンスはひどく悪いように見えますでしょ?
実際、オブジェクトが多いと最悪です
どこかの記事で、
仕様:静的コライダー ← 動かしてはならない
とだけ書かれてあって、読んでも「( ゚Д゚)は?」だったのを覚えてる。
多分こういう事を言ってるんだと思う。
じゃぁどうすんの?
何が?って感じだけど、とりあえずみんな思うよね
そして考えるのが「動的コライダーにすれば(とりあえず)ええやん?」ですよね?
(多分)正解!
動画の説明を裏読みをすれば、動的コライダーならば全体ではなく、個別に再計算してるので、パフォーマンスがいいはず。
ではUnityでの動的コライダーの要件とは?
- コライダー
- Rigidbody
この2つを持つゲームオブジェクトを全て動的とみなされます。
つまり、__今動かしてるコライダーがあったら、それにRigidbody
を追加してあげれば、とりあえずパフォーマンスが上がる__はずです。
そして地獄を見る
見たほうが早い。玉転がし 14:34 をまず見てください。
そう、Rigidbody
を追加すると地球の重力に魂が縛られます。
そしてIs Trigger
がチェックされてるアイテム系オブジェクトだとそのまま沈んで画面外まで消えます。
この悲しみをセーブするためにUse Gravity
のチャックを外します。
これで沈下は免れますが、他の物理現象が依然として働きます。
具体的にはこう↓
2個目以降__のアイテムからは分かりやすいようにIs Trigger
外しています__
ひとつの冴えたやり方
- 取得可能なアイテムじゃなくって、建物とかの装飾に回転する飾りがほしいだけだったのに…
- ベルトコンベアを実装したかったのに
っという現実的要望もあるかと思います。
__アイテムじゃないんだよ!目立つ背景なんだよ!でも動かされるのは困る。__的な
そういう時はUse Gravity
とIs Kinematic
の両方にチェックを入れます。
すると
- 空中浮遊設定ならそのまま 地面に沈まない
- 他のオブジェクトと衝突してもふっ飛ばされない
- 動的コライダー でパフォーマンスに優しい
コライダーが出来上がるはずです。
取得可能なアイテムにしたければ、Is Trigger
を付ければ完璧!って感じですね。
最後に
初心者が公式チュートリアルをありのままに読んで、試して、感じた所感です。
現実の開発現場ではもっと違うやり方で同じことをやっているかもしれません。
もし違うやり方でもっと効率のよいアイデアがあれば、ぜひ教えてください。
もちろん記事に勘違いからのミスがありましたらご指摘ください。
最後まで読んでくださってありがとうございました。