언리얼엔진

55. 카메라 쉐이킹 / 데이터, 스트링 테이블

찬이2 2023. 7. 27. 23:02

* 만약 레벨에서 맵의 크기를 수정했다면, 네비게이션 빌드 경로를 한번 다시 해주자. (AI의 이동에 문제 발생 여지가 있음)

* 정현 == Sine


카메라 쉐이킹(흔들림) 구현하기

MatineeCameraShake

우클릭 - 블루프린트 클래스 - 모든 클래스 : MatineeCameraShake 추가하기(CamShake)

CamShake 내부의 디테일을 살펴보자.

* Oscillation : 진동

- Duration : 기간

- Blend In / Out Time : 서서히 자연스럽게 진동이 강해지                                          고 약해지는 시간

- Rot / Loc : 회전 / 이동 진동

- FOV : 시야각

 

 

 

 

 

 

 

 

 

 

 

 

Rot Oscillation(회전 진동)은 활용하기 좀 애매하다.

우선 Oscillation Duration(진동시간)은 0.25초, Blend In/Out은 0.1로 설정해주었다.


* Loc Oscillation 세부사항

- Amplitude : 증폭(진동의 폭)

- Frequency : 주파수(진동의 속도)

- Initial Offset : 초기 오프셋. 어떻게 시작할지

   ㄴRandom : 랜덤 오프셋 사용(기본값)

   ㄴZero : 오프셋 제로. 오프셋 없이 시작

 

- Waveform : 진동에 사용할 웨이브 폼 유형

   ㄴSine Wave : 규칙적인 형태

   ㄴPerlin Noise : 자연계의 불규칙한 형태

 

 

 

 

 

여기서 X방향으로의 진동은 적용하지 않을 것이다.(앞뒤의 진동은 차이가 별로 안난다)

따라서 Y, Z만 Amplitue : 5.0, Frequency : 150.0, Waveform : Sine Wave로 설정해주었다.


이렇게 CameraShake를 설정한 뒤, BP_Player에서 캐릭터가 피격 시 발동하도록 할 것이다.

따라서 BP_Player 블루프린트 클래스의 이벤트 그래프에 와서 AnyDamge 이벤트를 하나 추가했다.

 

BP_Player의 이벤트그래프 AnyDamage 이벤트

이후 부모의 AnyDamage를 불러주어야 한다.

Cam을 관리하고 있는 Controller를 받아와서 PlayerController로 형변환시켜준다.

그리고 Player Camera Manager을 가져와서 Start Camera Shake 함수를 실행시킨다.

 

Start Camera Shake

- 타깃 : 어떤 카메라를 대상으로 할 것인지

- Shake Class : 우리가 아까 만든 Cam Shake(MatineeCameraShake) 설정

- Scale : Shake를 더 쌔게 비율을 설정해줄 수 있다.

- Player Space

   ㄴCamera Local : 카메라를 중심으로의 공간

   ㄴWorld : World 중심으로의 공간

   ㄴUser Defined : 유저가 제공하는 공간을 중심으로


스트링 테이블과 텍스트를 사용한 문자열의 일원화

StringTable(스트링 테이블)

우클릭 - 기타 - 스트링 테이블을 추가한다.(NewStringTable)

NewStringTable 내부

NewStringTable 내부에서 제일 하단에 있는 키 / 소스 스트링 입력칸에 입력하여 키와 소스 스트링을 만들어둘 수 있다.


BP_Player 이벤트그래프로 돌아와서 Make Literal Text를 추가한다.(String과 Name에서는 쓸 수 없다)

이를 쓰면 StringTable에 대한 참조를 잡을 수가 있다.

Value를 선택하는 과정에서 스트링 테이블로 아까 만든 NewStringTable을 잡아준다.

그러면 NewStringTable 안에 있는 Key들 중 하나를 선택할 수 있다. 

이는 전역에서 Text를 만든다고 한다면 모두 가능하다.

(여러 곳에서 같은 문자열을 안전하게 사용할 수 있게 해주는 수단)

 

* 여기서 선택한 Value는 수정할 수 없다. 따라서 이런식으로 문자열을 사용할 것을 권장한다고 한다.


만약 Text를 Name으로 바꾸고자 한다면 Text → String → Name 순으로 차례대로 변환해주어야 한다.

Text를 Name으로 변환하기

 

 

 

 

 

 

 

 

 

 

 

 

 

 


해당 스트링 테이블은 열거형에서도 사용할 수 있다.(디스플레이 이름 우측 화살표를 눌러 인라인 텍스트에서 지정)

* 열거형에서는 중복된 이름을 가질 수 없다. 따라서 계속 스트링 테이블을 추가하고 싶다면, 전에 추가한 스트링 테이블의     키를 첫번째 키가 아닌 다른 키로 지정해야 다음에 추가가 가능하다.

열거형에서 스트링 테이블 사용하기


Data Table(데이터 테이블)

우클릭 - 기타 - 데이터 테이블을 추가할 것이다.(NewDataTable)

데이터 테이블 추가를 누르면, 행 구조 선택이 뜨는데, PlayMontageParameters(구조체)를 임시로 선택해줬다.


NewDataTable 데이터 테이블 내부로 들어와서 추가를 누르면, 위에서 선택한 구조체에 대한 테이블을 만들 수 있다.


이를 BP_Player에서 활용해보자. 먼저 BP_Player에서 변수 추가(DataTable 유형)를 해준다.

BP_Player에서 추가한 DataTable 유형 변수


그리고 해당 DataTable 타입의 변수에서는 아래와 같은 4개의 함수가 제공이 된다.

일단 4가지 모두 Name이 필요한 공통점이 있다.

(여기서 Name에 아까 만든 StringTable을 사용할 수도 있다.)

- Does Data Table Row Exist : 데이터 테이블 내에 Name이라는 행이 존재하는지의 여부

- Get Data Table Column as String : 데이터 테이블에서 한 열(Name)에 대한 모든 행을 배열로 반환한다.

- Get Data Table Row Names : 데이터 테이블에 있는 모든 Row(행) 이름을 배열로 반환한다.

- 데이터 테이블 행 가져오기 : 특정 행 이름을 가지고 데이터 테이블에서 테이블 행을 구한다.


CompositeDataTable(컴포짓 데이터 테이블)

마찬가지로 우클릭 - 기타 - 컴포짓 데이터 테이블을 추가하면 행 구조 선택을 하게 된다.(NewCompositeDataTable)

이것도 임시로 PlayMontageParameters를 선택해준다.

 

NewCompositeDataTable의 내부

Parent Tables를 선택하는 것이 보인다.

따라서 같은 구조체를 가지는 데이터 테이블을 부모로 여러개 지정할 수 있다.


DataTable과 StringTable은 우클릭 - csv로 익스포트하여서 엑셀표로 살펴볼 수 있다.

또한 외부의 csv파일을 DataTable과 StringTable로 임포트할 수도 있다.