はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【Unity】インターフェイスを使った衝突処理をする方法

はじめに

例えばいくつかのアイテムはあり、プレイヤーがアイテムに触れるとゲットする等のなにかしらの処理が行われるという事を実装しようと思ったとき、みなさんはどのように書くでしょうか?
私はよくタグを使って書くことがあるのですが、どうしてもアイテムの量が増えるたびにタグの量をいっぱいかつコードが見づらくなることがよくあります。
そこで、今回はインターフェイスを利用してなるべく見やすいコードになるようにしてみたいと思います。

今回の流れ

衝突判定をするプレイヤーと2つのゲームオブジェクト(AppleとBanana)をアイテムとして用意して、プレイヤーがアイテムに触れるとデバッグログを出すようにしてみたいと思います。

実際にやってみよう

まずはインターフェイスを書いていきたいと思います。

using System.Collections;
using UnityEngine;

public interface IGetable
{
	void GetItem();
}

このインターフェイスは「アイテムとしてゲットできる」という意味をなしています。
せっかく作ったので早速2つのアイテムに持たせるスクリプトに実装していきましょう。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AppleScript : MonoBehaviour , IGetable {
	public void GetItem(){
		Debug.Log("Appleをゲット!");
	}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BananaScript : MonoBehaviour , IGetable{
	public void GetItem(){
		Debug.Log("Bananaをゲット!");
	}
}

こんな感じの2つのアイテムにアタッチする用の2つのスクリプトを用意してみました。
上の2つのコードをよく見てみると、MonoBehaviorの後ろにIGetableと書かれていることがわかります。
最後に衝突判定をするためのプレイヤーのスクリプトを書いていきます。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerScript : MonoBehaviour {
	private void OnCollisionEnter(Collision collision){
		var getable = collision.gameObject.GetComponent<IGetable>();
		if (getable != null) {
			getable.GetItem ();
		}
	}
}

上のスクリプトをそれぞれのゲームオブジェクトにアタッチして衝突させてみましょう。

結果

予想通りプレイヤーがりんごに衝突したときとばななに衝突したときにそれぞれ対応したデバッグログがでたのではないでしょうか?

最後に

インターフェイスを使えばいちいちタグを増やす必要がないだけでなく、簡単にアイテムを増やすこともできコードもきれいになって結構いいのではないのではないでしょうか!