본문 바로가기

언리얼엔진

17. Getter함수 생성 / Montage 애니메이션 섹션

BP_MontageDataAsset이 틀이고 SwordArimingData가 실제 데이터이다.

 

- Assert : 단언하다, 주장하다라는 뜻으로 조건식에 맞다면 무사히 실행되지만 틀리면 거기서 오류가 발생하며 멈춘다.

이처럼 프로그램을 일부러 터뜨리는 이유는 이 조건이 잘못되었을 경우, 이 이후에 전부 문제가 발생하기 때문이다.

Is Valid를 사용하는 이유와 같다고 볼 수 있다.


cpp와 비교해서 블루프린트에서 제한되는 기능들

- 기본 자료형에 대한 참조를 받을 수 없다. = (인티저 포인터 같은 것)

- 복합 자료를 사용할 수 없다. = (2차원배열이 안된다.)

- 참조의 반환이 불가능하다. = (입력을 통해 받아온 변수에 참조전달은 가능하다. 하지만 출력에는 참조반환이 안된다.)

- 구조체의 상속이 불가능하다. = (구조체를 상속하는 구조체가 없다.)

- constant 변수를 만들 수 없다. = 

(불변 변수를 만들 수 없다. 인스턴스 편집가능은 끄고, 블루프린트 읽지 전용을 키면 어느정도 비슷하게 만들 순 있다.)


BP_Weapon에서 만든 BeginPlay 이벤트

컴파일 후 실행 시, Montage Data에 새 Parameter가 생성되어 런타임 중에 변경사항이 그대로 기록되어 저장이 되었다.

이렇게 되면 DataAsset에 필요 없는 내용이 남아있는 문제가 발생할 수도 있기 때문에 수정해주어야 한다.

 

이 문제가 발생하는 원인은 MontageDataMap의 MontageData(멤버변수)에 직접 접근이 가능하였기 때문이라서,

접근을 막고 Getter를 만들어주도록 한다.

 

먼저 MontageData에 접근을 막고자 해당 변수의 프라이빗을 체크해준다.

MontageData 변수의 프라이빗

 

그리고 MontageData에 값을 가져올 수 있도록 Getter함수 GetMontageData를 만들어주었다.

함수의 입력 인자로 Index(인티저)와 출력 인자로 Output(PlayMontagePrameters)를 추가해준다.

GetMontageData 함수 생성

 

GetMontageData 함수의 구조

함수 내부에서 Get MontageData를 통해 Is Valid로 유효성 검사를 해준다.

만약 Branch를 통해 유효하지 못하면(False) 바로 반환노드로 반환시켜주면 된다.

유효성 검사를 통과(True)했다면 MontageData의 Index값을 복사하여 반환해주도록 했다.


퓨어

이렇게 만들어준 GetMontageData 함수는 들어있는 내용을 그대로 반환만 하는 역할로 실행순서와 무관하다.

또한 외부의 값을 변경하거나 하지 않으므로 퓨어 지정이 가능해진다.

이러한 두 가지 조건이 일치할 때에 퓨어 지정을 해줄 수 있다.


이제 컴파일 이후에 BP_Weapon의 이벤트그래프를 보면 더이상 MontageData에 접근이 불가능한 것을 볼 수 있다.

MontageData에 직접접근이 불가능해짐


Draw Montage 역재생하여 칼을 집어넣는 애니메이션 만들기

SwordArmingData에서 첫번째 원소에는 Draw_Montage를 넣어 칼을 뽑는 애니메이션을 만들어 두었다면,

두번째 원소에는 칼을 집어넣는 애니메이션을 만들어 주어야 한다.

SwordArmingData

 

따라서 칼을 넣는 애니메이션을 만들어주기 위해 Draw_Montage에 왔다.

먼저 섹션트랙에서 우클릭 - 새 몽타주 섹션 Sheath를 추가해준다. 그리고 Sheath 섹션의 위치를 제일 뒤로 옮겨준다.

Draw_Montage의 섹션 트랙

 

몽타주 섹션에서 Defalut → Sheath로 이어지는 링크를 제거하여 2개의 프리뷰를 만들어준다.

이제 검을 뽑는 애니메이션은 Default섹션에서부터 시작하고, 검을 넣는 애니메이션은 Sheath 섹션에서 역재생하게 된다.

 

※ 애니메이션 컴포짓 / 몽타주는 특정 애니메이션을 복사하여 가지고 있는 것이 아닌, 특정 애니메이션의 레퍼런스를

가지고 있다. 따라서 컴포짓 / 몽타주에서 편집한 내용은 원본에 영향이 없다.


이제 SwordArmingData로 돌아와 두번째 원소에 똑같이 Draw_Montage를 넣어줬지만, PlayRate를 -1.0으로 함으로써

역재생되도록 했다. 또한 Section을 선택하여 Sheath 섹션부터 역재생이 된다.


이제 BP_Weapon에서 MontageDataMap의 기본값을 싹 비워준다.

BP_Weapon의 MontageDataMap

 

다음 BP_Sword로 넘어와서 MontageDataMap에 원소를 추가해준다.

state는 Arming, Data는 SwordArmingData를 넣어줬다.