🐼
UdonSharpでConstraintSourceを扱う時の注意点
はじめに
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