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 */); } } ~~~ |