unity進捗-久しぶり編-

久しぶりにunity進捗書きます。

はい、久しぶりです…。

いろいろ忙しかったんです…。

 

いわゆるブロック崩しを作っていたんですが、

というかいい加減完成させなきゃなんですが、

面白いアイデアが湧いたのでそっちにかかりきり。

 

その中で引っかかったことがあったので少しメモ。

今はシューティングゲームを作っているんですが、

爆発をパーティクルで作成しています。

普通、自分と敵、自分の打ったミサイルと敵の衝突に対して

爆発エフェクトをかけると思うんですが、

今回は敵と敵や自分と敵のミサイル同士などにも

エフェクトをかけようとしています。

そうすると、エフェクトが多発して重くなる可能性があるので

どうにかしようとしてさらにひっかかったお話。

 

◎したかったこと

エフェクトの発生数を減らす。

具体的には単純にOnCollisionEnterでパーティクルを発生させると

同じ場所に2重に発生するので重複をチェックして

1か所に1つのパーティクル発生にしたかった。

 

◎起きたこと

発生数を減らすどころかエフェクトが多発。

1か所の衝突で1000個以上のパーティクルが発生した。

 

◎原因となったメソッド

重複のチェックをする機構としてexplosionControlというクラスを作成。

衝突が起こると、explosionControlに自分と相手の座標を送る。

explosionControlは送られた座標にパーティクルを発生させる子オブジェクトとして作成し、配置。ただし、子オブジェクトがいる場合には子オブジェクトの座標を一致しない場合のみ作成する。

ということで作ったメソッドが下。

if(transform.childCount>0){

 foreach (Transform child in gameObject.transform) {

  if(colVector!=child.position){

   エフェクトのためのゲームオブジェクトを作成

  }

 } 
}else{

 エフェクトのためのオブジェクトを作成
}

一見、うまく行くんですが…。

1か所の時はうまく処理できますがエフェクトが増えるにつれて

爆発的に増加・・・。

2か所目で発生するとexplosionControlは1回目の呼び出しでは

1か所目とは違う場所のため、オブジェクトを作成。

2回目の呼び出しでは2か所目に作ったオブジェクトとは場所が一致するため作成しないが、1か所目とは一致しないためオブジェクトを作成。これによりオブジェクトが3つに…。

3か所で発生するとさらに増え、6つ。

4か所目だと12個と指数的に増大。

 

ということで改善したのが下。

if(transform.childCount>0){

bool rec = true;

foreach (Transform child in gameObject.transform) { if(colVector==child.position){

rec = false; break; }

}

if(rec){

エフェクトのためのオブジェクトを作成

}
}else{

エフェクトのためのオブジェクトを作成
}

すべての子オブジェクトの座標と一致しないか確認し、

一致しなければオブジェクトを作成する機構を入れました。

これだけなんですが1週間以上悩んでたwww。