LoginSignup
4
1

More than 3 years have passed since last update.

[Unity] パフォーマンスと静的コライダーについて ~そして沈まない動的コライダー~

Last updated at Posted at 2019-07-22

公式チュートリアル玉転がし 13:14 より。
2回見ても何言ってんのかさっぱりだったので、自分なりに噛み砕きました。
(英字幕で見たほうが理解しやすかったです) 日本語字幕ルー大柴過ぎて意味不

静的コライダーを動かす度、シーン全体の静的コライダーが再計算される様です

Q:コライダーとは?
A:衝突判定してる枠。

Unityでは2種類のコライダーがあります。
1. 静的コライダーstatic Collider

2. 動的コライダーdynamic Collider

静的コライダーは、Unityでは動かないものと定義されています。
動かないので、ゲームが開始して時間が進んでも、フレーム毎に再計算する必要がないですよね?
だからUnityは始めにシーン内領域にある静的コライダーの全てを計算して、キャッシュに保存します。

では、静的コライダーをtransformで回転、移動させてる場合どうなると思います?
見出しの通りです。

重要なのはtransformさせてる静的コライダー1個ではなく、全体が再計算され静的コライダーのキャッシュが更新されている事です。

パフォーマンスはひどく悪いように見えますでしょ?
実際、オブジェクトが多いと最悪です

どこかの記事で、

仕様:静的コライダー ← 動かしてはならない

とだけ書かれてあって、読んでも「( ゚Д゚)は?」だったのを覚えてる。
多分こういう事を言ってるんだと思う。

じゃぁどうすんの?

何が?って感じだけど、とりあえずみんな思うよね
そして考えるのが「動的コライダーにすれば(とりあえず)ええやん?」ですよね?

(多分)正解!

動画の説明を裏読みをすれば、動的コライダーならば全体ではなく、個別に再計算してるので、パフォーマンスがいいはず。

ではUnityでの動的コライダーの要件とは?

  1. コライダー
  2. Rigidbody この2つを持つゲームオブジェクトを全て動的とみなされます。

つまり、今動かしてるコライダーがあったら、それにRigidbodyを追加してあげれば、とりあえずパフォーマンスが上がるはずです。

そして地獄を見る

見たほうが早い。玉転がし 14:34 をまず見てください。

そう、Rigidbodyを追加すると地球の重力に魂が縛られます。
そしてIs Triggerがチェックされてるアイテム系オブジェクトだとそのまま沈んで画面外まで消えます。

この悲しみをセーブするためにUse Gravityのチャックを外します。
これで沈下は免れますが、他の物理現象が依然として働きます
具体的にはこう↓


2個目以降のアイテムからは分かりやすいようにIs Trigger外しています

ひとつの冴えたやり方

  • 取得可能なアイテムじゃなくって、建物とかの装飾に回転する飾りがほしいだけだったのに…
  • ベルトコンベアを実装したかったのに
    っという現実的要望もあるかと思います。

アイテムじゃないんだよ!目立つ背景なんだよ!でも動かされるのは困る。的な

そういう時はUse GravityIs Kinematicの両方にチェックを入れます。

すると

  1. 空中浮遊設定ならそのまま 地面に沈まない
  2. 他のオブジェクトと衝突してもふっ飛ばされない
  3. 動的コライダー でパフォーマンスに優しい

コライダーが出来上がるはずです。
取得可能なアイテムにしたければ、Is Triggerを付ければ完璧!って感じですね。

最後に

初心者が公式チュートリアルをありのままに読んで、試して、感じた所感です。
現実の開発現場ではもっと違うやり方で同じことをやっているかもしれません。
もし違うやり方でもっと効率のよいアイデアがあれば、ぜひ教えてください
もちろん記事に勘違いからのミスがありましたらご指摘ください

最後まで読んでくださってありがとうございました。

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1