VRChatのUdonに関する情報を適当に書く
ちゃんと記事にしようと思うと時間が掛かっちゃったりするので、とりあえず私がゆるく投稿できる場所を用意。
いずれ記事になる情報もあるかも。
Udon Graphのフローバグ(仮称)などについて
先日私が気付いたバグです(他に気付いている人も居るとは思いますが)
名前は無いのでとりあえずフローバグと呼んでます。
1つ目について
BranchやWhile等のフローが分岐するノードについて、フローのそれぞれにあるノードの引数として、何らかのノード(変数・定数除く)の戻り値を使用すると、初めのフローの方にしかメソッド呼び出し処理が記述されないため、分岐ノードの条件によっては意図しない戻り値が得られる。(Nullとか、前回の値とか)
2つ目について
複数のノードの引数に、何らかのノード(変数・定数除く)の戻り値を使用すると、内部的に(一時)変数の使い回しが発生する。
使い回しの際は初めに処理されるノードの(一時)変数が利用されるため、それが変数のSetノードなどであった場合、使い回される一時変数が変数そのものとなってしまい、意図しない動作をする可能性がある。
ツイートではBranchを使用しているが、これはフローを分岐させなくても、何らかのノードの戻り値を複数のノードの引数に繋ぐ
ことで発生する。
両方とも、UdonGraphコンパイラの"使い回し"処理によって引き起こされる問題と考えられる。
Udon VMの制約
変数が512個までしか使用できない。
これは内部的に使用される一時変数も含むため、管理が難しい。
ObjectSync使用時のuseGravity、及びisKinematicについて
ObjectSyncを使っている場合、RigidBodyのSet useGravity
やSet isKinematic
は機能しない。
代わりにObjectSyncのSetGravity
やSetKinematic
を用いる…のだが、SetGravityについて、重力を有効化すること(Trueで実行)は出来るが、重力を無効化すること(Falseで実行)は出来なかった。
未報告のバグ…?
代替案として、重力が有効な状態でSetKinematicを使うことにより、擬似的に重力の有効/無効切り替えを実現出来る…が、Kinematicが有効だとマズい場合、解決策が思い当たらない。
直った可能性がある。要検証。
未確認のまま放置してたので、とりあえず"直った可能性"を言及したソースを載せる。
VRChat 2022.2.1の更新でFixed SyncPhysics issues with syncing Gravity / Kinematic and coming out of sleep
とある。