Unreal Engine 5.2 では、コントロール リグ FRigVMStruct
と FRigUnit
がプロジェクトの C++ コード ベースで実装される方法に大きな変更が加えられています。カスタムの FRigVMStruct
構造体の内部の コンテキスト の用語と概念の拡張使用のために、これらの構造体をリファクタリングする必要がありました。
このドキュメントでは、Unreal Engine 5.2 に対応するためコントロール リグ コードを移行する方法の詳細について説明します。
実行シグネチャの変更
Unreal Engine の以前のバージョンでは、FRigVMExecuteContext
メンバーは各 RigVM メソッドのパラメータとして扱われていました。Unreal Engine 5.2 では、実行コンテキスト メンバーが渡されなくなりました。その代わりに、ExecuteContext
という単一のパラメータが、任意の RigVM メソッドに渡されます。このパラメータは、構造体内での用途に応じて、定数 (const) または Mutable (可変) になります。
FRigUnitContext
に関連する変更については、「不透明型引数および FRigUnitContext」セクションを参照してください。
ここでは、Unreal Engine 5.1 から 5.2 へのシグネチャの変更例を参照できます。この例では、FRigUnit_SendEvent
などの FRigUnit
が FRigUnit_SendEvent::Execute
のシグネチャです。
5.1 シグネチャ | 5.2 シグネチャ |
---|---|
|
|
新しい ExecuteContext
パラメータでは、すでに const または mutable コンテキストへのアクセスが提供されているため、RigVMExecuteContext
パラメータを削除しました。
不透明型引数および FRigUnitContext
以前は、ドメイン固有の RIGVM_METHOD
実装には、追加の 不透明型引数 を渡すオプションがありました。Unreal Engine 5.2 では、5.2 の不透明型引数のサポートは除去されました。このメカニズムの以前の使用法は、コントロール リグ ノード用の FRigUnitContext
のみです。FRigUnitContext
コンテキスト パラメータへのアクセスに依存しているコードは、互換性を確保するために、ExecuteContext.UnitContext
パラメータを使用するように更新する必要があります。
FRigUnitContext から FRigExecuteContext に移行したメンバー
以下の表では、FRigUnitContext
から FRigExecuteContext
に移行したメンバーのリストを参照することができます。
除去された 5.1 引数 | リファクタリングされた 5.2 引数 |
---|---|
FRigUnitContext::DrawInterface |
FRigVMExecuteContext::GetDrawInterface(); |
FRigUnitContext::DrawContainer |
FRigVMExecuteContext::GetDrawContainer(); |
FRigUnitContext::DeltaTime |
FRigVMExecuteContext::GetDeltaTime(); |
FRigUnitContext::AbsoluteTime |
FRigVMExecuteContext::GetAbsoluteTime(); |
FRigUnitContext::FramesPerSecond |
FRigVMExecuteContext::GetFramesPerSecond(); |
FRigUnitContext::Hierarchy |
FControlRigExecuteContext::Hierarchy; |
FRigUnitContext::ToWorldSpaceTransform |
FRigUnitContext::GetToWorldSpaceTransform(); |
FRigUnitContext::OwningComponent |
FRigUnitContext::GetOwningComponent(); |
FRigUnitContext::OwningActor |
FRigUnitContext::GetOwningActor(); |
FRigUnitContext::World |
FRigUnitContext::GetWorld(); |
FRigUnitContext::Log |
FRigVMExecuteContext::GetLog(); |
FRigUnitContext::NameCache |
FRigVMExecuteContext::GetNameCache(); |
トランスフォーム変換に関連するヘルパー関数もすべて、FRigVMExecuteContext
に移行しました。
FRigUnitContext.State の除去
コントロール リグと RigVM は、Init (初期化) ステートまたは Update (更新) ステートで RIGVM_METHOD コールバックを複数回呼び出さなくなりました。代わりに、Init 時にメモリをデフォルトにリセットし、その後 Update ステートと見なされるように使用していた処理を常に実行します。つまり、Init ステートを活用して初期化を行っていた要素は、未初期化フラグ や初期化が必要かどうかを判定する同様の方法を使用する方式にコードを変更しなければならない場合があります。
例
ここでは、Unreal Engine のソース ツリーのリファクタリングされたコードの例を参照することができます。また、Unreal Engine GitHub のソース ツリー を使用して、Control Rig ノードなど、その他のリファクタリングをリリース間で比較することができます。
5.1 FRigUnit_SendEvent::Execute() | 5.2 FRigUnit_SendEvent::Execute() |
---|---|
~~~ FRigUnit_SendEvent_Execute() { DECLARE_SCOPE_HIERARCHICAL_COUNTER_RIGUNIT() if(!bEnable) { return; } if (bOnlyDuringInteraction && !Context.IsInteracting()) { return; } URigHierarchy Hierarchy = ExecuteContext.Hierarchy; if (Hierarchy) { switch (Context.State) { case EControlRigState::Init: { break; } case EControlRigState::Update: { FRigEventContext EventContext; EventContext.Key = Item; EventContext.Event = Event; EventContext.SourceEventName = ExecuteContext.GetEventName(); EventContext.LocalTime = Context.AbsoluteTime + OffsetInSeconds; Hierarchy->SendEvent(EventContext, false / async */); break; } default: { break; } } } }
FRigUnit_SendEvent_Execute() { DECLARE_SCOPE_HIERARCHICAL_COUNTER_RIGUNIT() if(!bEnable) { return; } if (bOnlyDuringInteraction && !ExecuteContext.UnitContext.IsInteracting()) { return; } URigHierarchy Hierarchy = ExecuteContext.Hierarchy; if (Hierarchy) { FRigEventContext EventContext; EventContext.Key = Item; EventContext.Event = Event; EventContext.SourceEventName = ExecuteContext.GetEventName(); EventContext.LocalTime = ExecuteContext.GetAbsoluteTime() + OffsetInSeconds; Hierarchy->SendEvent(EventContext, false / async */); } } ~~~ |