[unrealengine4]

2023-05-19 언리얼 수업 내용(비트마스크, 인터페이스, 몽타주)

롤링페이퍼 2023. 5. 21. 21:37
★회피(Dadge) 기능 추가해 보기

2가지의 회피를 구현해 볼 것이다.

이동 입력이 있을 때는 구르기

이동 입력이 없을 때는 뒤로 회피

 

1) BP_BP_CharacterInterface 들어가 Dadge함수를 추가한다.


★열거형 파일 추가

 

2) 콘텐츠 - Enumerations폴더 추가 - 마우스 우클릭 - 블루프린트 - 열거형 - 열거형 파일이름을 'E_CharacterState' 변경

열거형 블루프린트 추가 방법

3) 열거형 파일로 들어가 6개를 추가하자


열거형 디스플레이 다룰 시 주의할 점

언리얼만의 버그가 있다. 언리얼 4에는 열거기 우측에 순서를 바꿀 수 있는 버튼이 있다. 지정해둔 디스플레이들을 순서를 바꿀수 있게 해주는 기능인데 순서를 바꿨을 때 정상적으로 작동이 된다면 안에 관련된 내용들이 같이 이동을 해야 하지만. 언리얼 개발자들도 원인을 모르는 버그로 내용물이 같이 이동이 안 되는 버그가 나올 수도 있다.

실재개발에선 순서를 바꿀일은 매우 드문 경우지만 이런 버그가 생길 시 치명적일 수 있기에 사용을 하는 것을 자제하는 것을 권장한다.

여담으로 언리얼 5에선 이 문제를 해결하지 못했는지 버튼이 있지만 활성화를 막아둬 사용을 불가능하게 막았다.

열거기 우측에 있는 기능


※ 비트마스크 : 정수의 이진수 표현을 활용한 기법

 ㄴ 비트마스크 사용 시 1 2 4 8 16 32... 순으로 번호를 매기며, 비사용시 0 1 2 3 4... 순으로 번호를 매겨준다.

 ㄴ 이진수 0, 1로 true/fasle를 정한다.

 ㄴ 하나의 변수에 다수의 boolean을 가지기 위해 사용한다.

 ㄴ 비트연산을 통해서 어떤 상태가 켜져 있는지 확인해 준다.

   -  AND 연산(&) : 대응하는 두 비트가 모두 1일 때, 1을 반환.

   - OR 연산(|) : 대응하는 두 비트가 모두 1 또는 하나라도 1일 때, 1을 반환.

   - XOR 연산(^) : 대응하는 두 비트가 서로 다르면 1을 반환.

   - NOT 연산(~) : 비트의 값을 반전하여 반환.

 

사용 방법

1) 열거형 파일에서 비트마스크 플래그 체크

2) 사용하고자 하는 블루프린터로 들어가 인티저 변수 추가

3) 만든 인터저형 변수를 클릭하면 디테일에서 비트마스크가 표시되며 열거형에서 체크해 뒀던 열거형을 찾아 클릭

4) 이후 이벤트에 열거형 변수를 set 한 후 비트 연산식을 추가하면서 다루면 된다. 참고로 다수로도 사용 가능하다.


★인터페이스의 함수 결과 + 벡터의 값에 따라 검사해 주는 노드 구현

 

인터페이스에서는 형식에 알맞은 기능들을 가지고 있어야 한다.

수업에선 시간을 위해 하나의 기능으로 사용하는 것으로 예시를 보여줄 것이다.

 

 

1) 인터페이스 파일에서 IsState 함수를 추가한다. 

이 IsState 함수는 외부에서 현재 대상이 어떤 상태인지 검사하는 역할을 해줄 것이다.

 

이 내용은 해당 상태면 true 아니면 false로 반환하도록 처리해 준다.

 

추가로 GetState도 추가해 주자.

GetState는 대상의 현재 상태를 반환할 수 있는 함수를 만들 것이다.

 

2) 이후 BP_Character로 들어가 E Character State 열거형 변수를 만들어 놓자.

이 수업 이후 Jump 바꿀 것 이기 때문에 점프에 관한 이벤트는 따로 저장해 둔다.

3) 프로젝트 세팅 - 입력 - Jump이름을 Dadge로 변경

4) BP_PlayerController에서 dadge이벤트 구현

5) BP_Character에서 인터페이스 IsState 들어가 이벤트를 구현한다.

이 기능은 해당 State랑 내가 가진 State랑 같은지 확인해 줄 것이다.

6) GetState에도 이와 같이 만들어준다.

이 기능은 내가 가진 state를 그냥 내보네 줄 것이다.

7) 아래의 내용처럼 구현하자

세부 설명을 하자면

Dadge이벤트가 호출이 되었을 때 현제 상태가 Idle인지 아닌지 확인(if)을 먼저 할 것이고, IsState에서 타깃의 State가 우리가 지정해 뒀던 Idle인지 Branch(if)를 통해 확인해 볼 것이고, 결과 값이 참이면 Dodging으로 바꿔줄 것이다.

우리는 캐릭터의 움직임에 따라 구를 것인지 백스탭 할 것인지 결정을 하는 노드를 짜야하므로, Character Movement(캐릭터 이동 담당)에서 이동값을 가져와 Get Last Input Vector로 움직임의 수치를 가져올 추출 할 것이며 추출한 값이 0인지 아닌지 확인도 해주는 Vector Is Zero 노드도 추가했다.

이후 이동이 있는지 없는지 Branch(if)의 결과에 따라서 애니메이션을 출력하도록 짰다.


 

★몽타주 생성

- 애님 몽타주 : 애니컴포지의 상위호완으로 조합을 하는 기능

 ㄴ 애니메이션(프레임)에 특정 구간을 지정해 둬 반복성을 만들 수 있다.

 ㄴ 또 다른 예로는 샷건 장전이 있는데 탄약 최대치가 있을 거고 장전 시 최대까지 장전을 반복할 것이다. 그리고 탄약이 최대치면 반복을 멈추고 다음으로 넘어갈 수 있도록 할 수 있다.

몽타주는 위에 표시해둔 것으로 조합기능을 이용해 반복성을 더 추가할수 있다.

1) Backstep, Roll 애니메이션 클릭 - 생성 - 애님 몽타주 생성

이후 우리는 애니메이션 그래프를 이용하지 않고 바로 구현되는 방법을 사용해 볼 것이다.

 

2) BP_Chatacter로 돌아가 몽타주 재생 노드를 추가

3) 이후 아래처럼 추가

Branch에 서 나온 결과로 입력값이 있으면(Ture) 구르기, 없으면(False) 백스태프로 애니메이션 되도록 노드를 짜놨다. 이후 해당 애니메이션이 끝나면 다시 Idle로 돌아가는 것으로 마무리한다.

 

추가적으로 구르기는 In Skeletal Mesh Component는 해당 Mesh, Montage to Play는 구르기 몽타주로 지정,

백스탭은 In Skeletal Mesh Component 는 해당 Mesh, Montage to Play는 백스탭 몽타주으로 지정해뒀다.

 

4) ABP_Character의 애니그래프 들어가 'DefaultSolt'을 추가


★몽타주 재생 설명

몽타주 재생

[왼쪽]

- Skeletal Mesh Componen : 이 애니메이션을 재생하려는 외형(골격)

- Montage to Play : 플레이어의 몽타주 선택

- PlayRate : 재생 속도 비율을 조절할 수 있으며 1.0이 기본속도이다.

- Staring Position : 애니메이션을 시작할 시간을 초단위로 지정해 줄 수 있다.

- Starting Section : 애님 몽타주에서 지정해 준 섹션 중 시작할 위치부터 몽타주를 재생시킬 수 있다.

 

[오른쪽]

- 실행핀 : 잠복성이 아니며 몽타주 재생을 수행하고 그냥 나오는 핀이다.

- On Complete : 애니메이션의 재생이 다 끝났을 때 호출한다

- On Blend Out : 재생이 블렌드 아웃되었을 때 실행될 이벤트를 설정하는 매개변수, 재생 중에 중단되면 지정된 이벤트 발생

- On Interrupted : 재생이 중단되었을 때 실행될 이벤트를 설정하는 매개변수, 재생 중에 중단되면 지정된 이벤트가 발생

- On Notify Begin : 재생 중에 애니메이션 노티파이션⁽²⁾이 시작될 때 실행될 이벤트를 설정하는 매개변수, 노티파이션이 시작되면 지정된 이벤트가 발생

- On Notify End : 재생 중에 애니메이션 노티파이션이 종료될 때 실행될 이벤트를 설정하는 매개변수, 노티파이션이 종료되면 지정된 이벤트가 발생

- Notify Name : 애니메이션 몽타주 내에서 특정 노티파이션의 이름을 지정하는 매개변수, 해당 노티파이션이 발생하면 관련 이벤트가 실행

 

※블렌드 아웃

   ㄴ애니메이션이 종료될 때, 부드럽게 애니메이션을 퇴색시키는 효과를 가짐, 블렌트 아웃되면 해당 애니메이션은 서서히 사라지면서 다른 애니메이션으로 전환될 수 있다.

 

※노티파이션

   ㄴ 몽타주 애니메이션 내에서 특정 이벤트 또는 상황을 나타내기 위해 사용되는 시간 기반 신호.|