언리얼 엔진 5.2에서는 프로젝트의 C++ 코드 베이스에서 컨트롤 릭의 FRigVMStruct
및 FRigUnit
을 구현하는 방식이 크게 변경되었습니다. 용어와 커스텀 FRigVMStruct
구조 내부의 컨텍스트 개념을 더 넓게 사용하게 되어 이러한 구조체를 리팩터링해야 했습니다.
이 문서에서는 컨트롤 릭 코드를 언리얼 엔진 5.2에서 호환되는 코드로 이주하는 방법을 자세히 살펴봅니다.
시그니처 변경사항 실행
언리얼 엔진 이전 버전에서는 FRigVMExecuteContext
멤버를 각 RigVM 메서드에 대한 파라미터로 취급했습니다. 언리얼 엔진 5.2에서는 실행 컨텍스트 멤버를 더는 전달하지 않습니다. 대신 ExecuteContext
라는 단일 파라미터를 모든 RigVM 메서드에 전달합니다. 이 파라미터는 구조체 내에서의 사용 방식에 따라 상수 (const) 또는 변경 가능(Mutable) 이 됩니다.
FRigUnitContext
관련 변경사항을 확인하려면 불투명 실행인자 및 FRigUnitContext 섹션을 참조하세요.
여기에서 FRigUnit_SendEvent
와 같은 FRigUnit
은 FRigUnit_SendEvent::Execute
의 시그니처가 되는 식으로, 언리얼 엔진 5.1에서 5.2로 변경된 시그니처 예시를 참조할 수 있습니다.
5.1 시그니처 | 5.2 시그니처 |
---|---|
|
|
이미 새 ExecuteContext
파라미터를 사용하여 const 또는 mutable 컨텍스트에 액세스할 수 있으므로 RigVMExecuteContext
는 제거했습니다.
불투명 실행인자 및 FRigUnitContext
이전에는 도메인 전용 RIGVM_METHOD
구현에 추가 불투명 실행인자 를 전달하는 옵션이 있었습니다. 언리얼 엔진 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 스테이트에 의존하던 코드에서 초기화되지 않음 플래그 또는 비슷한 메서드를 사용하여 초기화가 필요한지 결정하는 코드로 변경해야 할 수 있습니다.
예시
여기에서 언리얼 엔진 소스 트리에서 리팩터링된 코드의 예시를 참조할 수 있습니다. 또한 언리얼 엔진 GitHub 소스 트리를 사용하여 출시 사이에 컨트롤 릭 노드 같은 추가 리팩터를 비교할 수도 있습니다.
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 */); } } ~~~ |