質問: 正方形のスプライト(森や平地ブロック)を敷き詰めて広大なマップを作成しています。 全スプライトを表示するとスクロールが重すぎるので、 カメラの中心からある程度の範囲内のみGameObjectをsetActive(true)しています。 しかし、そうすると逆にsetActive(false)にした範囲の正方形がコライダーが使えないので判定処理できない(例えば、敵が岩スプライトの上だと移動不可になるとか)のでどうしたものか困っています。 何かスクロールを軽くする良い方法はないでしょうか? ◆環境 Unity2017 3.1f1
回答: どれぐらい効果があるか分かりませんが、アイデアだけ。 ### GameObjectのアクティブではなくコンポーネントを無効化する `コンポーネント.enabled = false;`のようにすると、GameObjectはオンでもそのコンポーネントだけオフに出来ます。 オフの時は描画用コンポーネント(SpriteRenderer)なら描画されませんし、 スクリプトは一切のメソッドが呼ばれず「Updateが呼ばれる負荷」も無くなるので効果的かもしれません。 ### 表示範囲を広げる 「表示する・消す」という判定自体が負荷になっている可能性があるので、逆に一度で大きめに表示してしまい、切り替え頻度を下げた方がスムーズになる可能性もあります。 Profilerで調査・検証しつつ最適値を探すといいかと。 ### Colliderを使わない マップチップ方式ということは、「左からX番目、下からY番目のブロックは岩」などの地形情報の配列と考えることが出来ます。 つまりわざわざ衝突判定するのではなく、「このキャラは(X,Y)にいる→その座標のブロックはAである」という位置ベースの判定が出来ます。 物理演算は負荷が高いので、このようなシンプルな判定にする&判定頻度を減らす(移動する時のみ実行するとか)にすると負荷軽減出来るかと。 ### 敵を動かさない そもそも描画外の敵は何もしない、という割り切り。 雑魚敵は固定・特殊な敵だけ動くとかにするだけでも数が多い場合効果的かと。 (まぁゲーム性やスクロール頻度によってはどうしようもないかもしれませんが、動く頻度を減らすとか工夫は出来そう)