UE4 Chapter 11-2. 시네마틱 : 게임에서 영상 플레이하기
카테고리: UE4 Lesson 1
태그: UE4 Game Engine
인프런에 있는 황대희님의 언리얼 엔진4 3D 횡스크롤 게임 만들기 강의를 듣고 정리한 필기입니다. 😀
언리얼 엔진 공식 문서 https://docs.unrealengine.com/ko/index.html
🚖 게임에서 영상 플레이하기
플레이어가 보스 근처에 가면 자동으로 이전에 만든 시네마틱 영상이 플레이 되게끔 하기. 👉 보스가 있는 지점에 충돌 체크를 해야 함. 충돌이 일어나면 영상 플레이.
🚩 “BossCinematicTrigger” 액터 블루프린트
Mesh가 없는 빈 액터 “BossCinematicTrigger” 블루프린트를 생성한 후 위와 같이 Box Collision 컴포넌트를 붙여주고 콜리전의 크기를 조정해준다.
이렇게 보스가 있는 곳 계단 즈음에 “BossCinematicTrigger” 블루프린트를 통해 액터를 레벨에 배치해준다. 이제 플레이어가 이 곳을 통과하면 시네마틱 영상이 플레이되게 할 것이다.
ActorBeginOverlap
- 유니티에서의 Trigger 충돌 이벤트처럼 이 액터가 다른 액터와 겹칠 때 발생하는 이벤트. (물리적 충돌로 튕겨지는게 아니라 통과될 때, 즉 겹칠 때)
- 이 액터(“BossCinematicTrigger”)의 Collision 에 Trigger 충돌 이벤트가 발생하면 레벨 시퀀서를 생성하고(Create Level Sequence Play) 이를 재생한다.
- 생성할 레벨 시퀀서는 지난번에 만든 마스터 레벨 시퀀스인
Master_Boss1
- 생성할 레벨 시퀀서는 지난번에 만든 마스터 레벨 시퀀스인
🚖 영상 플레이 시작시, 영상 끝날시 처리해줘야 할 작업
🚩 “BossCinematicTrigger” 액터 블루프린트
이렇게 많타…
- 이벤트
ActorBeginOverlap
👉 영상이 시작될 때 처리해 줄 작업들OnFinish_Boss1Sequence
(커스텀 이벤트 만듬) 👉 영상이 끝날 때 처리해 줄 작업들
영상 시작 할 때 해 줄 작업들
ActorBeginOverlap
“BossCinematicTrigger” 액터의 Box Collision 과 겹쳐지면 발생
- 1️⃣ 마스터 레벨 시퀀스 플레이
- Create Level Sequence Player
Master_Boss1
마스터 레벨 시퀀스를 재생시킬 시퀀서 생성
- Play
Master_Boss1
마스터 레벨 시퀀스를 재생- 현재 위치로부터 재생한다.
- Create Level Sequence Player
- 2️⃣ 영상 재생이 다 끝나고난 후에 영상 재생 끝 날 때 해 줄 작업들을 진행할
OnFinish_Boss1Sequence
커스텀 이벤트를 호출한다.- Get Length
- 레벨 시퀀스 영상 길이 리턴
Master_Boss1
마스터 레벨 시퀀스를 타겟으로 받아와 이의 영상 길이(Float)을 리턴
- Set Time by Event
- 시간(Float)을 입력 받아, 해당 시간을 타이머로 하여 이 시간이 지나고난 후에 입력 받은 이벤트를 호출한다.
- Get Length
- 3️⃣ 플레이어 캐릭터의 움직임을 막기 위해 입력을 불가능하게 한다. 시네마틱 영상이 재생되는 중에 플레이어 캐릭터가 키보드 입력을 통해 카메라 앞을 가리면 안되기 때문에..
- Disable Input
- 입력을 받지 않는다. 타겟은 0 번째 Player Character의 Player Controller 입력을 받지 않음.
- Disable Input
- 4️⃣ “BossCinematicTrigger” 액터의 Collision 을 비활성화 시킨다.
- Set Actor Enable Collision
- 원인을 찾지 못했지만, 시네마틱 영상 재생 중에도 “BossCinematicTrigger” 액터에 플레이어 캐릭터 액터가 충돌을 일으켜 영상이 새로 다시 시작되고 다시 시작 되고 무한 반복하는; 그런 일이 생겼다. 캐릭터는 Collision 보다 한참 앞에 있는데 왜 자꾸 충돌됐던걸까. 아무튼 그래서 그냥 시퀀스 재생이 시작되면 “BossCinematicTrigger” 액터의 Collision 을 비활성화 시켜서 문제를 해결했다.
- 타겟은 self (“BossCinematicTrigger” 액터)
- Set Actor Enable Collision
- 5️⃣ 모든 액터들을 검사하여 Character 클래스의 자식인 클래스들(플레이어, 몬스터, 보스 블루프린트 이렇게 3가지)타입을 가진 액터들을 보이지 않게 + Tick Event 를 돌리지 않게 한다.
- 설명
- 시퀀스 영상은 플레이어, 보스 액터로 찍는 것이 아닌 플레이어와 보스 Mesh 를 배치하여 찍었기 때문에(이전 포스트 참고) 영상이 재생되는 동안에는 실제 게임 로직에 사용되는 플레이어, 보스 액터는 1️⃣ 안보이게 해야 하고(렌더링 하지 않음), 2️⃣ 그들 각각의 블루프린트에서 Tick Event 를 돌리지 않도록, 즉 아무 기능도 하지 않도록 해야 한다.
- 몬스터 액터들도 마찬가지다. 플레이어를 추적하기 때문에 영상 재생 중에 플레이어를 공격하거나 영상에 뜻하지 않게 출연할 수 있으므로 1️⃣ 안보이게 해야 하고, 2️⃣ 그들 각각의 블루프린트에서 Tick Event 를 돌리지 않도록 해야 한다.
- 몬스터, 플레이어, 보스 블루프린트는 Character 클래스의 자식 클래스로 만들어진 블루프린트이다. 다형성에 의해 Character 타입인 액터만 찾으면 된다.
- Get All Actors Of Class
- 특정 클래스 자식인, 해당 레벨의 모든 Actor 들을 찾아 배열에 담아 리턴한다.
- 유니티의 FindObjectOfType 같은 함수인듯 하다.
- 레벨에 액터가 많다면 성능에 부하가 생길 것이다.
- Foreach
- 입력 받은 배열의 모든 원소들에 대해 반복을 진행한다. 배열의 모든 원소 순회가 끝나면 자연스레 종료 됨. Array Element 는 매 반복의 원소, Array Index 는 매 반복의 인덱스, Completed 는 foreach 문이 다 끝나면 실행 되는 핀. Loop Body 는 foreahc 문이 돌건 말건 반복 시켜 놓고 바로 다음 실행핀 실행.
- 해당 액터(원소)의 클래스가 “Character” 타입이거나(OR), “CharHpBarBP” 타입이라면(몬스터의 HP bar 액터, 얘도 사라져야 하므로)
- 1️⃣ Set Actor Hidden In Scene
- 해당 원소를 안보이게 한다. New Hidden 에 체크
- 2️⃣ Set Actor Tick Enabled
- 해당 원소의 Tick Event 를 멈추고자 Enabled 는 체크 해제
- 1️⃣ Set Actor Hidden In Scene
- 설명
- 6️⃣ 플레이어의 UI 도 영상 재생 중엔 안보이게
- Get Game Instance로 “SideScrollGameInstance” 게임 인스턴스를 가져와서 예전에 만들었던, 파라미터 값에 따라 플레이어 UI를 화면에 띄우거나 해제하는 Show Game Play Main Widget 함수를 호출. 플레이어 UI 를 화면에 그리지 않도록 파라미터는 False 로 넘김.
영상 재생 끝 날 때 해 줄 작업들
- 영상 재생이 다 끝나고난 후에 실행 될
OnFinish_Boss1Sequence
이벤트. - 1️⃣ 영상에 출연했던 “mutant”, “root_sword_and_shield_idle” 메시를 안 보이게 한다.
Actor
타입의BossMesh
,PladinMesh
변수를 만들고 눈을 뜨게 해주면 에디터 상에서 보이게 된다. 언리얼 에디터 디테일 패널에서 변수에 각각 시퀀스 영상에 출연하기 위해 배치되어 있는 두 Mesh 를 각각 할당해준다.- Set Actor Hidden in Game 으로
BossMesh
,PladinMesh
두 메시를 New Hidden 체크
- 2️⃣ 플레이어 키보드 입력 다시 활성화
- Enable Input
- 3️⃣ 모든 액터들을 검사하여 Character 클래스의 자식인 클래스들(플레이어, 몬스터, 보스 블루프린트 이렇게 3가지)타입을 가진 액터들을 다시 보이게 + Tick Event 를 다시 돌리게 한다.
- New Hidden 체크 해제, Enabled 체크
- 4️⃣ “BossCinematicTrigger” 액터는 이제 필요 없으므로 Foreach문이 끝나면 Destroy 한다.
- 5️⃣ 플레이어 UI 를 다시 활성화 한다. (IsShow : True)
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄
댓글 남기기