原カバンは鞄のお店ではありません。

Unityを使ったゲーム制作のあれこれを綴っていきます。

【Unity】Rigidbodyを使ってオブジェクトを吹き飛ばす

夏本番

別に夏の事は嫌いではありませんが、普通に最高気温が体温を超えるのはやめて下さい。
あと『表現の不自由』がそんなに表現したいたら中国に行って習近平の肖像でも燃して下さい。(これも表現の自由です)

 

壊したい

さて、現在制作中のゲームがシューティングゲームということで、当然のことながら何かしらの物が壊れるとか吹き飛ぶといった破壊表現が必要となってくるわけですが、まぁオーソドックスにパーティクルを表示してオブジェクトを非表示化する、みたいな表現だけではちょっと味気ないので、構造物が壊れて吹き飛ぶような演出も実装してみよう、というのが今回の目的。

 

f:id:Karvan:20190806231527p:plain

こんな感じで壊したい

 

Unityではそれ(破壊処理)用のアセットもあったりして、Exploderあたりが有名なんでしょうか、メッシュ破壊系のアセットを導入すれば簡単なのですが、それなりにお値段もするし、だいたいドキュメントは英語で読むのが面倒!というわけで自力で何とかしたい。

 

メッシュ破壊は無理でもオブジェクト本体を飛ばすのはスクリプト何とか出来るので、そちらで実装する方法を考えます。

 

Rigidbodyを使う

Unityでは物理演算はエンジン側で行ってくれるので、有難くそちらを利用します。

 

RigidbodyにはAddExplosionForceというメソッドが用意されていて、こちらはその名前の通り、爆発の威力、爆発点、爆発半径を与えると爆発の状態をエミュレートした力をRigidbody加えてくれます。

 

 

Rigidbody.AddExplosionForce(
		float Force, 		// 爆発の威力
		Vector3 Position, 	// 爆発点
		float Radius);		// 爆発半径

 

例えば複数のオブジェクトで構成されている構造体に対して、オブジェクトそれぞれにこのAddExplosionForceを適用してやればまさに爆弾が爆発したような演出が可能になる。。。はず。

 

ターゲット

今回は以下のような六角形の床と天板、柱が並んでいる簡単な構造体を使ってみました。
当然のことならが全てのオブジェクトにはColliderとRigidbodyが設定されています。

 

f:id:Karvan:20190806232027p:plain

 

これらにAddExplosionForceで力を加えてやります。ここで第二引数のPositionにはワールド座標を指定することに注意です。ローカル座標ではありません

 

また、吹き飛ばしたい全てのオブジェクトのRigidbodyに対してAddExplosionForceを加えることが必要です。


今回のターゲットの場合は全て構造体の子オブジェクトとして定義しているので、Findでオブジェクトを取得し、そのオブジェクに対してGetComponentからRigidbodyを取り出してAddExplosionForceを加えます。

 

 

float ExplosionPosition = this.transform.position;

foreach (Transform child in ExplosionObjRoot)
{
	child.GetComponent<Rigidbody>()
			.AddExplosionForce(ExplosionForce,
                               ExplosionPosition,
                               ExplosionRadius);
}

 

で、構造物の中央のワールド座標からAddExplosionForceを加えた結果がこれ

 

f:id:Karvan:20190806232329g:plain

 

f:id:Karvan:20190806232354p:plain

あ、いや、わかるけどさー。もうちょっと、こう・・・

 

というわけで、爆発点を構造体中央からちょっとだけずらして指定すると

 

f:id:Karvan:20190806232442g:plain

オブジェクトの移動に回転が加わるようになりました。

 

ただ、これでもちょっと味気ないので、今度は床と天板の中に小さいオブジェクトを仕込んでやり、そちらにもAddExplosionForceを加えるように変更。

 

f:id:Karvan:20190806232531p:plain

ごちゃごちゃしているのが仕込んだオブジェクト

 

これらに対しても先ほどと同じようにAddExplosionForceを加え、かつ、0.1秒後に床と天板のオブジェクト自体を非表示化する処理を追加します。

f:id:Karvan:20190806232615g:plain

 

f:id:Karvan:20190806232354p:plain

これでいいか・・・

 

 

で、これを実際のゲームに組み込んでみました。

f:id:Karvan:20190806232758g:plain

どうでしょうか?破壊されているように見えますかね?

 

◇プライバシーポリシー

●個人情報の利用目的

当ブログでは、メールでのお問い合わせ、メールマガジンへの登録などの際に、名前(ハンドルネーム)、メールアドレス等の個人情報をご登録いただく場合がございます。

これらの個人情報は質問に対する回答や必要な情報を電子メールなどをでご連絡する場合に利用させていただくものであり、個人情報をご提供いただく際の目的以外では利用いたしません。

●個人情報の第三者への開示

当サイトでは、個人情報は適切に管理し、以下に該当する場合を除いて第三者に開示することはありません。

・本人のご了解がある場合
・法令等への協力のため、開示が必要となる場合

個人情報の開示、訂正、追加、削除、利用停止
ご本人からの個人データの開示、訂正、追加、削除、利用停止のご希望の場合には、ご本人であることを確認させていただいた上、速やかに対応させていただきます。

アクセス解析ツールについて

当サイトでは、Googleによるアクセス解析ツール「Googleアナリティクス」を利用しています。

このGoogleアナリティクスはトラフィックデータの収集のためにCookieを使用しています。このトラフィックデータは匿名で収集されており、個人を特定するものではありません。
この機能はCookieを無効にすることで収集を拒否することが出来ますので、お使いのブラウザの設定をご確認ください。

●免責事項

当サイトからリンクやバナーなどによって他のサイトに移動された場合、移動先サイトで提供される情報、サービス等について一切の責任を負いません。

当サイトのコンテンツ・情報につきまして、可能な限り正確な情報を掲載するよう努めておりますが、誤情報が入り込んだり、情報が古くなっていることもございます。

当サイトに掲載された内容によって生じた損害等の一切の責任を負いかねますのでご了承ください。

●プライバシーポリシーの変更について

当サイトは、個人情報に関して適用される日本の法令を遵守するとともに、本ポリシーの内容を適宜見直しその改善に努めます。

修正された最新のプライバシーポリシーは常に本ページにて開示されます。