【Unity】 BoxColliderと衝突判定
Unity(4.6使用)で気づいたことがありました
衝突判定で、
アクションゲーム等のメインループ中に
アイテムを取得した場合、
アイテムのコリジョン判定だけを無効にできて、
いつでも判定を有効にする方法
できるだけ軽くて、スマホゲームに使える処理は
なんかあるだろうか?と思い調べていました
スマホゲームは軽い処理とドローコールやFPS等
極力負荷を抑える形で余裕を持っていかないとなりません
はっきり言えばこれができなければ無理だと言い切れますね
プログラムの書き方1つで簡単に
重い・らぐい・電力消費激しい・発熱、最悪熱暴走
これはクラッシュアプリですか!?
状態に簡単なります
さて、本題の衝突判定の無効化
調べると方法はいろいろ紹介されてますが
どう考えても、これはそのまま組み込んじゃダメでしょ!?
ってスクリプトが非常に多くひっかかります
中には、同じ処理が出来るけど、
根本的にここでコレ使っちゃダメでしょ、力技!?
っていうのもよく見かけます
それをふまえておすすめは、Colliderを使った方法です

(Unity JS)
GetComponent(BoxCollider).enabled = false;
false部分をtrueにすれば有効になる、こんだけです
( 'o')b<ハイ!簡単ですw
Componentを事前に登録しておけば、
恐らくこれが一番軽い処理なんじゃないでしょうか
(使用例)(Unity JS)
//宣言
private var ItemCOL:BoxCollider;
ItemCOL = GameObject.Find("TestBox").GetComponent(BoxCollider);
//メインループ内で実行
ItemCOL.enabled = false;
アイテム取得後はアイテムを見えないとこに移動させるなり
Materialの非表示をすればいいので、
この方法ならアイテム取得後に
コリジョン無効→アニメーション→非表示or消去
というルーチンが簡単に組めます
あ、基本的なことですけど(初心者の方へ)
メインループでの処理記述になるものなので、
1回だけ実行というのを実装しましょう
じゃないとどんな命令でも無限ループ状態じゃ
負荷の原因になります
他にも衝突無効化の方法はある多々あるので軽く紹介します
レイヤーを変更して衝突を無効にする処理
アイテムなどは基本的にプレハブを使うことが多いので
レイヤー変更によってstaticが切れたせいか、
ドローコール増加がとなったので
私のプログラムには合っていなかったかんじです
レイヤー自体を変更する処理は負荷が
どの程度あるのかわかりませんが、
衝突無効で使うのには、あまりおすすめしません
RigidBodyの停止で衝突判定を無効
物理演算を使ってないのでやめました(座標軸全固定のため)
当然ですがこちらはCollider無効に比べて
処理に若干負荷がかかります
ただし物理演算中のオブジェクトではこちらで処理するのが有効
今回の私のゲーム仕様ではRigidBodyで
座標軸等固定にしているため必要なかったかんじです
Destroy破壊による判定無効
これ使ってる方多いんじゃないでしょうか
でも初心者がおちいる罠ですので使う場所には要注意です
そもそもDestroyはそんなに軽い処理ではありません
シューティングゲーム等でDestroy使いまくってるソースを
見たことがありますが、スマホではまず動かないだろうなと
実際に私が実験した経験談ですが
for文等で同時に10個程度でいいので、メインループ内でDestroyしてみてください
PCでは感じないかもしれませんが、スマホでは一瞬止まります
負荷のかかる時に複数のDestroyなんてかませずに
一時非表示、その後どうしてもDestroyしたければ
負荷のかからない場所でするべきだと考えます
サンプル程度のプログラムや、Windows用では
FPSにもスペックにも余裕があるので、そういう症状は見えません
しかし、プログラムが拡大するほど
そういった処理が確実に効いてきます
こんなに簡単なゲームなのに、重い!?
なんていうのを耳にしますが、
プログラムの書き方が重い処理をさせている
(゚O゚)<なぜこうなった!?
というのが、ほとんどです
基礎知識の高いプログラマーでも
それを応用できないプログラマーはたくさんいます
プログラムの勉強するくらいなら
実践しながら勉強しましょ!頭に入れただけじゃダメ
(*゚∀゚)<では楽しいUnityライフを!
(新作開発状況)
現在開発中スマホゲームの新作が
だいぶ見れるかんじになってきましたよ
ゲームタイトル(仮)と動作環境
Lancer of the Airy Region 天空の槍騎兵
AndroidOS 4.1以上(2.3は動くけど重そうなので対応未定)
Androidタブレット対応
そろそろ近いうちに
詳しい開発状況の報告ができると思います
来週頭あたりに、β版の動作テストを予定
今月中には公開したいという意気込みで作ってます
なんか、派手になってきたんだよね見た目・・・
メビウスには少なかったエフェクト処理を積み込んでいます
当初の思惑とだいぶかけ離れて、
またしてもミニゲームではない規模になりつつあるのでした
それと、Tower of Meviusですが、
新作ができ次第、新バージョンのアップデートを予定しています
だいぶランキングも落ちてしまいましたが、そんなものは関係ない
まだまだ未完成だと思ってます
と、先週すごく嬉しいことがあったんですが
まだ内緒です、いずれおしらせできる時がくると思います
では今後とも、よろしくお願いします
またきてねー>(゚ー゚*)
by Oni-Q(あさる)
衝突判定で、
アクションゲーム等のメインループ中に
アイテムを取得した場合、
アイテムのコリジョン判定だけを無効にできて、
いつでも判定を有効にする方法
できるだけ軽くて、スマホゲームに使える処理は
なんかあるだろうか?と思い調べていました
スマホゲームは軽い処理とドローコールやFPS等
極力負荷を抑える形で余裕を持っていかないとなりません
はっきり言えばこれができなければ無理だと言い切れますね
プログラムの書き方1つで簡単に
重い・らぐい・電力消費激しい・発熱、最悪熱暴走
これはクラッシュアプリですか!?
状態に簡単なります
さて、本題の衝突判定の無効化
調べると方法はいろいろ紹介されてますが
どう考えても、これはそのまま組み込んじゃダメでしょ!?
ってスクリプトが非常に多くひっかかります
中には、同じ処理が出来るけど、
根本的にここでコレ使っちゃダメでしょ、力技!?
っていうのもよく見かけます
それをふまえておすすめは、Colliderを使った方法です

(Unity JS)
GetComponent(BoxCollider).enabled = false;
false部分をtrueにすれば有効になる、こんだけです
( 'o')b<ハイ!簡単ですw
Componentを事前に登録しておけば、
恐らくこれが一番軽い処理なんじゃないでしょうか
(使用例)(Unity JS)
//宣言
private var ItemCOL:BoxCollider;
ItemCOL = GameObject.Find("TestBox").GetComponent(BoxCollider);
//メインループ内で実行
ItemCOL.enabled = false;
アイテム取得後はアイテムを見えないとこに移動させるなり
Materialの非表示をすればいいので、
この方法ならアイテム取得後に
コリジョン無効→アニメーション→非表示or消去
というルーチンが簡単に組めます
あ、基本的なことですけど(初心者の方へ)
メインループでの処理記述になるものなので、
1回だけ実行というのを実装しましょう
じゃないとどんな命令でも無限ループ状態じゃ
負荷の原因になります
他にも衝突無効化の方法はある多々あるので軽く紹介します
レイヤーを変更して衝突を無効にする処理
アイテムなどは基本的にプレハブを使うことが多いので
レイヤー変更によってstaticが切れたせいか、
ドローコール増加がとなったので
私のプログラムには合っていなかったかんじです
レイヤー自体を変更する処理は負荷が
どの程度あるのかわかりませんが、
衝突無効で使うのには、あまりおすすめしません
RigidBodyの停止で衝突判定を無効
物理演算を使ってないのでやめました(座標軸全固定のため)
当然ですがこちらはCollider無効に比べて
処理に若干負荷がかかります
ただし物理演算中のオブジェクトではこちらで処理するのが有効
今回の私のゲーム仕様ではRigidBodyで
座標軸等固定にしているため必要なかったかんじです
Destroy破壊による判定無効
これ使ってる方多いんじゃないでしょうか
でも初心者がおちいる罠ですので使う場所には要注意です
そもそもDestroyはそんなに軽い処理ではありません
シューティングゲーム等でDestroy使いまくってるソースを
見たことがありますが、スマホではまず動かないだろうなと
実際に私が実験した経験談ですが
for文等で同時に10個程度でいいので、メインループ内でDestroyしてみてください
PCでは感じないかもしれませんが、スマホでは一瞬止まります
負荷のかかる時に複数のDestroyなんてかませずに
一時非表示、その後どうしてもDestroyしたければ
負荷のかからない場所でするべきだと考えます
サンプル程度のプログラムや、Windows用では
FPSにもスペックにも余裕があるので、そういう症状は見えません
しかし、プログラムが拡大するほど
そういった処理が確実に効いてきます
こんなに簡単なゲームなのに、重い!?
なんていうのを耳にしますが、
プログラムの書き方が重い処理をさせている
(゚O゚)<なぜこうなった!?
というのが、ほとんどです
基礎知識の高いプログラマーでも
それを応用できないプログラマーはたくさんいます
プログラムの勉強するくらいなら
実践しながら勉強しましょ!頭に入れただけじゃダメ
(*゚∀゚)<では楽しいUnityライフを!
(新作開発状況)
現在開発中スマホゲームの新作が
だいぶ見れるかんじになってきましたよ
ゲームタイトル(仮)と動作環境
Lancer of the Airy Region 天空の槍騎兵
AndroidOS 4.1以上(2.3は動くけど重そうなので対応未定)
Androidタブレット対応
そろそろ近いうちに
詳しい開発状況の報告ができると思います
来週頭あたりに、β版の動作テストを予定
今月中には公開したいという意気込みで作ってます
なんか、派手になってきたんだよね見た目・・・
メビウスには少なかったエフェクト処理を積み込んでいます
当初の思惑とだいぶかけ離れて、
またしてもミニゲームではない規模になりつつあるのでした
それと、Tower of Meviusですが、
新作ができ次第、新バージョンのアップデートを予定しています
だいぶランキングも落ちてしまいましたが、そんなものは関係ない
まだまだ未完成だと思ってます
と、先週すごく嬉しいことがあったんですが
まだ内緒です、いずれおしらせできる時がくると思います
では今後とも、よろしくお願いします
またきてねー>(゚ー゚*)
by Oni-Q(あさる)
スポンサーサイト

この記事へのコメント
トラックバック
URL :