1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2023-02-26

前回の記事では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にしておきましょう。


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を作成してください。
  2. 右側のウィンドウのInspectorで、Transform→position x=0,y=1,z=0に
  3. Transform→Scale x=2,y=2,z=2に
  4. Box ColliderのIs Triggerの☑にチェックを入れる ※3
  5. Inspector下部のAdd Componentボタンを押してUdon behaviourを検索→追加
  6. 先ほど作成したTriggerTest.assetをProgram Sourceの欄にドラッグ&ドロップ(説明は前回参照)

col1.png

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

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

col2.png

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

col3.png

作成したNew Materialを選択して、右側のInspectorウィンドウ上のRendering modeをStandard→Transparentに。
小さい赤枠の中の白い部分をクリックして、出てきたやつのAの値(赤枠で囲んだ場所)の数値を0に。
col4.png

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

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

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

col5.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

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

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

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

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

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

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

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?