1.はじめに
地雷・機雷で爆発させるのはいいが、爆風などで周辺を巻き込むことはできないかと思い調べたら方法があったので、アウトプットする
2.やり方
赤Cube:爆発の中心
白Cube:障害物。RigidbodyをAddComponent・TagをCubeに設定
という形で配置をした。白CubeにはRigidBodyをコンポーネント
###3.スクリプト
以下のスクリプトを作成して赤CubeにAddComponentする。
public class Explosion : MonoBehaviour
{
public float radius = 5;
public float upwardModifier = 0f;
public float explosionPower = 100;
void Start()
{
Destroy(gameObject);
}
private void OnDestroy()
{
Collider[] col = Physics.OverlapSphere(gameObject.transform.position, radius);
foreach (var colliders in col)
{
if (colliders.gameObject.tag == "Cube")
{
colliders.gameObject.GetComponent<Rigidbody>().AddExplosionForce(explosionPower, gameObject.transform.position, radius, upwardModifier, ForceMode.Force);
}
}
}
}
###4.OverlapSphere
Collider[] col = Physics.OverlapSphere(gameObject.transform.position, radius);
transform.position(中心)から半径radius(m)の球体にあるColliderを配列で返す
実際に配列に入っているのかわからないので、すぐ下に以下を追加して確認してプレイしてみる
for (int i = 0; i < col.Length; i++)
{
Debug.Log(col[i].transform.position);
}
プレイした結果しっかりと配列に格納されていることがわかる(原点はTerrain)
###5. AddExplosionForce
foreach (var colliders in col)
{
if (colliders.gameObject.tag == "Cube")
{
colliders.gameObject.GetComponent<Rigidbody>().AddExplosionForce(explosionPower, gameObject.transform.position, radius, upwardModifier, ForceMode.Force);
}
}
名前のとおりRigidbodyを使って爆発を再現する。配列なのでForeach・For等を使う。
AddExplosionForceの中身は以下を参照
AddExplosionForce(爆発力(float), 爆発の中心(Vector3), 爆発の半径(float), 爆発による上昇値(float), ForceMode)
Tagは周辺にRigidbodyが付いていないオブジェクトがある場合MissingComponentExceptionが出る。
###6.結果
###7.まとめ
爆発させるアセットと組み合わせれば、かなり見栄えの良いものができると思う。ただ遮蔽物を通した場合に影響されないケースも考慮しないといけないので、それらも今後加筆しておく。