콘텐츠로 이동

UOverAnimMeshDeformer

기준: OverAnim 0.1.0 Beta · Unreal Engine 5.8
헤더: OverAnimation/Asset/OverAnimMeshDeformer.h

UOverAnimMeshDeformer는 Skeleton별 OverAnim 저작 에셋입니다. Region, Module Stack, Response Rule, 모션·시뮬레이션·프로토콜 설정을 보관하며 UOverAnimComponent가 런타임에 설치합니다.

Properties

Details UI 이름 C++ 속성명 기본값 · 범위 영향 · 관계
Target Skeleton TargetSkeleton None 대상 Skeletal Mesh의 Skeleton과 같아야 합니다. 불일치하면 계약 검증과 설치가 실패합니다.
Applied Animations AppliedAnimations 빈 배열 비어 있으면 모든 Animation이 허용됩니다. 항목이 있으면 지정 Animation에만 전체 길이 Activation Window가 주입됩니다.
Scope Activation Channel ScopeActivationChannel None AppliedAnimations가 만든 Window가 전달하는 선택적 채널입니다. Rule의 Notify Activation Channel 필터와만 연결됩니다.
Master Effect Intensity MasterEffectIntensity 1.0, 0+ · UI 최대 3 에셋의 모든 Module authored strength에 곱해집니다. 모듈의 개별 safety limit은 유지됩니다.
C++ legacy tuning source TuningSource Detailed 기존 asset 호환을 위해 남아 있는 직렬화 필드입니다. 현재 built-in module runtime은 이 값을 읽지 않으며, Simple / Details 레이아웃과 Simple knob 적용 여부를 제어하지 않습니다. Details/Blueprint에는 직접 노출되지 않습니다.
Simulation Settings SimulationSettings 구조체 기본값 Fixed update, substep, discontinuity/history reset을 제어합니다. Motion · Simulation을 참조합니다.
Motion Signal Settings MotionSignalSettings 구조체 기본값 Automatic Six-Stage Motion의 분석·신호 설정입니다. Motion · Simulation을 참조합니다.
Proportion Calibration ProportionCalibration 자동 보정 켜짐 캐릭터/Region 크기에 따라 선형 거리·속도·가속도 기준을 보정합니다. Region · Calibration을 참조합니다.
Signal Protocol Settings SignalProtocolSettings 구조체 기본값 Protocol Channel을 실제 FName Signal로 변환합니다. Signal · Impact Types을 참조합니다.
Impact Signal Settings ImpactSignalSettings 구조체 기본값 Hit, Collision, Damage 요청의 magnitude, deduplication, contact 처리 규칙입니다.
Overlapping Region Policy RegionCompositionPolicy AdditiveClamped vertex mask가 겹친 Region의 변형을 Additive Delta 또는 Strongest Delta로 합성합니다.
Request Budget RequestBudget 256 / 64 / 32 / 1/60 s / 2 s 프레임당 Signal/Request와 active response slot의 상한입니다. 초과 요청은 처리되지 않을 수 있습니다.
Bone Group Descs BoneGroupDescs 빈 배열 Bone Group · Region의 저작 데이터입니다.
Response Sets ResponseSets 빈 배열 Rule이 선택하는 named set입니다. Response Types를 참조합니다.
Response Rules ResponseRules 빈 배열 Signal을 특정 Region/Module Response로 라우팅합니다.

Blueprint / Call In Editor authoring

Blueprint 표시명 C++ 선언 입력 · 반환 전제조건 · 실패/상태 변화
Add or Update Automatic Six-Stage Response int32 AddOrUpdateAutomaticMotionPhaseRule(FName BoneGroupName, FName ModuleName) Region 이름과 Module 이름을 받고 Rule index를 반환합니다. Group, Module, Region Motion Phase Signal 이름이 유효하고 Module이 automatic response를 지원해야 합니다. 실패하면 INDEX_NONE입니다. 성공하면 motion/Region/phase signal을 켜고 activation scope를 AuthoredActionWindow로 설정합니다. 기존 Rule은 authored stage 설정을 보존하고, 새 Rule은 module 기본 response parameter와 automatic Response Set을 만듭니다.

C++ public functions

이 함수들은 Blueprint 노드가 아닙니다. 에셋 저작 도구 또는 C++ 통합의 지원 경계입니다.

Validation · Animation Scope · Skeleton

C++ 선언 반환 · 상태 변화 전제조건 · 거부 조건
bool HasAppliedAnimations() const AppliedAnimations 배열에 하나 이상 항목이 있으면 true, 비어 있으면 false입니다. 에셋이 Animation Scope를 명시했는지를 질의합니다. 배열 내용의 로드 가능 여부나 대상 Animation의 Skeleton 일치 여부는 검사하지 않습니다. scope notify injection은 각 항목을 개별적으로 동기 로드하며, 로드하지 못한 항목은 건너뜁니다.
bool SetTargetSkeleton(USkeleton* InTargetSkeleton) Skeleton을 설정하고 변경 delegate를 알립니다. InTargetSkeleton이 유효해야 합니다. 유효하지 않으면 false입니다.
bool ValidateContract(const USkeletalMesh* SkeletalMesh, TArray<FText>& OutErrors, TArray<FText>& OutWarnings) const OutErrors, OutWarnings를 채우고 오류가 없을 때 true입니다. Mesh/Skeleton, 고유 ID·이름, mask 범위, Rule route, module 지원 범위, budget을 대조합니다. 반환 false이면 설치 가능한 계약이 아닙니다.
FOverAnimAssetChanged& GetAssetChangedDelegate() 에셋 변경 multicast delegate를 반환합니다. 아래 FOverAnimAssetChanged의 세 인자를 받는 native C++ delegate입니다. Blueprint Event가 아닙니다.
void NotifyAssetChanged(EOverAnimAssetChangeType ChangeType, UObject* ChangedObject) AssetChangedDelegate(this, ChangeType, ChangedObject)로 broadcast합니다. 저작 변경 분류를 알리는 API이며, 렌더링·instance lifecycle 제어 API는 아닙니다.

Asset change delegate

FOverAnimAssetChangedUOverAnimMeshDeformer*, EOverAnimAssetChangeType, UObject*의 세 인자를 갖는 native multicast delegate입니다. 반환값은 없고 Blueprint에 노출되지 않습니다. 구독 C++ 코드는 자신이 보관한 delegate handle을 자신의 수명 종료 전에 제거해야 합니다.

Broadcast 인자 타입 계약
Asset UOverAnimMeshDeformer* 변경을 알린 에셋입니다. GetAssetChangedDelegate()를 반환한 에셋과 같습니다.
ChangeType EOverAnimAssetChangeType 아래 표의 변경 범주입니다. 구독자는 범주에 따라 캐시·표시 갱신 범위를 구분할 수 있습니다.
ChangedObject UObject* 변경의 직접 대상입니다. 에셋 자체 또는 해당 Module이 전달될 수 있으며, 이 delegate는 소유권을 이전하지 않습니다.
EOverAnimAssetChangeType 의미 현재 내장 저작 경로
Parameters 구성원은 유지한 채 이름, mask 정책, LOD 정책, view stylization, module 파라미터처럼 값만 달라졌음을 나타냅니다. 파라미터 설정자와 일반 module Details 변경이 이 범주를 보냅니다.
Structure Target Skeleton, Bone Group/Module의 추가·삭제·순서·활성화처럼 설치 또는 조합 구조가 달라졌음을 나타냅니다. Skeleton 설정, Group/Module 구조 편집, Undo 및 structural module property 변경이 이 범주를 보냅니다.
PreviewOnly 미리보기 전용 변경을 구분하기 위한 public enum 값입니다. OverAnim 0.1.0 Beta의 내장 저작 경로는 이 값으로 NotifyAssetChanged()를 호출하지 않습니다. 외부 통합이 전달할 수 있는 분류값입니다.

Bone Group authoring

C++ 선언 반환 · 상태 변화 전제조건 · 거부 조건
FGuid AddBoneGroup() 새 Group의 ID를 반환합니다. 성공한 ID는 BoneGroupDescs에 추가됩니다.
bool RemoveBoneGroup(FGuid GroupId) 해당 Group을 제거합니다. 일치 ID가 없으면 false입니다. 그 Group을 가리키는 Rule은 별도로 유효성 검사를 통과해야 합니다.
FGuid DuplicateBoneGroup(FGuid GroupId) 복제 Group ID를 반환합니다. 원본 ID가 없으면 invalid GUID입니다. Module/Region 데이터가 복제됩니다.
bool MoveBoneGroup(FGuid GroupId, int32 TargetIndex) 배열 순서를 변경합니다. ID 또는 target index가 유효하지 않으면 false입니다.
bool SetBoneGroupName(FGuid GroupId, FName NewName) GroupName을 변경합니다. 빈 이름 또는 다른 Group과 중복이면 false입니다. Rule의 BoneGroupName은 자동으로 대체되지 않습니다.
bool SetBoneGroupAlwaysEnabled(FGuid GroupId, bool bIsAlwaysEnable) Always Active를 변경합니다. 대상 ID가 없으면 false입니다.
bool SetBoneGroupAffectedBone(FGuid GroupId, FName BoneName, bool bAffected) 한 bone을 mask에 추가/제거합니다. Group과 bone이 유효해야 합니다.
bool SetBoneGroupAffectedBones(FGuid GroupId, TConstArrayView<FName> BoneNames, bool bAffected) 여러 bone의 mask 상태를 바꿉니다. Group ID와 각 bone 이름이 유효해야 합니다.
bool SetBoneGroupHierarchyExpansion(FGuid GroupId, int32 ExpandTowardsRoot, int32 ExpandTowardsLeaf) root/leaf expansion을 변경합니다. root는 0+, leaf는 -1 또는 0+여야 합니다.
bool SetBoneGroupMotionSampleBone(FGuid GroupId, FName MotionSampleBone) Fixed Analysis Bone을 변경합니다. Group ID가 없으면 false입니다. NoneAnalysis Method를 사용하는 자동 해석입니다.
bool SetBoneGroupAutomaticActionGroup(FGuid GroupId, FName AutomaticActionGroup) Action Group을 변경합니다. Group ID가 없거나 현재 값과 같으면 false입니다. None은 독립 Region입니다.
bool SetBoneGroupAutomaticActionMotionAnalysis(FGuid GroupId, OverAnimMotionPhase::EMotionAnalysis MotionAnalysis) Analysis Method를 변경합니다. Group ID가 없거나 현재 값과 같으면 false입니다. 함수 자체는 전달된 enum 값을 별도로 sanitize하지 않습니다.
bool SetBoneGroupAutomaticPhaseAnimationRouting(FGuid GroupId, OverAnimMotionPhase::EAnimationRouting AnimationRouting) Analyze Animations route를 변경합니다. Group ID가 없거나 현재 값과 같으면 false입니다. Saved Allowed Animations는 지우지 않으며 다른 route에서는 validation warning과 함께 무시될 수 있습니다.
bool SetBoneGroupAutomaticPhaseAnimations(FGuid GroupId, TConstArrayView<TSoftObjectPtr<UAnimSequenceBase>> Animations) Allowed Animations를 교체합니다. Group ID가 없으면 false입니다. null, AppliedAnimations에 없는 항목과 중복 경로를 제거한 배열을 저장하며, 정리된 결과가 현재 값과 같아도 false입니다.
bool SetBoneGroupAuthoredMotionPhaseCurves(FGuid GroupId, FName CurveName, FName CurveWeightName) Stage Curve와 companion weight curve를 함께 설정합니다. Group ID가 없거나 두 값이 모두 현재 값과 같으면 false입니다. 함수는 weight-only 조합도 저장하므로 호출 후 validation을 수행해야 합니다. Weight curve만 있으면 계약 오류입니다.
bool SetBoneGroupMaskPolicy(FGuid GroupId, const FOverAnimRegionMaskPolicy& MaskPolicy) mask falloff를 변경합니다. ZeroWeight < FullWeight여야 합니다.
bool SetBoneGroupLodPolicy(FGuid GroupId, EOverAnimRegionLodPolicy LodPolicy) LOD 계약을 변경합니다. Group ID가 없으면 false입니다.
bool SetBoneGroupViewStylization(FGuid GroupId, const FOverAnimRegionViewStylizationSettings& ViewStylization) Region Camera Readability 권한/강도를 변경합니다. Component의 Camera Readability master switch가 별도로 켜져야 실제 correction이 적용됩니다.

Module Stack authoring

C++ 선언 반환 · 상태 변화 전제조건 · 거부 조건
FGuid AddModule(FGuid GroupId, TSubclassOf<UOverAnimDeformerModule> ModuleClass) 생성 Module ID를 반환합니다. Group과 ModuleClass가 유효해야 합니다. 실패하면 invalid GUID입니다.
bool RemoveModule(FGuid GroupId, FGuid ModuleId) Module을 제거합니다. Group/Module ID가 없으면 false입니다. 해당 Module을 가리키는 Rule은 별도 수정이 필요합니다.
int32 RemoveMissingModuleEntries(FGuid GroupId) 제거한 missing class 항목 수를 반환합니다. Group ID가 없으면 0입니다.
FGuid DuplicateModule(FGuid GroupId, FGuid ModuleId) 복제 Module ID를 반환합니다. 대상 ID가 없으면 invalid GUID입니다.
bool MoveModule(FGuid GroupId, FGuid ModuleId, int32 TargetIndex) Module Stack 순서를 변경합니다. 대상 ID/index가 유효하지 않으면 false입니다. 같은 Phase 안에서는 순서가 합성 결과에 영향을 줍니다.
bool SetModuleEnabled(FGuid GroupId, FGuid ModuleId, bool bEnabled) Module의 enabled 상태를 변경합니다. 대상 ID가 없으면 false입니다.
bool RenameModule(FGuid GroupId, FGuid ModuleId, FName NewName) Module Name을 변경합니다. 유효한 대상과 고유한 이름이 필요합니다. Rule의 ModuleName route와 일치해야 합니다.
bool ResetModuleParameters(FGuid GroupId, FGuid ModuleId) class default의 노출 파라미터로 되돌립니다. 대상 ID가 없으면 false입니다. Module Id는 식별자로 유지됩니다.

Lookup queries

C++ 선언 반환 · 상태 변화 전제조건 · 거부 조건
int32 FindBoneGroupIndex(FGuid GroupId) const BoneGroupDescs에서 GroupId가 일치하는 첫 항목의 배열 index를 반환합니다. 에셋을 변경하지 않습니다. 일치하는 ID가 없으면 INDEX_NONE입니다. invalid GUID도 일치 항목이 없으면 같은 값을 반환합니다.
int32 FindModuleIndex(const FOverAnimBoneGroupDesc& BoneGroupDesc, FGuid ModuleId) const 전달된 BoneGroupDesc.Modules에서 null이 아니고 ModuleId가 일치하는 첫 Module의 배열 index를 반환합니다. 에셋을 변경하지 않습니다. BoneGroupDesc는 호출자가 이미 확보한 값이며, 함수는 Group ID를 다시 찾지 않습니다. 일치 Module이 없거나 null 항목뿐이면 INDEX_NONE입니다.
int32 FindAutomaticMotionPhaseRuleIndex(FName BoneGroupName, FName ModuleName) const Region Motion Phase Signal, source/target Region, Module, AutomaticMotionPhase timing이 모두 일치하는 첫 Rule index를 반환합니다. 일치 Rule이 없으면 INDEX_NONE이며 에셋을 변경하지 않습니다.
static FName MakeAutomaticMotionPhaseResponseSetName(FName BoneGroupName) Motion.ActionPhrase.<sanitized group> 형식의 automatic Response Set 이름을 반환합니다. 이름을 생성할 뿐 Response Set을 추가하지 않습니다.

Static resolution helpers

C++ 선언 반환 · 출력 전제조건
static bool BuildExplicitBoneChain(const USkeleton* Skeleton, FName StartBoneName, FName EndBoneName, TArray<FName>& OutBoneChain) 부모-자식으로 연결된 chain을 OutBoneChain에 기록합니다. Skeleton과 두 bone이 유효하고 Start가 End의 조상 경로에 있어야 true입니다.
static void BuildResolvedAffectedBones(const FReferenceSkeleton& RefSkeleton, const FOverAnimBoneGroupDesc& BoneGroupDesc, TArray<FName>& OutBoneNames) 명시 mask와 hierarchy expansion을 적용한 bone 목록을 출력합니다. 반환 목록은 입력 skeleton에 존재하는 bone만 의미가 있습니다.
static OverAnimMotionPhase::FActionChain ResolveAutomaticActionMotionChain(const FReferenceSkeleton& RefSkeleton, const FOverAnimBoneGroupDesc& BoneGroupDesc) PrimaryGuideChain용 bone 이름, 유효·무시된 명시적 bone 수를 반환합니다. 연결된 명시적 Affected Bone이 최소 2개일 때 IsUsable()이 true입니다. helper branch와 연결되지 않은 명시 bone은 분석 chain에서 제외될 수 있습니다.
static FName ResolveMotionSampleBone(const FReferenceSkeleton& RefSkeleton, const FOverAnimBoneGroupDesc& BoneGroupDesc) Fixed Analysis Bone 또는 legacy fallback으로 가장 깊은 resolved Region bone을 반환합니다. Automatic Action 분석 전체가 이 bone 하나만 사용한다는 의미는 아닙니다. Fixed bone이 비어 있으면 Analysis MethodResolveAutomaticActionMotionChain() 결과가 우선될 수 있습니다. 해석할 bone이 없으면 None입니다.

FOverAnimAutomaticActionMotionChainBoneNames, ValidExplicitBoneCount, IgnoredExplicitBoneCount를 공개합니다. IsUsable()BoneNames.Num() >= 2일 때 true입니다.

UOverAnimDeformerInstanceSettings

UOverAnimDeformerInstanceSettingsUMeshDeformerInstanceSettings를 상속하는 UCLASS(Transient) C++ runtime context입니다. UOverAnimDeformerModule::CreateInstance()를 override한 외부 module class는 이 포인터를 받아 측정 결과를 읽을 수 있습니다. 이 클래스는 BlueprintType이 아니며 Details/asset에 저장되는 사용자 저작 설정은 아닙니다.

C++ 필드 생성 시 값 수명·노출 계약
FOverAnimResolvedCharacterProportions CharacterProportions CreateSettingsInstance(UMeshComponent*)가 Target Mesh와 에셋 ProportionCalibration으로 해석한 캐릭터 비율입니다. 설치별 transient snapshot입니다. Blueprint/Details에 노출되지 않고 asset에 저장되지 않습니다.
FOverAnimProportionCalibrationSettings ProportionCalibration 에셋의 ProportionCalibration을 복사한 값입니다. 위 snapshot을 만든 보정 규칙입니다. 사용자 저작은 Proportion Calibration에서 하며, 이 runtime context는 설정 저장 위치가 아닙니다.

UOverAnimMeshDeformer::CreateSettingsInstance()가 이 객체를 생성하고 Mesh Deformer 수명주기에서 보관합니다. public 필드는 custom module extension의 읽기 컨텍스트이지만, 직접 생성·직접 변경의 지속성 또는 재설치 동작은 public API로 보장되지 않습니다.

설치 전 계약

UOverAnimComponent::ApplyOverAnim()은 Target Mesh, TargetSkeleton, Region, Rule, Module의 계약이 맞을 때만 준비 상태가 됩니다. 모든 Rule이 Signal 이름, Bone Group 이름, Module 이름, 활성화 조건, Module 지원 범위를 동시에 만족해야 합니다.