25歳無職、マイナスからのプログラミング就活

25の無職がプログラマー就職キャンプのメンターからハッキリ「無理」っと言われ、PG勉強に奮起するブログ。 目的は「こんな自分でも社員で雇ってくれる会社様が現れる」そのことです。 こんなやつでも就職出来るんだ、俺だって頑張れば!、そんな風に思って貰える未来になれればいいと思います。 記事はプログラミング言語勉強や、英語学習の成果物が中心。 Unityがメインかも。 成果物を作って、何が何でも業界に就職してやるぜ!

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

公式チュートリアル玉転がし 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を付ければ完璧!って感じですね。

最後に

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

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