Unreal

23. Attach & Pick, Enum State, Switching Animation

Kelvin의 게임개발 2024. 2. 22. 00:59
728x90
반응형

1. Attach Actor To Socket

 

특정 Component를 다른 Component에 부착하려면 Attach Component To Component함수를 이용 해야한다

Attach Component To Component : Target SceneComponent를 Parent SceneComponent의 원하는 Socket에 원하는 TransformRule로 Attach 시킨다, Attach가 되었는지 bool로 return한다

 

TargetComponent가 붙을 Parent Component (USceneComponent), 소켓 이름 (FName), TransformRule (EAttachmentRule), 물리학 적용 (bool)을 인자로 가진다

 

이때 각각의 Transform Rule은 Keep Relative, Keep World, Snap To Target으로 되어 있다

 

Keep Relative는 relative transform을 유지한다, Keep World는 world transform을 유지한다, Snap To Target은 해당 위치에 Snap한다

 

예시로 BP_Weapon을 RightHandSocket에 Attach한 모습이다

 

 

만약 Private:에 있는 변수를 에디터에서 접근하고 싶다면 meta = (AllowPrivateAccess = "true") meta지정자를 UPROPERTY()매크로에 작성해주어야 한다

private:
	UPROPERTY(VisibleAnywhere, BlueprintReadOnly, meta = (AllowPrivateAccess = "true"))
   	UStaticMeshComponent* ItemMesh;

 

 

FAttachmentTransformRules TransformRules(EAttachmentRule::SnapToTarget, true);

ItemMesh->AttachToComponent(SlashCharacter->GetMesh(), TransformRules, FName(TEXT("RightHandSocket")));

Attach To Component() : Target SceneComponent를 Parent SceneComponent의 원하는 Socket에 원하는 TransformRule로 Attach 시킨다, Attach가 되었는지 bool로 return한다

 

TargetComponent가 붙을 Parent Component (USceneComponent), TransformRule (FAttachmentTransformRules), 소켓 이름 (FName)을 인자로 가진다

 

FAttachmentTransformRules는 생성자로 EAttachmentRule과 물리학 적용 (bool)을 인자로 가진다

각각의 Rule도 설정이 가능하다

 

 

간단한 Getter, Setter함수들은 Inline함수로 만들어 사용하면 좋다

 

일반적인 함수 호출 시 런타임에 해당 함수의 정의 부분으로 이동하여 함수를 호출하지만 Inline함수는 컴파일 타임에 해당 함수의 코드를 호출부분에 작성한다, 이때 INLINE 키워드는 컴파일러가 해당 함수가 Inline함수인지 결정한다 원하는 함수를 컴파일러의 결정없이 강제적으로 INLINE함수로 만들기 위해서는 FORCEINLINE 키워드를 사용해야 한다

FORCEINLINE void SetOverlappingItem(AItems* InItem) { OverlappingItem = InItem; }
FORCEINLINE AItems* GetOverlappingItem()

 

 

2. Enum State

 

기본적인 C++에서의 enum은 다음과 같이 선언하고 사용한다

//enum 선언
enum CharacterState
{
	Equiped,
	Unequipped
};

//enum 사용
CharacterState State = Unequipped;

 

UE에서는 enum class를 사용한다 이때 enum class명 앞에는 E 접두사가 붙는다 또한 enum class이기 때문에 enum class내부 열거자에 접근할 때 enum class명::내부열거자; 로 접근한다

 

일반 enum으로 정의된 열거자는 일반적으로 전역이기 때문에 코드 어디서든 언제든지 엑세스 할 수 있다 그러나 이는 자치 잘못하면 매우 위험한 행동이다

 

이에 반해 enum class에서 열거자는 일반적으로 전역적이지 않으며, 정규화된 이름(예:Color::RED)를 사용하거나 상수에 액세스 할 때 enum class 자체에 접근해야 한다 ex) Color(클래스)::RED)로 지정하여 액세스 할 수 있다 따라서 더 안전하다

 

또한 서로 다른 enum이지만 열거자가 같은 경우 ex) enum A { Equip }, enum B { Equip } 으로 되어 있을 때 일반 enum은 사용 시 헷갈리지만 enum class는 enum class명::열거자 형식을 사용해야 하기 때문에 헷갈리지 않는다

 

//enum class 선언
UENUM(BlueprintType) //UENUM()으로 Reflection System에 노출 및 BlueprintType으로 BP의 변수 타입으로 사용 가능하게 만듦
enum class ECharacterState : uint8 //열거자들 값을 unsigned 8bit int로 지정
{
	ECS_Equiped, //enum class 열거자 네이밍 규칙 E??
	ECS_Unequipped UMETA(DisplayName = "Unequipped") //MetaData를 이용하여 BP에서의 열거자 이름 제작
};

//enum class 사용
ECharacterState CharacterState = ECharacterState::ECS_Equiped;

 

enum class 자체로는 UE에서 사용이 불가능한데 이를 사용가능하게 만들기 위해서 UENUM() 매크로를 사용한다

 

UENUM 매크로로 해당 enum class를 Reflection System에 노출시키기 때문이다, 추가로 UENUM(BlueprintType)을 사용하면 해당 enum class를 BP의 변수 타입으로 사용이 가능해진다

 

열거자 뒤에 UMETA(DisplayName = " ")로 메타 데이터를 이용하여 BP에서의 열거자 이름을 만들 수 있다

 

이러한 enum class를 다른 class에서 사용하기 위해서는 전방선언이 아닌 .h을 include해주어야 컴파일 에러가 발생하지 않는다

 

일반 변수와 마찬가지로 UPROPERTY()를 통하여 키워드를 사용할 수 있다 ex) BlueprintReadOnly, Category 등등

 

enum class는 ==, switch등 다양한 비교를 할 수 있다

 

 

3. Switch Animation Pose

 

AnimBP에서는 다음과 같이 enum class를 이용한 BlendPoses노드를 사용할 수 있다

(AnimBP이기 때문에 부모클래스인 Anim Instance 클래스에서 해당 enum class를 관리할 수 있게 설계해야 한다)

 

이 노드로 Input으로 넣은 enum class의 state에 따라 output pose를 정할 수 있다

 

노드에 우클릭으로 enum class의 열거자들을 Pin으로 추가할 수 있다

 

Active Enum Value가 Unequipped면 Idle, Equipped One Handed Weapon이면 Standing Idle Pose가 output Pose로 나오게 된다

 

여기서 Blend Time은 해당 Pose로 Blend하는데 걸리는 시간을 의미한다 (0으로 지정 시 Blend가 일어나지 않음 바로 Snap하여 전환됨)

 

모든 Animation 전환을 이와 같은 BlendPoses방식으로 하면 굉장히 복잡해지고 확장성도 좋지 않다 따라서 다수의 AnimBP를 만들고 이 AnimBP들을 전환하는 방식으로 사용해야 한다

 

 

4. Multiple Anim Blueprints

 

모든 Animation 전환을 위와 같은 BlendPoses방식으로 하면 굉장히 복잡해지고 확장성도 좋지 않다 따라서 다수의 AnimBP를 만들고 이 AnimBP들을 전환하는 방식으로 사용해야 한다

 

다른 AnimBP를 연결해서 사용하기 위해서는 Linked Anim Graph가 필요하다

 

Details - Instance Class에서 원하는 AnimBP Class를 지정해주어야 한다

 

Linked Anim Graph의 Pose는 결국 지정된 AnimBP의 Output Pose가 된다

 

이때 Details - Exposable Properties에서 Linked된 AnimBP의 변수들을 Bind할 수 있다

(함수나 변수로 Bind가능)

 

(Bind된 모습)

 

InputPose를 이용하여 Linked Anim Graph(해당 AnimBP)에 Pose를 Input으로 받을 수 있다

InPose에 들어간 Pose가 해당 AnimBP의 InputPose로 나오게 된다

 

이러한 AnimBP 노드들로 최대한 Main AnimBP를 간단하고 확장성 좋게 제작할 수 있어야 한다

 

 

 

 

728x90
반응형

'Unreal' 카테고리의 다른 글

22. IK Rig And Retarget & Socket & fbx Import  (70) 2024.02.15
21. Collision & Overlap (2)  (79) 2024.02.08
20. Observer Pattern & Delegate  (80) 2024.02.07
19. Collision & Overlap (1)  (117) 2024.01.31
18. IK (Inverse Kinematics)  (109) 2024.01.27