5
4

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 3 years have passed since last update.

プログラマじゃない人向けUdon講座(鏡の出し入れ発展編)

Posted at

前回:鏡の出し入れ

目標

EnterTrigger/ExitTriggerを使ってみる

ほんへ

近づいたら鏡を表示する

「近づいたら」と言っていますが、実際は**「トリガーに侵入したら表示する」**です。

手順

1,コライダー(トリガー)を設置する
2,コライダーにスクリプトを当てる
3,コーディングする

1,コライダーを設置する

まずは鏡が表示される範囲を示すオブジェクトを配置します。
image.png
分かりやすい名前に変更し、(一応)マテリアルを変更します。
image.png
サイズ変更、移動を行い、「Is Trigger」のチェックを付けます。
「Mesh Renderer」のチェックを外していますが、気になる人は「Mesh Renderer」を削除しても問題ありません。

2,コライダーにスクリプトを当てる

前回と同じです。
image.png

image.png

image.png

3.1,コーディングする

以前は「Interact」を用いましたが、今回は「OnPlayerTriggerEnter」を用います。

MirrorTrigger.cs
    

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

public class MirrorTrigger : UdonSharpBehaviour
{

    //鏡オブジェクト
    [SerializeField] private GameObject Mirror;

    void Start()
    {
        
    }

    public override void OnPlayerTriggerEnter(VRCPlayerApi player)
    {
        //鏡をOnにする
        Mirror.SetActive(true);
    }
}

その後、Mirrorを設定します。
image.png

一応完成です。アップロードして様子を見ましょう。
image.png
出ましたね。離れても消えませんが。
ついでに言うと、現状では自分以外のプレイヤーが入った場合でも表示されてしまいます。

まずは自分が入ったときにのみ反応するように改良しましょう。

3.2コーディングする(自分が入ったときのみ反応させる)

image.png

IF文を追加します。IF文を用いることにより、条件分岐が可能になります。
「プレイヤーが侵入した場合、鏡を表示する」という動作を、
「プレイヤーが侵入した場合、**そのプレイヤーが自分だった場合、**鏡を表示する」に変更します。

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

public class MirrorTrigger : UdonSharpBehaviour
{

    //鏡オブジェクト
    [SerializeField] private GameObject Mirror;

    void Start()
    {
        
    }

    public override void OnPlayerTriggerEnter(VRCPlayerApi player)
    {
        //トリガーに侵入したのが自分だった場合
        if (player == Networking.LocalPlayer)
        {
            //鏡をOnにする
            Mirror.SetActive(true);
        }
    }
}

これでOKです。次は、プレイヤーが離れた時に非表示にしましょう。

離れたら鏡を非表示にする

「onPlayerTriggerExit」を用います。
他のプレイヤーが離れても反応しないよう、上記同様にIf文を追加しています。

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

public class MirrorTrigger : UdonSharpBehaviour
{

    //鏡オブジェクト
    [SerializeField] private GameObject Mirror;

    void Start()
    {
        
    }

    public override void OnPlayerTriggerEnter(VRCPlayerApi player)
    {
        //トリガーに侵入したのが自分だった場合
        if (player == Networking.LocalPlayer)
        {
            //鏡をOnにする
            Mirror.SetActive(true);
        }
    }

    public override void OnPlayerTriggerExit(VRCPlayerApi player)
    {
        //トリガーに侵入したのが自分だった場合
        if (player == Networking.LocalPlayer)
        {
            //鏡をOffにする
            Mirror.SetActive(false);
        }
    }
}

これでOKです。

解説

今回用いたメソッドでは、引数があります。
「VRCPlayerApi player」がソレです。

MirrorTrigger.cs
  public override void OnPlayerTriggerEnter(VRCPlayerApi player)

「VRCPlayerApi型」の「player」を意味しています。変数の宣言と同様です。
この「player」には、「誰がトリガーに入ったか/出たか」の情報を持っています。

If文の基本的な構文は以下の通りです。

sample.cs
  if(条件式)
   {
      //Trueの時に行いたい処理(条件式が成り立つ時)
   }
   else
   {
      //Falseの時に行いたい処理(条件式が成り立たない時)
   //省略可能
   }

今回の条件式は以下の通りです。
「Networking.LocalPlayer」は、自分を意味しています。

MirrorTrigger.cs
          //トリガーに侵入したのが自分だった場合
        if (player == Networking.LocalPlayer)
        {
            //鏡をOnにする
            Mirror.SetActive(true);
        }

条件式で用いられている「==」は、比較演算子と呼ばれます。
「==」は、左辺と右辺が一致している場合にTrueを返します。つまり、
「player」が「Networking.LocalPlayer」と同じだった場合、{ }の中の処理を行います。

シメ

今日はIf文が出て来ました。かなりよく使います。
(スコアが一定以上の時に処理、キーがOnの時にドアを開ける、等…)
プログラミングで大切なのは応用力です。最初はよく分からなくても、原理を理解すれば応用が出来ます。
挫折しないよう、理解できる友達を作って挑戦しましょう。

5
4
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
5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?