2023-05-18 언리얼 수업 내용(AttachActorToComponent, 인터페이스)
★ 애니메이션에서 소켓 위치 수정해 보기
예시로 draw_1 애니메이션을 보자
이런 경우 우리는 어깨와 팔, 손의 위치를 바꿔보고 싶은 생각이 들 수 있을 것이다.
원하는 관절을 선택한 후 위치를 옳겨주면된다.
이후 시스템이 자동으로 애디티브 레이어 트랙의 키 프레임을 조절해 줘서 우리가 수정한 본 위치에 맞게 자연스럽게 다시 조절해 준다.
★무기를 붙일 자리를 미리 알아보자
앞서 우리는 드로우 관련된 애니메이션을 건들어 봤다.
하지만 우리는 무기를 붙힐 위치를 모른다. 그러니 위치를 미리 알아볼 겸 소켓을 추가해 보자.
1) Draw_1의 애님컴포짓 생성 - 생성한 파일 이름을 'Draw_Composite'으로 변경
2) 들어간 후 Draw_2를 컴포짓에 넣기
3) 검을 등에 붙일 목적이기 때문에 본 에서 등을 찾아 소켓을 추가한다
등의 본 이름은 'spine_03'이다.
이후 프레임을 Draw_1과 Draw_2의 끝과 시작점에 놔두고 추가해 둔 등 소켓에 sword 메시를 추가한 뒤 현 애니메이션 검의 위치랑 소켓에 추가한 검의 위치를 비슷하게 맞춰 놓자.
★ 실행 시 캐릭터 등뒤에 sword를 붙여보기
1) BP_Character의 이벤트를 열어서 AttachActorToComponent를 추가한 뒤 스폰엑터의 Return value을 타깃에 연결, Parent에는 BP_Character의 Mesh를 연결한다. 그리고 Sochet Name는 블랜드 스페이스 1D의 본에서 추가한 소켓 이름인 'spine_03_weapon'를 적어서 지정한다.
이후 실행하면 검을 착용한 채로 시작하는 것을 확인할 수 있다.
- 타깃 : 해당 타깃의 액터를 말한다. 지금은 스폰 sword액터를 말한다.
- Parent : 타깃이 붙을 Scene 컴포넌트를 말한다. 지금은 BP_Character의 Mesh 컴포넌트를 연결시켜 준다.
- Socket Name : 지정하고 싶은 대상의 소켓 이름이 있을 경우 소켓 이름을 적을 경우 해당 소켓이름을 가진 소켓을 붙여준다. name의 특성상 대소문 자를 구분하지 않는다.
- Location Rule : 위치 규칙
- Rotation Rule : 회전 규칙
- Scale Rule : 크기 규칙
ㅇ규칙의 종류
ㄴKeep Relative : 현재 값을 상대 값으로 가져다 씀(스폰(자식) 트랜스폼 * 소켓(부모) 트랜스폼)
ㄴKeep World : World에 스폰될 때의 내용을 그대로 유지하여 씀(스폰(자식) 트랜스폼)
ㄴSnap to Target : 스폰 트랜스폼은 무시하고 붙을 타깃(소켓)에 맞게 그대로 적용됨(소켓(부모) 트랜스폼)
★ 무기 Draw 추가하기
플레이 중 무기를 꺼내는 키를 추가하자.
편집 - 프로젝트 세팅 - 입력으로 들어갈 수 있으며 액션 매핑으로 키를 추가할 것이다.
WeaponA, 와 WeaponB로 각각 Q, E키로 지정해 주자.
※ 이름을 짓는 데는 중립으로 지어주는 게 좋다. 차후 여러 개의 경우를 사용할 수 있으며 구분하기 쉽도록.
★ 인터페이스
앞으로 여러 가지 캐릭터에게 여러가지 기능을 구현하는 게 목적이므로 인터페이스를 사용할 것이다.
- Interface : 상속을 위한 하나의 클래스이며 단순 상동형이다.
ㄴ 논리구조 상 같은 계층에 속하지 않더라도 같은 기능을 가졌다면 둘을 묶어주는 중심점 역할이다.
ㄴ 특성상 멤버변수를 가질 수 없다. 모든 함수가 순수 가상 함수 이어야 한다.
ㄴ c++ 에선 다중상속이다.
ㄴ 멤버변수를 가지고 있을 때 변수나 공간을 따로 차지하고 있지 않으면 문제 되는 게 없음
★ 인터페이스를 추가해 다뤄보자
1) BP_CharacterInterface 들어가 함수 2개를 추가한다.
2) BP_Character로 들어가 클래스 세팅에서 인터페이스를 찾아 BP_CharacterInterface를 추가한다. 이후 좌측에 인터페이스가 추가된 것을 확인할 수 있다.
WeaponA, WeaponB를 호출하는 기능을 구현해 보자.
3) BP_PlayerController로 들어가 WeaponA, WeaponB 메시지를 추가한다.
그리고 Controller의 return 값을 WeaponA, WeaponB 메시지의 타깃에 연결해 주자.
언리얼의 인터페이스는 강력한 하다.
3가지가 있는데
1. 해당 인터페이스를 구현하지 않는 형식일 경우.
2. 구현은 했지만 실제 해당 이벤트를 구현하지 않을 경우.
3. none인 경우.
실패할 경우 경고, 오류 표시가 아닌 그냥 구현 안 하고 넘어가버린다.
그러니 위처럼 부담 없이 타깃에 넣자.
4) BP_Character에서 두 개의 이벤트를 출력하게 만들면
실행 이후 해당 키를 입력 시 출력하는 것을 확인할 수 있다.