[unrealengine4]

2023-05-23 언리얼 수업 내용(몽타주,parameter, 블루프린트 오류, c++와 블루프린트 차이점)

롤링페이퍼 2023. 5. 24. 21:36

BP_MontageDataAsesst : 데이터 에셋 클래스(틀)

SwordArmingData : 데이터 에셋(데이터), 데이터를 정의할 수 있다.


★런타임 중 데이터 에셋에 기록되는 것을 막기

https://qkrtjddn0628.tistory.com/19

앞전에 우리는 BP_weapon의 BeginPlay 이벤트를 통해 MontageDataMap에서 Find를 뽑아 Idle State의 원소를 찾고 Idle State의 MontageData배열의 0번째 원소의 Montage의 이름을 플레이 화면에 띄우는 것을 만들어 보았다.

BP_Weapon에서 만든 BeginPlay 이벤트

하지만 문제가 있는데 실행을 하고 난 뒤 Montage Data에서 새로운 Parameter가 생성이 되어 런타임 중 변경사항이 저장되는 상황이 생겨졌다.

실행할때마다 생셩되는 Parameter들

이러한 이유는 BeginPlay 이벤트 로직 중 add를 사용해 Montage Data Map에 새로운 Parameter가 생성되어 그대로 저장하기 때문이다.

또한 BP_MontageDataAsset에서 만든 MontageData 변수가 public(퍼블릭)이기 때문에 BP_weapon에서 실행하는 함수가 직접 접근이 가능한 이유도 있다. 이러므로 우리는 접근을 제한해보자.

 

일단 BP_weapon의 배열을 받아올 필요가 없기 때문에 BP_MontageDataAsset의 변수 MontageData를 프라이빗 시켜 놓는다.

BP_ BP_MontageDataAsset의 변수 MontageData

그리고 우리는 외부에서 MontageData의 데이터를 받아오기만 할 것이므로 getter를 사용해 보자.

 

BP_MontageDataAsset에서 함수 GetMontageData를 생성해 준다. 다음 아래를 참고하여 로직을 짜둔다. 

정리하자면

Is valid Index 노드에서 Montage Data의 입력받은 값이 branch에서 none인지 아닌지 검사를 해주고 false면 함수종료, true이면 Get(참조)로 만든 Get노드에서 입력받은 인덱스값에 대한  PlayMontageParameters를 받아서 return(반환노드) 시킨다.

 

이후 BP_weapon에서 만든 노드들은 지워준다.


★칼자루 집어넣기 몽타주 추가

 

만들어준 Draw_Montage로 들어가 칼자루를 집어넣는 애니메이션을 추가해 보자.

 

Draw_Montage 들어가 섹션 트렉에서 새 몽타주 섹션 생성 후 이름을 'Sheath'로 정해준다.

이후 프레임 끝으로 밀어 넣어준다.

다음 몽타주 섹션에서 프리뷰를 링크 제거 한다.

SwordArmingData로 돌아가

Montage : Draw_Montage로 지정

PlayRate : -1.0(역재생)

Section : Sheath로 지정(섹션 시작 위치 지정)

위 내용 참고 : https://qkrtjddn0628.tistory.com/18

이후 BP_Weapon으로 돌아가 MontageDataMap 변수의 엘리먼트를 제거해주고 BP_Sword로 들어가 Default에 엘리먼트를  추가 후 swordArmingData를 추가후 arming으로 지정해 준다.


★블루프린트 오류

블루프린트에서 오류가 나왔을 경우 로그의 메시지를 확인하고 호출스택의 제일 마지막(아래)부터 왼쪽(위)으로 순서대로 찾아가서 에러를 확인하면 된다.

 

Assert(어썰트)

Assert 함수는 디버깅 모드에서 개발자가 오류가 생기면 치명적일 것이라는 곳에 심어 놓는 에러 검출용 코드이다.

Assert(조건식)을 걸어놓고 해당 조건이 false이면 오류가 발생하기 때문에 손쉽게 에러를 찾아볼 수 있다.


C++에 비교하면서 블루프린트에서 제한되는 기능들

- 기본 자료형에 대한 참조를 받을 수 없다.(int*,double*, float*,... 와 인티저 포인터 같은 것들)

- 참조를 반환하는 게 불가능하다.

- 불변변수(constant) 생성이 불가하다.(인스턴스 편집기능은 끄고, 블루프린트 읽기 전용을 사용하면 비슷하게 만들 수 있음)

- 정적멤버 생성 불가하다.(데이터 에셋을 활용하는 가장 큰 이유이다.)

- 복합 자료 구조를 사용할 수 없다.

 ㄴ 무조건 1차원 배열

 ㄴ map에 벨류로서 배열 불가능

 ㄴ 배열에 관한 배열에 관한 배열처럼 생성 불가능