タグによる衝突判定のつけ方
ゲームにおいて攻撃が命中したかどうか、といったことを判定したい場合、衝突したかどうかの判定だけでなく何が衝突したのかを判定する必要があります。そうしないと壁にぶつかってはダメージを食らい、仲間同士でぶつかっては傷ついていくキャラクターができてしまいます。
衝突したオブジェクトが何であるかを判定する方法はいくつか考えられると思いますが、一つに「タグ」を利用する方法があります。
攻撃の例でいえばダメージを与えるようなオブジェクト(剣や弾丸など)に共通のタグを与え、衝突したオブジェクトがそのタグを持っていたらダメージを食らう、という方法です。
Unityでいう所の以下のような処理です。
// 何かがぶつかったら呼ばれる。
void OnCollisionEnter(Collision collision){
// ぶつかった相手のタグを取得
string tag = collision.gameObject.tag;
// タグが"Bullet"なら攻撃を食らったと判定
if(tag == "Bullet"){
// 攻撃を食らった際の処理
Destroy(this.gameObject);
}
}
上の例でいえば"Bullet"というタグを持つオブジェクトと衝突するとダメージを食らったものと判定します。
これで拳銃やライフルの弾に"Bullet"タグをつけ、壁や床には別のタグをつければ弾に当たった時だけダメージを食らうようになります。
先日UnrealEngine4でBlueprintを使用して同様の処理を作ろうとしたらあんまり情報が無かったのでご紹介します。
1.Actorにタグをつける
こちらのチュートリアルを例に話をします。
まずダメージを与えるオブジェクトである弾丸にタグをつけます。UE4のデフォルトのFPSプロジェクトに含まれている弾丸のActorはFirstPersonProjectileという名前です。
こちらをダブルクリックすると別ウインドウが開きます。 左上の"FirstPersonProjectile(self)"をクリックしてください。
右のdetailsタブを下にスクロールしていくと"Actor"という項目が出てきます。その項目の下部にある下矢印をクリックすると追加の設定項目が表示されます。
Tagsという項目が表示されますのでその項目の「+」をクリックするとタグが一つ追加されます。
タグの値を"Bullet"に編集しましょう。
編集出来たらCompileしてSaveしましょう。これでタグの追加は完了です。
2.ダメージを食らう側の判定
ダメージを食らう側の処理を作りましょう。
動画で紹介されているEvilCubeを基に改造していきます。
以下のようにしましょう。
Actor Has Tagは衝突したActorが特定のTagを持っているかどうかを判定するノードでBranchはif-else文に相当するノードです。