【Unity2d】衝突判定をトリガーとしたスクリプトの書き方
こんにちは。なおキーヌです。
ブログ毎日更新は346日目になります。
前回は武器を振って衝突判定を実装するところまでやりました。
今回はBoxCollider2DのisTriggerのチェックボックスにチェックを入れて物理演算を切った状態で
スクリプトによる衝突判定の処理を構築していきましょう。
武器が敵に当たったときのフローを考えてみよう
実際に処理を作る前に流れを考えてみましょう。
- 攻撃ボタンを押す
- 攻撃アニメーション開始
- 攻撃の衝突判定(以下攻撃判定)がアニメに沿って動く
- 攻撃判定が敵の衝突判定に触れる
- 敵の衝突判定のどのへんに最初に触れたのかを調べる
- 衝突した箇所の真逆にスピードを加算する
- 当たった瞬間は早く離れる程原則する
- HPが0になったら消滅エフェクト
といった一連の流れでしょうか。
キッチリ作るとしたらベクトルの計算やら摩擦の計算やらで
物理演算無しだと結構面倒臭い処理が待ち構えています。
とりあえず簡素化して必要であればステップアップとしてベクトル計算やらを組み込んでみると良いでしょう。
今回は衝突判定に触れた時に何をするかという処理を作ってみましょう。
OnTriggerEnter2Dを使ってみよう
OnTriggerEnter2Dを定義したスクリプトをアタッチしたオブジェクトが
他の衝突判定に触れた時(正確には衝突判定同士が1pxでも重なったとき)に呼び出されます。
基本的に当たった側で処理したほうが楽なので、とりあえず敵オブジェクトを作成し
衝突判定を処理するだけのスクリプトをアタッチしてみましょう。
まずはヒエラルキー上のcanvasの直下、つまりプレイヤーと同じ階層に「Monster」という空オブジェクトを作ります。
そしてその子となるようにモンスターを作成していきます。
というのも、例えばフィールドに落ちているアイテムを拾ったら画面上の敵を一掃したい
といったときに処理が楽そうですし、イベントに入ったとき親オブジェクトを停止すればモンスターは全部止まるという仕組みも作られそうです。
今はあまり気にしなくてもいいですが、オブジェクトは親子関係を作っておくと色々扱いやすくなります。
私はちょこちょこサムネでも登場しているコブリンくんを敵として迎えました。
数年前にドット絵描いてたときのやつを流用しています。
それでは早速衝突判定を処理するスクリプトを作ってみましょう。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SmallEnemyCollision : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
private void OnCollisionEnter2D(Collision2D other) {
Debug.Log("ダメージ!");
}
}
これをモンスターオブジェクトにアタッチして触れるか攻撃で衝突判定を触れさせてみてください。
デバッグログに「ダメージ!」って出れば衝突判定が正常に行われています。
OnCollisionEnter2Dの特徴は動いたら1回だけ発動です。
後は触れ続けてても発動しません。
ずっと衝突判定を取りたい場合(継続ダメージを与えられるような武器とかにつかえる)は「OnCollisionStay」を使います。
最初のうちはOnCollisionEnter2Dで対応しておけばよいでしょう。
そのうちやりたいことが増えてくると思うのでその時必要な関数を定義してあげるのがベストです。
敵にアタッチするスクリプトについて
衝突判定をオブジェクト単位で認知することができました。
後は認知した側でオブジェクトを操作すれば完璧です。
今は衝突判定専用のスクリプトにしていますが、移動スクリプトを継承してそれぞれprivateで判定を組み込んでしまってもいいかもしれません。
敵に関しては消えたり現れたりすると思うので、基本的にプレイヤーと違って
マネージャーではなくオブジェクト単位で処理して完結するのが理想でしょう。
次回はモンスター用のスクリプトを作って衝突判定によってモンスターを動かしたりしてみましょう。
それでは。