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

U#でオブジェクトの表示/非表示

Last updated at Posted at 2023-10-06

目次
1.準備
2.スイッチの処理を書く
3.動作確認する
4.解説
?.おまけ(Nullチェック)

VCCバージョン2.1.3、Unityバージョン2019.4時の状況で解説してますが、VCCの大規模アプデが来ない限り2022になっても大して変わらないと思います。

プロジェクトの準備やU#の準備がそもそも分からないという方は、以下の記事を参考にしてみてください。

1.準備

スイッチ用のキューブを設置

まず前回の記事同様に、Cubeをワールドに置きます。
このCubeはスイッチとして扱うので、大きさはXYZ共に0.2くらいにしましょう。

ミラーの設置

Projectフォルダでmirrorと検索すると「VRCMirror」というプレハブが見つかるのでこれをシーンに置きましょう。
MirrorAsset.png

検索しても見つからない時はVRCWorldプレハブの時同様、Search:の右がAllになっていることを確認しましょう。

スクリーンショット 2023-10-02 231407.png

スクリプトの作成

今回はオブジェクトの切り替え役を作るので、ファイル名はObjectSwitchなどにしましょう。

2.スクリプトを書く

ObjectSwitch.cs の中身を書いていきます。
後から解説するので、一旦コピペで良いです。

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

public class ObjectSwitch : UdonSharpBehaviour
{
    // 対象オブジェクト
    [SerializeField] private GameObject _targetObject = null;


    // スイッチが押されたら動作する
    public override void Interact() 
    {
        // 表示/非表示を切り替える
        _targetObject.SetActive(!_targetObject.activeSelf);
    }
}

書き終わったら、Ctrl + Sで保存です。毎回言います。

3.動作確認する

処理をスイッチにアタッチする

前回の記事でやったようにCubeUdon Behaviourというコンポーネントを追加し、Program SourceにObjectSwitchをアタッチします。

ここまでは前回と同じです。

ObjectSwitch (U# Script)の下側にあるTargetObjectに、VRCMirrorプレハブをアタッチします。
VRCMirrorAttach.png
これで準備完了です。再生ボタンを押して動作確認してみましょう。
スイッチをクリックするとミラーの表示を切り替えれるはずです。
スクリーンショット 2023-10-02 233512.png
スクリーンショット 2023-10-02 233519.png

4.解説

変数

ではまず上から...

    // 対象オブジェクト
    [SerializeField] private GameObject _targetObject = null;

長ったらしく書いてますが、ここはGameObjectを入れる箱を用意しています。
GameObjectを入れる為の箱を用意するよ。箱の名前は_targetObjectね。
ってかんじです。

このような箱のことを、変数といいます。
整数ならint、少数ならfloat、文字列ならstring、オブジェクトならGameObject型といった、型が必ず必要です。

その先頭に [SerializeField] を付けると、インスペクターにこの箱が空の状態で現れます。
試しに [SerializeField] を消してUnityEditorに戻ると、TargetObjectの欄は消えてると思います。

↑を試した人は、忘れずに削除した文字を書き直し、UnityEditorに戻って、VRCMirrorをアタッチする作業をしなおしてください。

ちなみに以下の書き方でも同じことができますが、個人的には [SerializeField] private ... の方が好きです。
(ゲーム開発者の人はそうですよね??)

    // 対象オブジェクト
    public GameObject _targetObject = null;

Interact

続いて実際のスイッチの処理です。

    // スイッチが押されたら動作する
    public override void Interact() 
    {
        ...
    }

Interact() の中は、このオブジェクトがUseされた時に処理されます。
この中にオブジェクトの表示/非表示の処理を書けば、スイッチとして動作させることが可能です。

    // 表示/非表示を切り替える
    _targetObject.SetActive(!_targetObject.activeSelf);

SetActive

gameObject.SetActive()には、trueかfalseを入れることでそのオブジェクトのアクティブ状態を変えることができます。

trueかfalseかが入る変数の型を「bool型」と言います。
ON/OFFの切り替えでよく使われます。

アクティブにする場合

gameObject.SetActive(true);

非アクティブにする場合

gameObject.SetActive(false);

アクティブ状態って何? というと、みなさんがUnityでよく見るこのチェックマークです。
MirrorActive.png
チェックが付いてると表示。何もなかったら非表示になるアレです。
動作確認をしながらVRCMirrorのインスペクターを見てると、ここのチェックが切り替わっているのが分かると思います。

gameObject.activeSelf は、そのオブジェクトのアクティブ状態をbool型で教えてくれます。
それの先頭に!をつけると、bool型を反転してくれます。

これで表示/非表示を切り替える仕組みになっています。

?.おまけ

Nullチェック

今回は初心者がよくしがちな、あるあるなエラーとその対処について書きます。

アタッチし忘れ。です。

まず、スイッチ役のCubeのTargetObjectにアタッチされているミラーを外しましょう。
MirrorNone.png

そして実行してスイッチを押してみると、ミラーのアクティブが切り替わりません。
Consoleウィンドウにはエラーが出ています。
image.png
Udonがこのようにエラーを吐くと、そのギミックは二度と動きません。
試しにスイッチをもう一回押しても、エラーはこれ以上増えません。

今回のような簡単な処理ではあまり気になりませんが、今後大きいギミックを作る際には、途中でエラーを吐いても動作はし続けるようにする必要があります。

今回のエラーの内容は、「SetActiveしようとしたけど、その対象のオブジェクトがNullだよ(無いよ。)」です。

じゃあ、オブジェクトが無くても処理が動くようにしましょう。

Nullでも動くように、コードを修正

    // スイッチが押されたら動作する
    public override void Interact() 
    {
        // _targetObjectの中身がnullじゃない時に処理する
        if (_targetObject != null)
        {
            // 表示/非表示を切り替える
            _targetObject.SetActive(!_targetObject.activeSelf);
        }
        else
        {
            // ログを出力する
            Debug.Log("TargetObjectがアタッチされていません。");
        }
    }

以下の書き方でも同じ動作になります。

    // スイッチが押されたら動作する
    public override void Interact() 
    {
        // _targetObjectの中身がnullだったら、ここで処理を終える。
        if (_targetObject == null)
        {
            // ログを出力する
            Debug.Log("TargetObjectがアタッチされていません。");
            return;
        }
        
        // 表示/非表示を切り替える
        _targetObject.SetActive(!_targetObject.activeSelf);
        
    }

コピペしたらCtrl + S。絶対。

これで実行すると、エラーの代わりに自分で書いたログが出力されます。
エラーで止まることも無いので、何回押してもログが出力されます。
image.png

Debug.Log()はEditorでしか確認できませんが、処理がどこまで走っているかを確認したり、変数の動きを確認したりできます。
便利なので最初のうちはガンガン使いましょう。
慣れてきたと思ったら、偶に使うくらいが良いかも。

0
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
0
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?