VR,VRChat,VRCSDK3

やりたいこと

vrchat 用のワールドで、クリックするとランプが点灯するなどの仕掛けがあります。
物はアセットやBOOTHで入手したものを使用することができます。
ランプなど、クリックすると点灯する仕掛けがあるものもあります。

ランプをクリックしたり部屋の電気をつけた状態が他人の同じワールドにいる人からも同じ状態になっていてほしいことがあります。

cyan_trigger というのを入れることで、プログラミングやノードの操作(UDON)無しに作りこむことができます。

ゴール

2人でテスト用のワールドに入ってからネコミミの子がランタンをクリックしてランプをつけた状態です。
別のPCで別アカウントで同じワールドに入ってみて、ランタンが点灯しているのを確認したのが下の画像です。
後からワールドに入った人がランタンをクリックして消灯したり点灯したりしても、最初に入った人で見ても同期されているのを確認できました。

VR,VRChat,VRCSDK3

vrchat 用ワールドのイベント処理

ボタンを押したときの同期のしかたですが、Udonsharp は直に使わず、cyan_trigger を使ってます。
以下のようにしてみました。合ってるかわかりませんが動いています。
UI の同期のしかたがわからないので、球体をボタンにしてます。
Unity で普通に UI を作り大きさを合わせて設置します。
ラジオボタンの位置に球体を適当に大きさを合わせて設置します。
球体にAdd ComponentからCyan Triggerを追加します。
Add EventからInterructを指定して挿入します。ここではLocal のままにします。
Actionsにオーナーを設定するためのNetworking.SetOwnerと、他のCyan Triggerにイベントを送るためにSendCustomEventを追加します。
Cyan Trigger の0.4以降からはCyan TriggerのSendCustomEventはなくなっており、UdonBehaviour.SendCustomEventになっています。
SetOwnerにはLocal Playerとイベントの送り先Sub_Spaceにします。
(このワールドでは宇宙の中を移動するために、宇宙のほう(Sub_Space)を移動させて、自分がいる宇宙船はUnityの中では動かさないようにしています)
SendCustomEventではInputの一覧に、ヒエラルキーからSub_Spaceのオブジェクトをドロップして指定して、_Set_Earthを指定します。
他のボタンも似たようにします。
このワールドでは各シーンを指定できます。各シーンに応じた惑星を移動させたり、宇宙船などのオブジェクトを動かします(アメリカ映画のインターステラーの再現ワールドです)。

Sub_Spaceオブジェクトの設定をします。
Add ComponentからCyan Triggerを追加します。
シーンの状態を示すint変数を追加します。
Variablesの下の+を押してint変数を追加して名前(sub_space_state)を指定します。
最初は1が選択されるので1を指定します。横の設定値は「Synced」にします。
メニュー選択後に他の人がJoinしてきたら、今選択されている番号のシーンに切り替わりましたが、アニメーションは最初から再生されました。
別途アニメーションの再生位置も同期しないといけないことがわかりました。ここでは無視して先に進みます。

Cyan Triggerのカスタムイベントを定義します。
Add EventからCustom Eventを指定して、Nameに_Set_Earthを記載します。
このイベントの処理はCyan Triggerの変数を変更するだけにします。☆マークのvalue -> int -> int.setを指定します。
inputに設定する値とoutputにCyan Triggerの変数を指定します。これをシーン分つくります。

次に、変数が変化したときの処理を作ります。
Add EventでData -> OnVariableChangedを追加します。変数の値が変化したときに動くイベントです。
参照する変数(sub_space_state)を指定します。
AnyoneとSend To Allはこれで良いのかわかりません。
Actionsを指定していきます。
ここでは
if 文でシーン1かを判断し、1なら処理。if 文の elseif 文で次のシーン2かを判断していくことにしています。
if の condition に適当な名前を指定します(適当でいいのか不明)。
☆から value -> int -> int.Equality を指定します。int を 2つ追加し、1つ目はvariable の sub_space_state を指定。2つ目は比較内容の1を指定します。
out boolはcond_to_earthを指定します(condition variableにした値)。これを if の中の Condition(“cond_to_earth") の中へ移動させます。
次は ConditionBodyの中です。
処理は以下のように記載しています。
実際に記載するときは必要な処理で良いと思います。
1. 他のCyan TriggerへSendCustomEventを送る (宇宙船のアニメーション開始)
2. アニメーションの再生位置をスタート位置にするためにfloatを送る。
3.現在の状態を示す変数に1をセット。
4.メニューの選択されてないシーンのマテリアルを水色にセット。
5.メニューの選択されているシーン(1)のマテリアルを青色にセット。
等の処理をしています。
アニメーションの制御はSDK2アイコンのAnimationsの一覧から適切なものを指定してイベントを設定しました。
マテリアルの変更はSDK2アイコンのMaterialsからRenderer.SetMaterialを指定して選択したメニューの球体の色を変更しています。
主にボタンを押したらアニメーションを開始したりするのがほとんどなのでこのようにしています。

Uncategorized,VR,VRChat,VRCSDK3

アバターの身長とサイズの調整(ちび化)

今日は BOOTH の Ficsnade で発売されているオリジナル3Dモデル『Lua』をちび化してみます。

左から元のアバター。真ん中はちび化したもの。右はVRの中で鏡に映ってるものを写真でとったもの。
FBXとか、元の3dファイルをちび化して調整したほうが良いのですが、unity だけでサイズ変更をします。
unity だけでスケールを変更すると、フルトラで寝たときとか、斜めになったとき、体が縦サイズで縮んだり、横向きになったときに横に伸びたりします。
でもその代わりに、お手軽に変更ができるのと、もうかわいいので気に入っています(もってかえりたい)。
服は別途購入したパーカーを着せています。

サイズ調整

調整した箇所を一覧で記載します。
調整する箇所は以下の赤枠の箇所です。
Scale と 下の View の View Position です。View Position は目線の高さです。

元は Scale に「1、1、1」となっているのを変更するイメージです。

階層(ヒエラルキー) の LuaV3_Standard_PhysBones の下から記載します。
LuaV3_Standard_PhysBones
Armature Scale 「0.9209915、0.9209915、0.9209915」→「0.83、0.83、0.67」

Armature -> Hips -> Spine -> Chest -> Neck -> Head
Scale 「1、1、1」→「1.28、1.44、1.28」

Armature -> Hips -> Spine -> Chest -> Neck -> Head -> HairRoot-> KemomimiBase.L
Armature -> Hips -> Spine -> Chest -> Neck -> Head -> HairRoot-> KemomimiBase.R
Scale 「1、1、1」→「1、1.2、1」

目線のView Position
「0、1.279688、0.05414041」→「0、0.95、0.088」

あとはお好みで、各サイズを調整すればよいかなと思います。

 

VRChat,VRCSDK3,マインクラフト

マインクラフトをUnityとかVRChatのワールドへ取り込む方法をメモします。

◆ 必要なもの
マインクラフト (Java 版)
mineways
blender
MCPrep(blenderのプラグイン)

1. 取り込みたいマインクラフトのワールドを整備します
2. mineways を起動します。jmc2obj でもできると思いますがためしてません
3. マインクラフトのワールドを開き、取り込む範囲と高さ、深さを指定します

4. ファイルメニューから「Open Level」を指定し、一覧からマインクラフトのワールドを指定します。

5. 左クリックで移動し、右ボタンを押してドラッグすると範囲を選択できます

6. ファイルメニューから「Export for Rendering」を指定し、ファイルへ出力します。

7. 出力
オプションが出てきます。
左の列は出力時のマテリアル設定です。デフォルトで良いと思います。
真ん中の列は、出力された3dモデルの指定でまとめるか、タイプごとに分割するかの指定です。
とりあえず下記の画像のオプションにします。

ファイルを出力すると、obj と mat 、それとテクスチャの画像ファイルが出力されます。

8. blender によるファイルの調整
blender を起動します。
MCprep という blender のプラグインが入ってなければ有効にします。
編集メニューの「プリファレンス」を開き、アドオンタブを指定し、画面上のインストールボタンをクリックします。
MCprep を別途ダウンロードし、zip ファイルを指定します。
Object:MCprep のチェックを有効にします。

blender の余計なものを削除します。選択して「x」メニューから削除を選びます。消すのは立方体とライトとカメラです。
ファイルメニューの「インポート」からWavefront (.obj)を指定してminewaysで出力したファイルをインポートします。

「N」キーを押して、右にタブでてきたタブメニューから「MCprep」を指定します。
Prop Material ボタンを押し、OK を押すと取り込んだモデルにテクスチャが入ります。
これを blender 形式で保存します。

9. UNITY への取り込み

任意のプロジェクトを作成し、ディレクトリに出力したblenderファイルとテクスチャをドラッグ・ドロップします。

右クリックメニューから「Create」→「Material」マテリアルを新たに作成します。
作成したマテリアルを選択して、プロパティの「Metalic」を0にします。また、画面上の□ Albedo にテクスチャの(minecraft_flat-RGBA.png)をドラッグします。
テクスチャ(minecraft_flat-RGBA.png)を選択し「Aplha is Transparency」のチェックを入れます。
下のほうのFilter Modeの箇所の設定を「Point (no filter)」にしてApplyを押して反映します。
マテリアルを再び選択して、Rendering Modeを「cutout」にします。
ヒエラルキーにblenderのファイルをドロップし、シーンに追加します。
blenderのファイルをヒエラルキーにドロップした状態では真っ白ですが、展開してオブジェクトにマテリアルをドラッグして割り当てます。
テクスチャが表示されるので、全部に指定します。
アニメーションはされないですが、たいまつの形や、窓の透明部分も反映されていると思います。

 

Uncategorized,VR,VRChat,VRCSDK3

VRChatのワールドで、設置したカメラからの映像をディスプレイに見立てたオブジェクトへ表示したい場合があります。

いつもやり方がわからなくなるため、メモします。

◇ カメラ映像を表示するものを作成する

プロジェクトの「Assets」→「Create」→「Render Texture」を指定してRender Textureを作成し、名前を付ける。

作成したRender Textureを選択してInspectorのSizeを調整する。例えば1280,720、1920,1080など。

Render Textureをシーン上に作ったディスプレイ(Cubeや取り込んだディスプレイのモデルなど)にドロップし、大きさや奥行き(表示されるように)を調整する。

◇ カメラを作成して設定する

Hierarchy のカメラを作りたい階層を選択して右クリックメニューから「Camera」を選択してシーンに新しくカメラを作成する。

作成したカメラを表示するものが映る位置へ移動させる。

作成したカメラのInspectorの「Target Texture」に作ったRender Textureを指定する。

カメラに表示したくないものがあれば、CameraのInspectorのCulling MaskでPlayerLocal、UI、UiMenu、reserved2などを指定する。reserved2はプレーヤーが使ってるカメラをマスクするときに使用する。

◇ ディスプレイの設定

作ったディスプレイ(Render Textureをドロップしたもの)のMaterialコンポーネントのShaderをUnlit → Textureに設定する。
これでカメラ映像が表示される。表示されない場合は奥行きを手前に調整する。

下の画像は宇宙船のアセットについてきたディスプレイのフレーム部分を再利用して、薄く作ったCubeをうまくディスプレイの位置に設置し、Render Textureを指定したもの。カメラには宇宙船とその向こうの土星の環が見える。

VR,VRChat,VRCSDK3

いつもやり方がわからなくなるためのメモです。

VRChat のワールドを作るときのSDK3とUdonSharpを使うボタン操作です。
各ソフトのバージョンは以下のとおりです。

  • Unity 2019.4.31f1
  • VRCSDK3-WORLD-2021.11.24.16.19
  • UdonSharp_v0.20.3

それぞれのパッケージをインポートします。今回は表示するカメラ映像を切り替えるためのボタンを作ります。

ディスプレイを2個設置していますが、1個にします。左に球体を置き、ボタンで映像を切り替えるようにします。

最終的には以下のようにします。上のボタンで1番目のカメラ映像を表示します。下のボタンで2番目のカメラ映像を表示します。

作り方です。
ボタンとする球体に「Udon Behaviour」を追加します。

プログラムソースは「New Program」で追加します。下のプルダウンからUdon C# Program Assetを選んでおきます。Udon Graph から変えておきます。

ボタンを押したときに、Cube_Display_1のActiveをTrueにしてCube_Display_2のActiveをFalseにします。

ソースコードを作成し、適当な場所に保存します。そのあとProgram ScriptをダブルクリックしてVisual Studioを起動します。

以下のように入力します。


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

public class Sphere_display_1 : UdonSharpBehaviour
{
    public GameObject Cube_Display_1;
    public GameObject Cube_Display_2;

    void Start()
    {
        
    }

    private void Interact()
    {
        if (!Networking.IsOwner(Networking.LocalPlayer, this.gameObject)) Networking.SetOwner(Networking.LocalPlayer, this.gameObject);

        SendCustomNetworkEvent(VRC.Udon.Common.Interfaces.NetworkEventTarget.All, "ChangeStreamDisplay");
    }

    public void ChangeStreamDisplay()
    {
        Cube_Display_1.SetActive(true);
        Cube_Display_2.SetActive(false);
    }
}

ボタンをもう1つ下に追加しコードを同じように追加します。
表示するものをトグルするため、Cube_Display_1.SetActive(false);とCube_Display_2.SetActive(true);を記載します。

Udon BehaviourにVisual Studioでコードを書いて保存した後に追加されている項目があります。Cube_Display_1、Cube_Display_2にUnityのHierachyから同名のオブジェクトをドラッグ・ドロップしてセットします。