チカラの技術

電子工作やプログラミング

U#の闇クラスを改良しました。【生成ツール有り】

こんにちは、元気です!

本記事は前回の記事で紹介した闇クラスの改良版の解説記事になります。
(前記事は読まなくても本記事は理解できます。)
【VRChat】UdonSharpでユーザー定義クラスをNewする黒魔術【闇クラス】 - チカラの技術

また闇クラスを自動生成する生成ツールの扱い方も解説します。

闇クラスとは

VRChatのワールドギミック開発言語「UdonSharp(U#)」は制限により通常のC#のようにカスタムクラスを作成できません。 ただし技術的な黒魔術を使えば作成は可能で、それを闇クラスと呼んでいます。

//闇クラスのインスタンス作成例
var myDarkClass = MyDarkClass.New("Jane Doe", 23);

前回からの改良内容


利用する型をobjectからDataListへ変更したことにより闇クラスの配列に対して特別な書き方をする必要がなくなり大幅に扱いやすくなりました。
また要素のindex値をintのリテラル値からenum型に変更することで編集が容易になりました。

闇クラスの生成方法

① VCCから生成ツールをインポート

① nuruwoのリポジトリーリストを以下のリンクからインストールします。(VCCアプリを閉じた状態で行います)
Install nuruwo's vpm repositories



② VCCからUnityプロジェクトにインポートします。

② 生成ツールの起動

UnityのメニューからTools -> Nuruwo -> DarkClassGeneratorを選択しします。

③ 闇クラスのファイル作成

ProjectにC#スクリプト(U#スクリプトではありません)を新規作成します。ファイル名は「MyDarkClass」とします。
(U#スクリプトとして生成した場合は同時生成されたUdon Sharp Program Assetを削除してください)

④ 闇クラスの生成

図のように生成ツールに必要な情報を入力して生成します。


生成ボタンを押すと生成されたコードがクリップボードにコピーされるので③のスクリプトへ上書きペーストします。
以上で闇クラスの作成は完了です🎉

生成結果は以下の通りです。

続きを読む

Improved U# DarkClass (Generation tool available)

Hello, I am fine!

This article is an explanation of an improved version of the DarkClass introduced in the previous article.
(You do not need to read the previous article to understand this one.)
【VRChat】UdonSharpでユーザー定義クラスをNewする黒魔術【闇クラス】 - チカラの技術

It also explains how to handle generation tools that automatically generate DarkClass.

What is the DarkClass?

UdonSharp (U#) which is VRChat's world gimmick development language, it can't the creation of custom classes like regular C# due to limitations. However, it is possible to create custom classes using a technical black magic called DarkClass.

// Example of creating an instance of the DarkClass
var myDarkClass = MyDarkClass.New("Jane Doe", 23);

Improvements since last time


By changing type to be used from object to DataList, it is no longer necessary to write special instructions for arrays of DarkClass, making them much easier to handle.
In addition, changing the index value of an element from an int literal value to an enum type has made editing easier.

How to generate DarkClass

① Import the generation tool from VCC

①Install the nuruwo repository list from the link below. (Do this with the VCC app closed.)
Install nuruwo's vpm repositories



② Import from VCC into your Unity project.

② Start the Generation Tool

Select Tools -> Nuruwo -> DarkClassGenerator from the Unity menu.

③ Create a file for the DarkClasss

Create a new C# script (not a U# script) in Project. Name the file “MyDarkClass”.
(If generated as a U# script, delete the simultaneously generated Udon Sharp Program Asset)

④ DarkClass generation

Enter the required information in the generation tool as shown in the figure to generate it.


Click the “Generate DarkClass” button to copy the generated code to the clipboard and paste it over the script in ③.
This completes the creation of the DarkClass🎉

The generated results are as follows

続きを読む

【VRChat】UdonSharpでユーザー定義クラスをNewする黒魔術【闇クラス】

こんにちは、元気です!

[ 2024/11/2更新 ] ※ 本記事で解説される闇クラスは改善されたバージョンがあるため、そちらを推奨します。以下の記事をご確認ください。
U#の闇クラスを改良しました。【生成ツール有り】 - チカラの技術

VRChatのワールドギミック開発言語「UdonSharp(U#)」はC#をベースにしていますが、利用できない機能も存在します。中でも、ユーザーが定義したクラスをNew(インスタンス化)できないことが大きな制約となっています。

タイトルにある通り本記事はUdonsharpでユーザー定義クラスをインスタンス化(New)できる方法を解説します。
厳密には特殊な方法(黒魔術)を用いた疑似的な手法ですが、複雑なデータを扱う場面では非常に実用的です。

本記事では、この特別なクラスを黒魔術で生み出された『闇クラス』と呼びます。

前置き

本記事はKoyashiroさんが開発・伝授した「闇クラス」の扱い方を解説することを目的としています。
技術的な詳細については私自身完全に把握していないためKoyashiroさんに直接お問い合わせいただくことをおすすめします。

https://twitter.com/koyashiro

闇クラスの作成・利用方法

[ 2024/10/12更新 ] 闇クラスを生成するEditor拡張を以下に作成しました。本項はスキップできます。
https://github.com/nuruwo8/vrchat-dark-class-generator

作成方法

今回は3つのフィールドを持つ闇クラス「VrcUser」を作成します。
まず通常通りU#クラスを作成し生成された2つのファイルのうち、UdonSharp Program Assetを削除します。
(削除しないと原因が特定できないエラーが発生することがあります)

以下が闇クラスのコードです。各項目の役割はコメントを確認してください。

using UdonSharp;

public class VrcUser : UdonSharpBehaviour
{
    // Newメソッド(疑似コンストラクタ)
    public static VrcUser New(string displayName, int userIndex, bool active) 
    {
        //フィールドとして順番にデータを詰めていく
        var buff = new object[] {
            displayName,
            userIndex,
            active,
            };
        return (VrcUser)(object)(buff);
    }
}

// クラス名「VrcUser」の末尾にExtを追記(拡張メソッドクラスを示す) 
public static class VrcUserExt  
{
    // フィールド読み取りメソッド
    //引数の型は「VrcUser」、返り値の名前と型は「VrcUser」のdisplayNameと同じ
    public static string DisplayName(this VrcUser v)  
    {
        // 末尾のインデックスは「VrcUser」の順序通りに指定する
        return (string)(((object[])(object)v)[0]);    
    }
    public static int UserIndex(this VrcUser v)
    {
        return (int)(((object[])(object)v)[1]);
    }
    public static bool Active(this VrcUser v)
    {
        return (bool)(((object[])(object)v)[2]);
    }

    // フィールド書き込みメソッド
    //第一引数の型は「VrcUser」第二引数の型は「VrcUser」のdisplayNameと同じ
    public static void SetDisplayName(this VrcUser v, string val)    
    {
        // 末尾のインデックスは「VrcUser」の順序通りに指定する
        ((object[])(object)v)[0] = val;     
    }
    public static void SetUserIndex(this VrcUser v, int val)
    {
        ((object[])(object)v)[1] = val;
    }
    public static void SetActive(this VrcUser v, bool val)
    {
        ((object[])(object)v)[2] = val;
    }
}

なお、闇クラスはGameObjectにAdd Componentする必要はありません。

利用方法

作成した闇クラスは以下のように通常のUdonSharpクラスから利用できます。

続きを読む

【VRChat】ワールドギミック作成TIPS【U#】

ギミック作成時のTIPSや不具合対策が溜まってきたのでまとめます。
VRChatの開発環境は絶えず更新されていくため情報が古くなっている可能性があることはご留意ください。
(ご指摘のコメントお待ちしています)

UdonSharp (U#)

Class Exposure Tree

U#で使用できるビルドインのC#クラスを確認できます。
ビルトインメソッドはU#よりも遥かに高速なのでパフォーマンスが向上します。


使用できるクラスは緑色、使用できないクラスは赤色で示されます。
]

公式ドキュメント
Class Exposure Tree | UdonSharp

不具合対策:同期変数の初期化待ち

2022年末頃からジョイン時の同期変数の初期同期が完了するまでstart()から10秒程掛かるようになっています。
その前に同期変数を操作するとギミックが壊れる可能性があるため、ギミックは同期待ち処理が必要です。

続きを読む

【VRChat】UdonJwtの使い方【改ざん対策】

本記事はVRChatで利用できるJwtライブラリの「UdonJwt」の解説記事になります。

想定読者:Downloading系APIを利用するギミックを制作していてローカルの改ざんを防止したい人。

本記事は導入方法の解説がメインですのでU#とJWTについての基礎知識は前提となりますのでご了解ください。
(ハッキリ言って普通のU#ギミックより難しいです。ギミックの特性上必要な構造なので・・・)

概要

UdonJwtは公開鍵署名検証を実現するU#ライブラリです。
作者はkoyashiroさん (koyashiro (@koyashiro) / Twitter)。

主な仕様:

  • 公開鍵でトークンの署名を検証します。秘密鍵で署名する機能は実装されていません。
  • 署名アルゴリズムはRS256 [鍵長2048bit] のみサポート。他のアルゴリズムの指定はエラーとなります。
  • 公開鍵はpem形式の文字列を受け付けます。
  • トークンに'exp' payloadを持つ場合、VRChatのサーバー時間APIを使用してトークンの有効期限を検証します。
  • 現在のバージョンはV0.1.5

改ざん対策としてUdonJwtを利用する場合のシステム構成図を示します。


用途例: Donwloading系APIのデータ改ざんを拒否できる。(現在、中間者攻撃が確認されています。詳細は前回の記事を参照ください。)
注意点: 現状のUdonの処理速度が遅いため、署名検証処理に数秒掛かる。データが大きい場合はハッシュ化して利用するなど工夫が必要。
     (図ではトークンにハッシュを入れてデータと分けて送っている)

続きを読む

【VRChat】Discordメンバーのみ自動開錠する鍵ギミックを作りました【無料配布】

こんにちは、元気です!

今回も鍵ギミックの制作と配布ですが、VRChatの新機能のおかげで過去最高のものが出来ました!

本記事の構成

  • ギミックの紹介と配布
  • ギミックの仕組み解説
  • セキュリティ対策 (中間者攻撃や改ざん対策など)

それでは行ってみましょう!

ギミック概要

Udonで出来たオートロック、UdonAutoLockです!


概要はDiscordを日常的に利用する方ならこの画像一枚で分かると思います。



VRChat側:
ワールド入室後10秒で自動開錠します。操作不要なのでこれ以上簡単になりようがないですね!
開錠したメンバーは操作パネルで同インスタンスの人を開錠できます。(機能有効時)



Discord側:
VRChat名の登録はメンバー本人にして頂くため、discordサーバー管理者は開錠させたいメンバーにロールを付与するだけです。
登録後は約1分でワールドに反映されます。もちろんワールドの更新は不要です。

セキュリティ機能:
開錠データは難読化(ハッシュ化)されます。
また後述しますが偽の開錠データを防ぐ機能なども備わっています。

その他、ギミックの設定やbotの運用方法は配布物のマニュアルを確認して頂ければと思います。

配布先

ギミック

配布先はこちらです。

booth.pm


マニュアル付属で記事を読まなくても使えます。是非使って頂ければ!
またギミックのライセンスはCC0で自由に改変・再配布可能です。

※ VRChat公式のモデレートガイドラインの対応については導入マニュアルの序章に記載しています。

Discord-bot

公開botを用意していますのでそちらをDiscordサーバーに導入して頂く形になります。
(導入URLはギミック同梱のマニュアルに)

さらに自分でbotを運用したい方のためにbotのコードもGitHubにてCC0で公開しています。

github.com


(なおbotはwebsocketで接続するので運用に固定グローバルIPアドレスは不要です。)

実績:
本ギミック及びbotは開錠メンバー200人以上のDiscordサーバーで10日前からテスト運用され基本的なバグは修正済みです。

デモ・サポートサーバー:
こちらのDiscordサーバーでUdonAutoLockのデモ体験や技術サポートを行っているので良ければ!(入退室自由です)
discord.gg

続きを読む

【VRChat】リッピングでパスワードギミックが破られるので公開鍵を利用した対策品を作りました【無料配布】

こんにちは! 本記事はVRChatのワールド向けパスワードギミックの紹介・配布記事になります。

まず結論から:要点とギミック配布

従来のパスワードギミックはリッピング(VRChatのデータを不正にダウンロードする行為)によってパスワードが簡単に抜かれてweb上に公開され、誰でも開錠可能になってしまうことが分かりました。

今回その対策としてJWT(公開鍵を利用した検証技術)による新しいパスワードギミックを作成しました。ワールドデータにパスワードを置かないためリッピング耐性があります。従来のパスワードギミックの置き換えとして使用でき、オプションでパスワードの漏洩対策もできます。


こちらで無料配布しています。(MITライセンスで改変・再配布可能です)

power-of-tech.booth.pm
※ VRChat公式のモデレートガイドラインの対応についてはマニュアルの序章に記載しています。

ワンタイムパスワードシステムも新ギミックで稼働します。こちらのサーバーがデモと利用申請の窓口になります。(10名まで)
discord.gg

2023年03月11日11:20 追記:利便性の向上のためワンタイムパスワードシステムはUdonAutoLockに切り替えています。以下ご確認ください。
【VRChat】Discordメンバーのみ自動開錠する鍵ギミックを作りました【無料配布】 - チカラの技術

本ギミックのコアライブラリ(UdonJwt)はkoyashiroさんに作成して頂きました。
https://twitter.com/koyashiro

詳細:開発経緯と技術解説

本記事は経緯と技術説明を交互に行う構成になっています。興味のある見出しを見てもらえればと思います。(もちろん読まなくても配布ギミックは使えます)

経緯①:公開初日にワンタイムパスワードシステムが破られた

今から約1カ月半前、ワンタイムパスワードシステム(以下OTP)の記事とデモを公開しました。(本記事の理解にはタイトルだけ見れば大丈夫です)

power-of-tech.hatenablog.com

そして公開からわずか数時間後に続々と報告が・・・

秘密鍵ってこれですよね?

・・・それです。

続きを読む