こんにちは、slashです。
前回に引き続き、当たり判定関連のネタです。
今回は「OnTrigger」属性を持つ当たり判定の設定についてです。
OnTriggerEnter2Dで
「OnTrigger」属性を持つ当たり判定に
接触した時の動作を作成できる
下準備
今回は前回の記事の続きなので
設置したオブジェクトなどは前回の当たり判定についての記事で
作成したものをそのまま使います。
設置のしかたがわからない場合は
前回の記事を参照してください。
前回の記事では
player、ground、enemyオブジェクトを配置し、
以下のようにコンポーネントをアタッチしてあります。
(enemyオブジェクトは今回は使いませんが一応書いておきます)
playerオブジェクト
Rigidbody2D、BoxCollider2D、PlayerController(C#Script)
groundオブジェクト
BoxCollider2D
enemyオブジェクト(※enemyは今回は使いません)
Rigidbody2D、CircleCollider2D
![](https://starslashblog.com/wp-content/uploads/2023/08/20230821-1.jpg)
それに加えて、今回は以下の画像も追加します。
![](https://starslashblog.com/wp-content/uploads/2023/08/goal.png)
OnTriggerとは?
前回の記事では
当たり判定にOnTrigger属性を持たせずに設定を行いました。
OnTriggerでないオブジェクト同士は
ぶつかった時に跳ね返る等の物理的な挙動をします。
OnTrigger属性を持つ当たり判定の場合は
接触しても跳ね返ったりする事なく
そのまま通り抜けます。
しかし、当たり判定に接触した時に
「接触した!」という情報は取得できるため、
接触したときに何らかの命令を実行させる事ができます。
OnTriggerを試す
OnTiggerの当たり判定を設定すると
どのような動作になるか試してみます。
groundの当たり判定をOnTriggerにする
groundオブジェクトにはBoxCollier2Dをアタッチされていますが、
ここでインスペクターのBoxCollier2Dの設定で
isTriggerにチェックを入れます。
![](https://starslashblog.com/wp-content/uploads/2023/08/20230821-3.jpg)
これで、地面の当たり判定にOnTrigger属性が付与されました。
実行する
実行すると、プレイヤーが重力に引っ張られて落下します。
そしてプレイヤーは地面に接触しても止まる事はなく
そのまま地面をすり抜けて下へ落ちていきます。
オブジェクトが接触する時、
どちらか片方(もしくは両方)がOnTrigger属性を持っている場合、
このようにオブジェクトはすり抜けていきます。
![](https://starslashblog.com/wp-content/uploads/2023/08/20230821-4.jpg)
OnTriggerで接触した時の動作を設定してみる
OnTriggerがどういったものか試す事はできたので
groundの当たり判定から「isTrigger」のチェックを外しておきましょう。
ゴールのオブジェクトを設置
goal画像をドラッグアンドドロップでセットします。
そしてBoxCollider2Dをアタッチし、
「isTrigger」にチェックを入れます。
![](https://starslashblog.com/wp-content/uploads/2023/08/20230821-5-1024x766.jpg)
そして、Tag>Add Tag…で
「Goal」というタグを作成し、
このタグをgoalオブジェクトに設定します。
![](https://starslashblog.com/wp-content/uploads/2023/08/20230821-6.jpg)
![](https://starslashblog.com/wp-content/uploads/2023/08/20230821-7.jpg)
ゴールに接触した時の動作を作成
ゴールに接触した時の動作を
前回の記事で作成した
「PlayerController」のスクリプトに追加していきます。
(PlayerControllerはplayerオブジェクトにアタッチされているC#Scriptです。)
PlayerControllerを以下のように更新します。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour
{
float PlayerSpeed = 0.0f;//プレイヤー速度
// Start is called before the first frame update
void Start()
{
}
void Update()
{
if (Input.GetKey(KeyCode.LeftArrow))
{
//左キーが押されている
PlayerSpeed = -0.1f;
}
else if (Input.GetKey(KeyCode.RightArrow))
{
//右キーが押されている
PlayerSpeed = 0.1f;
}
else
{
//左キーも右キーも押されていない
PlayerSpeed = 0.0f;
}
}
void FixedUpdate()
{
transform.Translate(PlayerSpeed, 0.0f, 0.0f);
}
void OnCollisionEnter2D(Collision2D collision)
{
if (collision.gameObject.tag == "Ground")
{
Debug.Log("Ground");
}
else if (collision.gameObject.tag == "Enemy")
{
Debug.Log("Enemy");
}
}
void OnTriggerEnter2D(Collider2D collision)
{
//OnTriggerの当たり判定に接触した時に実行される
if (collision.gameObject.tag == "Goal")
{
Debug.Log("Goal");
}
}
}
今回、新しく追加したのは
OnTriggerEnter2D(Collider2D collision)ですね。
これは「isTrigger」にチェックを入れた
当たり判定にオブジェクトが接触した時に
実行される内容となります。
実行してみる
ゲームを実行して動作を確認してみます。
左右キーでプレイヤーを動かしてゴールに接触させてみましょう。
ゴールの当たり判定は「isTrigger」にチェックが入っているため
プレイヤーがぶつかっても
動きが止まったり跳ね返されたりする事はありませんが、
コンソールに「Goal」のメッセージが出力されており、
接触の判定はちゃんとされている事がわかります。
![](https://starslashblog.com/wp-content/uploads/2023/08/20230821-9-1024x613.jpg)