🐼

UdonSharpでConstraintSourceを扱う時の注意点

2024/11/20に公開

はじめに

UdonSharpでConstraintSourceを更新し、ParentConstraintにセットしたけど反映されない現象に遭遇したので調査、備忘録。
(確認していないけど他コンストレイントも同じだと思う。)
同じようなことで困っている人はNGコード例OKコード例を参考にしてみてください。

環境

Unity VRChat SDK
2022.3.22f1 3.73

反映されなかったコード

private void TEST_NG()
{
    _MyConstraintSource.sourceTransform = _Obj.GetXxxTransform();//何かのTransformを取得するメソッド
    _TargetConstraint.SetSource(0, _MyConstraintSource);
}

反映されたコード

Transformを取得するメソッドの結果を一度変数に入れる。

private void TEST_OK()
{
    var t = _Obj.GetXxxTransform();//何かのTransformを取得するメソッド
    _MyConstraintSource.sourceTransform = t;
    _TargetConstraint.SetSource(0, _MyConstraintSource);
}

それぞれのUdonAssemblyの差分

反映されなかったコードは先頭で_MyConstraintSourceを内部変数にコピーしている。
そして、内部変数に取得したTransformをセットして、ParentConstraintに_MyConstraintSourceをセットしている。
ConstraintSourceは構造体なのでコピーしたら実体が別になるのでこれが原因のよう。

それぞれのUdonAssembly

反映されなかったコード

        PUSH, _Obj
# Cow dirty
        PUSH, _MyConstraintSource
        PUSH, __intnl_UnityEngineAnimationsConstraintSource_0
        COPY
# Cow dirty
        PUSH, _Obj
        PUSH, __intnl_VRCUdonUdonBehaviour_1
        COPY
        PUSH, __const_SystemString_1
        EXTERN, "VRCUdonCommonInterfacesIUdonEventReceiver.__SendCustomEvent__SystemString__SystemVoid"
        PUSH, _Obj
        PUSH, __const_SystemString_2
        PUSH, __intnl_SystemObject_1
        EXTERN, "VRCUdonCommonInterfacesIUdonEventReceiver.__GetProgramVariable__SystemString__SystemObject"
        PUSH, __intnl_SystemObject_1
        PUSH, __intnl_UnityEngineTransform_2
        COPY
        PUSH, __intnl_UnityEngineAnimationsConstraintSource_0
        PUSH, __intnl_UnityEngineTransform_2
        EXTERN, "UnityEngineAnimationsConstraintSource.__set_sourceTransform__UnityEngineTransform__SystemVoid"
        PUSH, _TargetConstraint
        PUSH, __const_SystemInt32_1
        PUSH, _MyConstraintSource
        EXTERN, "UnityEngineAnimationsParentConstraint.__SetSource__SystemInt32_UnityEngineAnimationsConstraintSource__SystemVoid"

反映されたコード

        PUSH, _Obj
# Cow dirty
        PUSH, _Obj
        PUSH, __intnl_VRCUdonUdonBehaviour_0
        COPY
        PUSH, __const_SystemString_1
        EXTERN, "VRCUdonCommonInterfacesIUdonEventReceiver.__SendCustomEvent__SystemString__SystemVoid"
        PUSH, _Obj
        PUSH, __const_SystemString_2
        PUSH, __intnl_SystemObject_0
        EXTERN, "VRCUdonCommonInterfacesIUdonEventReceiver.__GetProgramVariable__SystemString__SystemObject"
        PUSH, __intnl_SystemObject_0
        PUSH, __intnl_UnityEngineTransform_1
        COPY
        PUSH, __intnl_UnityEngineTransform_1
        PUSH, __lcl_t_UnityEngineTransform_0
        COPY
        PUSH, _MyConstraintSource
        PUSH, __lcl_t_UnityEngineTransform_0
        EXTERN, "UnityEngineAnimationsConstraintSource.__set_sourceTransform__UnityEngineTransform__SystemVoid"
        PUSH, _TargetConstraint
        PUSH, __const_SystemInt32_1
        PUSH, _MyConstraintSource
        EXTERN, "UnityEngineAnimationsParentConstraint.__SetSource__SystemInt32_UnityEngineAnimationsConstraintSource__SystemVoid"

結論

UdonSharpのコンパイラの不具合???
構造体扱う系で他にもあるかも。

Discussion