※あくまでカビスタの備忘録なのでかなり書き方雑です。いつか整理して書き直すかも

そもそもUdonSharpってなんだ

簡単に言えばVRChatワールドのギミックを開発するのに、C#を使ってプログラミングできるというもの。

ほかのやり方には「Udon Graph」とかいうノードベースプログラムがあるがややこしいのでC#経験ありならコードベースプログラムのほうがいいかも

必要な物

もう持ってるものとして書くのでリンクは貼らない。必要なら各自ググってください

VRC SDKについては、最近だとCreator Companionを入れてると最新のが自動で適用されるらしいのでそっち使うといいかも

どうやってU#使うのか

ゲームオブジェクトにU#スクリプトを関連付ける形で使えるようになる。
流れとしては、

  1. ゲームオブジェクトを作成
  2. そのオブジェクトに「Udon Behaviour」を付ける
  3. プログラムソースに「Udon C# Program Asset」を指定し、コードを作成

なお、「Behaviour」は「ビヘイビア」と読むそうです。
「ふるまい」とかそんな意味があるらしい

ここでは、「触ったら(インタラクトしたら)オブジェクトが出たり消えたりするプログラム」を作ってみます。
同期なんかは考えないものとします。めんどくさいからね
あと、ワールドもすでに土台があるものとして書きます。

1.スイッチになるオブジェクトを作成する

ヒエラルキー上で右クリックし、「3Dオブジェクト」→「キューブ」で、キューブを作成します。
実際にはこれを触る(インタラクトする)と別のオブジェクトが出たり消えたりするようにしていきます。

オブジェクトの名前は「ObjectSwitch」とし、ワールド内のいい感じの位置に配置しておきましょう。

2.これにU#プログラムをくっつける準備をする

①さっきのオブジェクトを選択した状態で、インスペクターの「コンポーネントを追加」を選び、
検索窓に「udon」と入力→「Udon Behaviour」を選びます。
②「Program Source」の1段下にあるドロップダウンで「Udon C# Program Asset」を選んでから、
③「New Program」を押します。
④「U#プログラムが指定されてないよ!」と怒られるので、「Create Script」を押すと新規スクリプトファイル(プログラムコード)の保存先を聞かれるので好きな場所を選びます。

このあとVisual Studioが立ち上がってくるので、「ソリューションエクスプローラー」から該当のファイルを探して開いてコーディングをはじめます。

3.いよいよコーディング

作成されたコードをVisual Studioで開くと、こんな感じのコードが生成されてるはずです。
ここに色々書き込んで、自分だけの処理を作っていくわけです。


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

public class ObjectSwitch : UdonSharpBehaviour
{
    void Start()
    {
        
    }
}

void Start()は、スクリプトが有効で、Update()が最初に呼ばれる前のフレームで実行される = ワールド入場直後に1回だけ実行されるメソッドです。
入場直後になされる初期処理を書くといいかもです。

今回欲しい処理は、「オブジェクトを触ったとき = インタラクトした時」なのでそれを実行するメソッドを入れます。


public override void Interact()
{
	//ここにオブジェクトをインタラクトした時の処理
}

さて、「どこにそのオンオフ切り替えするオブジェクトがあるんだよ?」ということですが、GameObjectをクラスのpublicなメンバ変数として書いてやればUnity側のインスペクターから好きなゲームオブジェクトを指定しやすくなります。
つまりはこういうコードになります。


public class ObjectSwitch : UdonSharpBehaviour
{
    /// 
    /// オンオフの対象になるゲームオブジェクト
    /// Unity側のインスペクターで決められるようになる
    /// 
    public GameObject gameObject;
    
    // ~~以下省略~~

次に必要なのが「インタラクトされたときオブジェクトのオンオフを切り替える」処理です。
さっき書いたvoid Interact()にもどって…


    /// 
    /// インタラクトした時
    /// 
    public override void Interact()
    {
        //ここにオブジェクトをインタラクトした時の処理
        //ここでは、オブジェクトのアクティブ状態を逆転させてOn/Off切り替えする
        gameObject.SetActive(!gameObject.activeSelf);
    }

ここでやってるのは、「インタラクトされたら、対象オブジェクトのアクティブ状態を逆転させる」ということ。

最終的に全体のコードはこうなります。



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

public class ObjectSwitch : UdonSharpBehaviour
{
    /// 
    /// オンオフの対象になるゲームオブジェクト
    /// Unity側のインスペクターで決められるようになる
    /// 
    public GameObject gameObject;

    /// 
    /// 最初の一回だけ呼ばれる
    /// 
    void Start()
    {
        
    }

    /// 
    /// インタラクトした時
    /// 
    public override void Interact()
    {
        //ここにオブジェクトをインタラクトした時の処理
        //ここでは、オブジェクトのアクティブ状態を逆転させてOn/Off切り替えする
        gameObject.SetActive(!gameObject.activeSelf);
    }
}

ここまで書いてて自分がハマったポイントですが、クラス名は、.csファイルと同じ名前でないといけないということが分かりました。
コンパイルエラーでなかなか次に進めなくて…

全部書いたところで保存をかけ、Unityに戻ってみると自動でコンパイルがかかります。

さっきそのスクリプトを付けたゲームオブジェクトを選ぶと、U# Scriptの下のあたりにゲームオブジェクトを指定する欄が現れます。
そこにオンオフしたいオブジェクトを指定するとOKです。

そうそう、スイッチとなるオブジェクトにはちゃんとコライダーを付けておいてください。
手を近づけてもUse判定が出ません。

うまく動いてるかどうかは、Unityの再生ボタンを押してClientSimで確認するか、アップロードしてVRChat内で実機確認してみましょう。

作った処理を別オブジェクトで使いまわしたい

オブジェクトにUdon Behaviourを付けた後、既存のプログラムを指定するだけ…なんですがちょっと違います。
「(シーン名)_UdonProgramSources」というフォルダがAsset内にありますので、そこから使いまわしたいオブジェクトの名前のUdon C# program AssetをProgram Sourceとして指定しましょう。

広告