Edited at

Unity上で物体が衝突したら爆発する→消滅の処理

More than 1 year has passed since last update.


爆発は男のロマン

上記のとおりですが爆弾の処理はゲームオーバーや攻撃エフェクトとしては必須ですよねぇ(・∀・)

今回は物体が衝突したら爆発して、消失する処理を作ります

爆発のエフェクトは便利なAssetがあったのでそちらを使います(以下Assetへのリンク)

Simple Explosion

実はprice:0 , explosion で検索したら一発目にでてきたので使いました(;´∀`)


衝突検知からの爆発

上記のAssetを使用する場合の処理の流れは以下のようになります

衝突検知 → 消失 → 爆発エフェクトの配置

のようになります(・∀・)

爆発エフェクトの配置とありますが、上記Assetには爆発エフェクトごとprefab化してくれてます

今回は以下の私の記事で作った、万有引力のものを使って実装したのでそちらのコードを載せます

惑星から万有引力を受ける物体をUnity上で実装

衝突して消失するオブジェクトの方へ以下のコードをアタッチしました


explosion.cs

public class rocketPower : MonoBehaviour {

Rigidbody rb;
public GameObject explode;//explodeにはunity上でprefabを関連付けます
void Start () {
rb = this.GetComponent<Rigidbody>(); //衝突時にオブジェクトを消す際に使用
}
// Update is called once per frame
void Update () {
}

void OnCollisionEnter(Collision collision) //衝突時の処理
{
//Destroy(this.gameObject);
if(collision.gameObject.tag == "Planet")
//タグで限定(他のオブジェクトに衝突した場合は呼び出さない
{
rb.isKinematic = true; //位置を固定
this.transform.localScale = Vector3.zero; //みえない大きさにする
Instantiate(explode, this.transform.position, Quaternion.identity);
//ぶつかった位置にexplodeというprefabを配置する
}
}
}


タグのif文を書いたことで他のものにぶつかっても爆発しなくなります

isKineticはそこで固定する意味があります

destroyを使うことも考えたのですが、今回ロケットの位置をカメラが参照していたのでバグが起こったので今回はコードにあるとおり、スケールで縮小とiskineticをオンにすることで解決しました

普通の物体であれば、Destroyだけでよいはずです

以下のようになりました

IMAGE ALT TEXT HERE

(画像クリックで再生します)

ちなみに、タグのおかげですが、以下のように間に関係ない壁を配置すると爆発しません

IMAGE ALT TEXT HERE

(画像クリックで再生します)

記事をお読みくださってありがとうございました