時間と高さによって放物線運動を設定する
unityで時間と高さを決めて、例えばジャンプをする方法のまとめ。
普通はRigidBodyを使って、addforceやvelocityコントロールしますが、
addforceは速度との関係が難しく、
velocity使ったとしても時間か高さしか決められない。
理由は重力加速度を変える必要があるからでした。
等加速度直線運動の3公式のうち、下の2つの式を使います。
投げ上げ運動なのでv=0として
v=v0+at→v0=-at
v^2-v0^2=2ax→v0^2=-2ax
これを整理して
v0=2x/t
a=-2x/t^2
放物線運動をする物体が1つ or 全ての物体を同じ重力加速度でコントロールする場合、
edit - project setting - physics - gravityの値を変更。
各物体を異なる重力加速度でコントロールする場合、
以上、個人的なメモでした。
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。
Bounce FreeDom(仮)の進行状況
進行状況:70%くらい
unityの仕様なのか、壁との衝突時の反射処理がうまくいかない
+反射の角度や向きを調整したかったため
衝突処理をオリジナルで作成。
他にもinstantiateを用いてボタンの数を自由に設定できるようにもしました。
今はタイトル画面を作成中。
これからはレベルデザイン、ゲーム全体のデザインを詰めていきます。
たぶんですが、残り30%が地獄な気がします。
というか、これは残り30%じゃない気がしてきたwww