こんにちは、yasuakiです。普段はWebシステム開発系の記事を書いています。
Unityでゲームを作成したということもあり、Unity 2Dについても少しずつ記事を書いていきたいと思います。
今回はUnity 2Dで当たり判定をする方法を解説してみました。
サンプルコードもgithubのこちらにあげています。
検証に使用しているUnityのバージョンは’2021.1.19f’です。
Unity 2Dで当たり判定をする
今回は自転車に乗ったプレイヤーが右から左に動いて、プレイヤーが生肉に当たると、生肉が消失するというゲーム(?)を作成しました。
Unityでは配置したオブジェクトに対して、コンポーネントを追加することで、様々な効果を付加することができます。
プレイヤーにはRigidbody 2DとBox Collieder 2Dを付加しました。
生肉にはBox Collieder2Dを付加しています。
Rigidbody 2Dは、物理的な挙動をつけることができるコンポーネントです。(重力など)
Box Collider2Dは、付加しているオブジェクト同士がぶつかると、当たり判定を行うことができるようになるコンポーネントです。
次項からオブジェクトを配置した後に、コンポーネントを追加して、当たり判定のスクリプトを書くところまでを説明します。
オブジェクトにコンポーネントを追加する
まず、それぞれの画像をSceneに配置します。
配置した後に、配置したオブジェクトに対して、inspector => Add Componentからコンポーネントを追加します。
このように選択した後に、Physics 2DからRigidbody 2Dと、Collider 2Dを追加します。
下記のようになります。それぞれのプロパティに設定している値はそのままで大丈夫です。
下の方に草のブロックを設定していますが、これに対してもBox Collider 2Dを設定しておきます。
Box Collider 2Dをオブジェクト同士に設定しておくことで、通り抜けなくなります。
プレイヤーにRigidbodyとBox Colliderを設定しているので、Rigidbodyの重力で上から落ちてきて、Colliderで草ブロックに着地するようになります。
こんな感じです。
生肉に対しても同じように、それぞれ、BoxCollider 2Dを設定します。
判定のためのタグを追加する
当たり判定をするときに、どのオブジェクトに当たったか判断できるように、オブジェクトに対してタグを追加します。
今回は生肉だけが判定対象なので、生肉に対して下記のようにタグを追加します。
Meatというタグと追加して設定しました。
これでスクリプトの中で「生肉にオブジェクトにぶつかった場合は〜する」という判断ができます。
生肉のIsTriggerをオンにする
生肉のBox Collider 2Dのis triggerをオンにします。
すり抜けるタイプの判定になります。重なった場合に判定されます。
キャラクターにスクリプトを追加する
キャラクターを動かすのと、生肉を消失させるためにスクリプトを追加します。
スクリプトに書いたプログラムで、当たった場合に消す処理とキーボードの入力で動くようにします。
最初にAdd Component
からNew Script
を選択します。
名前を入力するようになるので、今回はPlayerControllerという名前でスクリプトを作成しました。
下記のようにスクリプトが追加されました。
キャラクターに当たり判定と移動するスクリプトを編集する
追加したスクリプトを編集して、キャラクターに当たり判定とキーボード移動できるようにします。
ProjectのAssetsの中にスクリプトが入っているので、エディタで編集します。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class PlayerController : MonoBehaviour
{
private Rigidbody2D rigidBody;
private void Start()
{
rigidBody = GetComponent<Rigidbody2D>();
}
private void Update()
{
float x = Input.GetAxis("Horizontal");
if (x > 0)
{
rigidBody.AddForce(transform.right * 8.0f);
}
else if (x < 0)
{
rigidBody.AddForce(-transform.right * 8.0f);
}
}
private void OnTriggerEnter2D(Collider2D other)
{
if (other.gameObject.CompareTag("Meat"))
{
other.gameObject.SetActive(false);
}
}
}
Startメソッド
Startメソッドはゲームが開始された時に呼ばれます。
GetComponent<Rigidbody2D>();
でスクリプトを紐付けたオブジェクトのRigidbody 2Dコンポーネントを読み込み、’rigidBody’に設定しています。
Updateメソッド
Updateメソッドはゲーム実行時に毎回呼ばれます。
Input.GetAxis("Horizontal");
で、入力した内容を取得します。
キーボードの矢印の左を入力すると、xには-0.1から-1に近づいて入力されます。
キーボードの矢印の右を入力すると、xには0.1から1に近づいて入力されます。
左を押すとrigidBody.AddForce(-transform.right * 8.0f)
が働いて、左に力が加わって動きます。
右を押すと逆にrigidBody.AddForce(transform.right * 8.0f);
が働いて、右に力が加わって動きます。
Rigidbody2Dを使うことで、加速度を使って動くような表現になります。
OnTriggerEnter2Dメソッド
OnTriggerEnter2Dメソッドは生肉とプレイヤーが衝突した場合に発生します。(Colliderが設定されていて、Is Triggerになっているものに当たった場合です)
other.gameObject
で当たったゲームのオブジェクトが取得できます。
CompareTag("Meat")
で当たったオブジェクトのタグが”Meat”だった場合に中の処理をしています。
生肉(“Meat”)だった場合、SetActive(false)
にして画面から消しています。
今回はUnity 2Dでオブジェクトの当たり判定をする方法を見ていきましたが、いかがでしたか。
これで、キーボードで移動し、生肉に当たった場合は生肉が消えるというゲーム(?)が完成しました。
Unityの機能を使って簡単に当たり判定をつけることができました。
Colliderオブジェクトが当たったときに判定する
今回はIsTriggerを使用しましたが、単純にBox Colliderが当たった場合でも判定可能です。
OnCollisionEnter2D
を使って、判定するオブジェクトとCompareTagで設定されたタグをくらべます。
Trueの場合に当たったということになるので、その中でやりたい処理を書きます。
private void OnCollisionEnter2D(Collision2D other)
{
if (other.gameObject.CompareTag("タグ名"))
{
// 行いたい処理
}
}
コメント