Open6

VRChatのUdonに関する情報を適当に書く

さやまめさやまめ

ちゃんと記事にしようと思うと時間が掛かっちゃったりするので、とりあえず私がゆるく投稿できる場所を用意。
いずれ記事になる情報もあるかも。

さやまめさやまめ

Udon Graphのフローバグ(仮称)などについて

先日私が気付いたバグです(他に気付いている人も居るとは思いますが)
名前は無いのでとりあえずフローバグと呼んでます。
https://twitter.com/Sayabeans_0011/status/1490329562517053443
https://twitter.com/Sayabeans_0011/status/1490347485881008129

1つ目について

BranchやWhile等のフローが分岐するノードについて、フローのそれぞれにあるノードの引数として、何らかのノード(変数・定数除く)の戻り値を使用すると、初めのフローの方にしかメソッド呼び出し処理が記述されないため、分岐ノードの条件によっては意図しない戻り値が得られる。(Nullとか、前回の値とか)

2つ目について

複数のノードの引数に、何らかのノード(変数・定数除く)の戻り値を使用すると、内部的に(一時)変数の使い回しが発生する。
使い回しの際は初めに処理されるノードの(一時)変数が利用されるため、それが変数のSetノードなどであった場合、使い回される一時変数が変数そのものとなってしまい、意図しない動作をする可能性がある。
ツイートではBranchを使用しているが、これはフローを分岐させなくても、何らかのノードの戻り値を複数のノードの引数に繋ぐことで発生する。

両方とも、UdonGraphコンパイラの"使い回し"処理によって引き起こされる問題と考えられる。

さやまめさやまめ

UdonVMにおけるHeap Sizeの制約

https://twitter.com/Sayabeans_0011/status/1491663927763038211

エディタ上で指定出来るUdonGraphやUdonAssemblyでは、変数が512個までしか使用できないようになっている。
これは内部的に使用される一時変数も含んでおり、管理が難しい。

2025年6月1日追記:
ただし、UdonSharp等においてはこの問題が発生しないことが確認された。
これは、UdonAssemblyをスクリプトからコンパイルする際にHeapSizeを指定することが可能であり、これによって必要分のHeapSizeが指定されているため。
https://github.com/vrchat-community/UdonSharp/blob/5d1a2b3d9844bc941d6cc4326b4e931ba6385a5a/Packages/com.vrchat.UdonSharp/Editor/Compiler/Assembly/AssemblyModule.cs#L231-L254
https://github.com/vrchat-community/UdonSharp/blob/5d1a2b3d9844bc941d6cc4326b4e931ba6385a5a/Packages/com.vrchat.UdonSharp/Editor/Compiler/UdonSharpCompilerV1.cs#L912
https://github.com/vrchat-community/UdonSharp/blob/5d1a2b3d9844bc941d6cc4326b4e931ba6385a5a/Packages/com.vrchat.UdonSharp/Editor/Compiler/Udon/CompilerUdonInterface.cs#L204-L228

さやまめさやまめ

ObjectSync使用時のuseGravity、及びisKinematicについて

ObjectSyncを使っている場合、RigidBodyのSet useGravitySet isKinematicは機能しない。
代わりにObjectSyncのSetGravitySetKinematicを用いる…のだが、SetGravityについて、重力を有効化すること(Trueで実行)は出来るが、重力を無効化すること(Falseで実行)は出来なかった。
未報告のバグ…?

代替案として、重力が有効な状態でSetKinematicを使うことにより、擬似的に重力の有効/無効切り替えを実現出来る…が、Kinematicが有効だとマズい場合、解決策が思い当たらない。

さやまめさやまめ

未確認のまま放置してたので、とりあえず"直った可能性"を言及したソースを載せる。
VRChat 2022.2.1の更新でFixed SyncPhysics issues with syncing Gravity / Kinematic and coming out of sleepとある。