【Unity初心者】関数(メソッド)説明シリーズ その3 イベント関数 使い方


環境

Unity 2019.3.7f1

はじめに

過去記事で関数(メソッド)の概略を説明しました。
https://qiita.com/Maru60014236/items/412925cdefd7a462caf8

以前紹介した関数の概略図

1.用意されている関数-返り値有-引数必要
2.用意されている関数-返り値有-引数不要
3.用意されている関数-返り値無-イベント関数-引数必要
4.用意されている関数-返り値無-イベント関数-引数不要
5.用意されている関数-返り値無-引数必要
6.用意されている関数-返り値無-引数無-①
7.用意されている関数-返り値無-引数無-②
8.自作の関数-返り値有-引数有
9.自作の関数-返り値有-引数無
10.自作の関数-返り値無-引数有
11.自作の関数-返り値無-引数無

関数(メソッド)説明シリーズ その1で"関数の作り方の基本"と8~11番の解説を行いました。
https://qiita.com/Maru60014236/items/2373c5582be82c63158f

関数(メソッド)説明シリーズ その2で1番と2番について解説を行いました。
https://qiita.com/Maru60014236/items/379635372d5ea4446c27

今回は、
3.用意されている関数-返り値無-イベント関数-引数必要
4.用意されている関数-返り値無-イベント関数-引数不要
について実際に使ってみます。

そもそもイベント関数って?

わかりやすく言い換えると
特定のタイミングで処理される関数です。

具体的には、
・オブジェクトが有効になったとき
・スクリプトがロードされたとき
・オブジェクトが破壊されるとき
・2つの物体がぶつかったとき
などです。

関数の処理内容は自分で決めることができます。

用意されている関数-返り値無-イベント関数-引数必要

では、引数のあるイベント関数をつかっていきましょう。

今回使う関数はこちら

処理されるタイミング:物理的接触が発生した瞬間(3D)
関数:void OnCollisionEnter(Collision 変数){処理内容}

この関数を使って
物体の衝突を検知したらコンソールに衝突!と表示されるようにします。
まずはこのように書きます。

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

public class test : MonoBehaviour
{
    void OnCollisionEnter(Collision a)//引数はCollision型でaを宣言
    {
        Debug.Log("衝突!");//コンソールに 衝突! と表示する        
    }
}

(今回の関数の引数は一般的にはaではなくcollisionと書いた方が共通の認識みたいです。)

この関数を使うには
・コライダーコンポーネント
・リジッドボディコンポーネント
が付いている2つの物体が必要なので

Cubeを2つ作り、それぞれのコンポーネントを追加します。(細かいやり方は割愛します。)
また、どちらかのCubeにスクリプトをアタッチしておきます。
 

Cubeを2つ作る

Cubeに
・BoxCollider
・Rigidbody
・作ったスクリプトをアタッチ

 

実行してCube同士をぶつけてみましょう。



Cube同士が接触したら関数の中身が処理され、コンソールに衝突!と表示されました。

ん?引数は何の意味があるの?

引数aはどこで使うの?って思った方。
今から使います!
今回使う引数の中身にはなんと!ぶつかった相手の情報が入っているのです。

先程書いたスクリプトにコードをいくつか追加して実際に使ってみましょう!

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

public class test : MonoBehaviour
{

    void OnCollisionEnter(Collision a)
    {
        Debug.Log("衝突!");

        GameObject b = a.gameObject;//接触した相手のGameObject情報を取得し変数bへ代入

        string c = a.gameObject.name;//接触した相手の名前を取得し変数cへ代入

        Transform d = a.transform;//接触した相手のTransform情報を取得し変数dへ代入

        Vector3 e = a.transform.position;//接触した相手の座標を取得し変数eへ代入

        Debug.Log("b="+b);//変数bの中身をコンソールに表示
        Debug.Log("c="+c);//変数cの中身をコンソールに表示
        Debug.Log("d="+d);//変数dの中身をコンソールに表示
        Debug.Log("e="+e);//変数eの中身をコンソールに表示
    }
}

 

先程と同じように実行して接触させてみます。

このようにCollision型の引数aには衝突した相手の情報がたくさん入っていることがわかります。
イベント関数さん素敵!!

用意されている関数-返り値無-イベント関数-引数不要

これはスクリプトを新規で作成すると必ず書かれている
スタート関数やアップデート関数のことです。

説明不要かもしれませんが、少し書いておきます。

スタート関数
処理されるタイミング:初回のUpdate関数が呼び出される直前の1度のみ
関数:void Start(){処理内容}

アップデート関数
処理されるタイミング:毎フレーム呼ばれる
関数:void Update(){処理内容}

このほかにもカメラやマウスに関するイベント関数が存在しています。

おわりに

いかがだったでしょうか?
イベント関数を使いこなせば理想の処理内容に近づけるはずです。
是非使ってみてください。

次回は用意されている関数-返り値無について説明します。