VRCでUdonSharpのギミックを作るに当たっての基礎的な部分②【ObjectのTrigger関連】

前回の記事では**Update**メソッドと**Interact**メソッドについて簡単な説明と実際の動きを確認しました。
今回はタイトルに記載した通り、**Trigger**について簡単な解説をしていきたいと思います。

※前回説明した単語については**太字にしますが註釈は入れません**。説明した単語だよってことで目印用。

## void OnTrigger～　**Trigger**に入ったりしたオブジェクトなどに対して行う処理
**void OnTriggerEnter(Collider col)※1、※2
void OnTriggerExit(Collider col)
void OnTriggerStay(Collider col)**

の3種類があります。

## できること　特定エリアにオブジェクトを運んだら○○するみたいなパズルゲーム系の処理

3つとも似たようなメソッドで、関連性があるのでまとめて覚えましょう。

Interactのときは括弧の中に何も入っていませんでしたが、今回はなにか変なものが入ってますね。
この括弧の中の部分を**引数**と呼びます。**※1**

これが割と重要なので下に軽い説明を入れておきます。
それでは実際にスクリプトを書いていきましょう。

**Unityのプロジェクトは使いまわしでいいですが、
見た目がうるさいので一度使い終わったオブジェクトは非アクティブにしておきます。**

今回のスクリプトの名前は**TriggerTest**にしておきましょう。

~~~C#

using UdonSharp;
using UnityEngine;
using VRC.SDKBase;
using VRC.Udon;

public class TriggerTest : UdonSharpBehaviour
{
 
    void Start()
    {
        
    }
    void OnTriggerEnter(Collider col)
    {
        col.gameObject.transform.localScale = new Vector3(0.5f, 0.5f, 0.5f);
    }
    void OnTriggerStay(Collider col)
    {
        col.gameObject.transform.Rotate(1f, 2f, 1f);
    }
    void OnTriggerExit(Collider col)
    {
        col.gameObject.transform.localScale = new Vector3(0.1f, 0.1f, 0.1f);
    }
}

~~~

    col.gameObject.transform.localScale = new Vector3(0.5f, 0.5f, 0.5f);
>範囲内に入ったオブジェクトのサイズが基本サイズの0.5倍になります。

    col.gameObject.transform.Rotate(1f, 2f, 1f);
>範囲内に入っている間回転し続けます。

    col.gameObject.transform.localScale = new Vector3(0.1f, 0.1f, 0.1f);
>範囲内から出たオブジェクトのサイズが基本サイズの0.1倍になります。

大体前回と同じ感じの処理なので説明は大丈夫ですね。
スクリプト側の準備はこれで終わりです。**宣言**すらありませんね。


ではUnity側に戻りましょう。
1. Hierarchy上で右クリック→3D Object→CubeでCubeを作成してください。
1. 右側のウィンドウのInspectorで、Transform→position x=0,y=1,z=0に
1. Transform→Scale x=2,y=2,z=2に
1. Box ColliderのIs Triggerの☑にチェックを入れる **※3**
1. Inspector下部のAdd Componentボタンを押してUdon behaviourを検索→追加
1. 先ほど作成したTriggerTest.assetをProgram Sourceの欄にドラッグ＆ドロップ(説明は前回参照)

![col1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708808/570ec33d-a207-aab0-5ca4-2d7f6b26577d.png)

赤枠の数字と中央のScene画面の見た目がこんな感じになってればいいです。

色も見づらいので変えましょう。

![col2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708808/3f4576ed-8fd5-425c-1141-575b68d538c1.png)

赤枠の位置あたりで右クリック→Create→Material

![col3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708808/acaa3fef-71ba-f612-74ca-7003dd7c3d18.png)

作成したNew Materialを選択して、右側のInspectorウィンドウ上のRendering modeをStandard→Transparentに。
小さい赤枠の中の白い部分をクリックして、出てきたやつのAの値(赤枠で囲んだ場所)の数値を0に。
![col4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708808/e4bc2fb9-a907-da4c-fbb4-f8ee53391177.png)


先ほど作成したCubeを選択し、New Materialを赤枠の位置にドラッグ＆ドロップ
Cubeが半透明になったので中にオブジェクトを入れても見やすくなりました。

では、このCubeの内部の判定を取る用のオブジェクトを作成します。

1. Hierarchy上で右クリック→3D Object→CubeでCubeを作成してください。
1. 右側Inspectorウィンドウ上、一番下のAdd Componentをクリック、検索欄に**VRC Pickup**と入力 **※4**
1. 候補に出てきた**VRC Pickup**を選択

![col5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708808/d92b2ffb-3c79-5ef7-3c14-6712888a9d4f.png)

4.　Transform→Positionの値をx=3,y=1,z=0に。
5.　Inspector上に追加されたRigidbodyのUse Gravityのチェックを外し、Is **Kinematic**のチェックを入れる。**※5**

では動作確認してみましょう。白キューブを持って半透明の範囲内に入ると、オブジェクトが回転したりします。

![VCC_Test-s-PC_-Mac-_-Linux-Standalone-Unity-2019.4.31f1-Personal_-_DX11_-2023-02-26-23-49-10.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708808/524f3faf-2ab5-ca64-2335-cdd457306fee.gif)

ちゃんと動いていますね。

>※1**引数**　**ひきすう**とよびます。いんすうじゃないよ
>**メソッド**の括弧に入っている型と変数の名前の組み合わせ。
>高校数学のf(x)=ax+bみたいなやつのxの部分みたいな感じで覚えとくといいかも。
>引数が無い**Interact**→スクリプトが**アタッチ**されたオブジェクトのみ対象となる。
>引数がある**OnTriggerEnter**→スクリプトがアタッチされたオブジェクトの**コライダー**の内部に入ったものが対象。
>となるので、コライダーの内部に入ったオブジェクトで処理を分けるために引数が必要となります。
>f(x)=bとf(x)=ax+bの違いみたいな。xに入った部分で処理が変わるよーって感じ。

>※2**コライダー(Collider)** 
>→オブジェクトの当たり判定のこと。わざわざ自分で当たり判定式組まなくても勝手に判定を行ってくれる便利なやつ。

>※3**トリガー(Trigger)**
>→Colliderの設定の一つ。ONにするとぶつかる判定が無くなってすり抜けるようになる。
>Colliderの範囲内に入ったりしたかどうかの判定は取得できる。

>※4**VRC Pickup** オブジェクトを持てるようにする判定。
>持てる距離とか盗めるかどうかとかの設定もできる。


>※5**Kinematic** ざっくり説明すると、重力の影響を受けるかどうかの設定部分。
>今回はOFFにしてますが、ONにしたらどうなるか実際にやってみたほうがわかりやすいかも