일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- python
- github
- Tutorial
- Programming
- C#
- dynamic
- 기초
- parameter
- Algorithm
- Class
- UE5
- 프로그래밍
- 오류
- String
- Basic
- w3school
- DP
- 시작해요 언리얼 2022
- dfs
- c++
- 재귀
- W3Schools
- 문제풀이
- Unreal Engine 5
- loop
- Unity
- 백준
- 파이썬
- Material
- guide
- Today
- Total
행복한 개구리
Unreal Engine 5로 첫 게임 만들기 19 (Interaction, Animation, Door, Custom Event, Event Dispatcher, Get Component by Class, Get, Trigger) 본문
Unreal Engine 5로 첫 게임 만들기 19 (Interaction, Animation, Door, Custom Event, Event Dispatcher, Get Component by Class, Get, Trigger)
HappyFrog 2022. 7. 5. 19:35
Unreal Engine 5로 첫 게임 만들기 18 (Spawn, Destroy, Collision Overlap, Is Player Controlled, Function, On Component Begi
Unreal Engine 5로 첫 게임 만들기 17 (AI Controller, AI MoveTo, NavMesh, Dynamic Material Instance, Vector Parameter Value Unreal Engine 5로 첫 게임 만들기 16 (Animation, Analysis, Locomotion, Trans..
bodong2.tistory.com
이전 게시글에서 이어집니다.
Interaction Component
인터랙션과 게임 엘리먼트를 더 추가하겠습니다.
밟으면 문이 열리는 압력 판을 만들고 로봇이 압력 판을 트리거할 수 있게 할 것입니다.
우선 블루프린트 액터 클래스를 하나 더 만듭니다.
이것을 BP_PressurePlate로 명명하겠습니다.
그리고 열어서 SM_PressurePlate_Frame과 SM_PressurePlate_Platform을 가져옵니다.
SM_PressurePlate_Frame을 루트로 만들어주세요.
이제 하려는 작업은 뭔가가 올라가면 발판이 위아래로 움직이게 하는 것입니다.
그렇게 하려면 Box Collision 컴포넌트를 추가하여 트리거로 활용해야 합니다.
원하는 영역을 모두 덮도록 약간 스케일을 키웁니다.
이제 On Component Begin Overlap 이벤트를 추가합니다.
이전 구체를 삭제하는 이벤트에서도 사용했던 것이지만 이번엔 On Component End Overlap 이벤트도 필요합니다.
이것이 잘 작동하는지 확인하기 위해서 On Component Begin Overlap에는 Hello를 출력하고
On Component End Overlap에는 Bye를 출력하게 합니다.
씬으로 돌아가 컨텐츠 드로어를 열어 씬에 압력판을 생성합니다.
그리고 플레이하여 봇이 발판에 오르내릴 때 정상적으로 Hello와 Bye가 출력되는지 확인합니다.
올라갈 때 트리거가 작동하므로 Hello를 출력하며 내려올 땐 트리거가 끝나므로 Bye를 출력합니다.
트리거가 잘 되는 것을 확인했으니 이제 발판이 밟히면 눌리고 발판에서 로봇이 발판 위에서 벗어나면 발판이 다시 위로 나오게 할 것입니다.
테스트용으로 만들었던 Print String을 모두 제거합니다.
압력판 애니메이션을 작업하기 위해 Add Timeline 노드를 추가합니다.
이름은 PlateAnimation으로 하겠습니다.
타이머를 열어 살펴봅시다.
+Track > Float Track을 추가합니다.
Track의 길이를 0.5로 설정합니다.
우클릭을 하여 키를 하나 추가합니다.
키의 시간과 값을 모두 0으로 설정합니다.
다음에 키를 하나 더 만들어 0.5초에 값을 1로 합니다.
이제 이 값은 시간에 따라 값이 0에서 1로 상승합니다.
이 값을 이용하여 발판을 움직일 것입니다.
이벤트 그래프로 돌아갑시다.
이 float핀이 타임라인 재생 중에 값을 제공하도록 하겠습니다.
SM_Pressure_Plate_Platform을 가져옵니다.
이것과 Set Relative Location을 연결합니다.
시작은 (0, 0, 0)이지만 발판이 눌리고 다시 올라와야 하므로 시간에 따라 z축의 위치를 바꿔줘야 합니다.
따라서 PlateAnimation의 Update를 연결시킵니다.
그리고 위에서 말했듯이 z축의 위치만 갱신할 것이므로 계산 노드 하나를 사용하기 위해 multiply를 검색하겠습니다.
이것의 핀은 회색으로 표시되는데, 와일드카드 핀이어서 다른 변수가 될 수 있기 때문입니다.
뭔가를 드래그해 넣으면 자동으로 바뀝니다.
이제 위치벡터의 구조체 핀을 분리하고 PlateAnimation > Multiply > Location Z 로 연결해줍니다.
발판이 1에 도달하면 -20정도로 재생합니다.
이것을 타임라인에 연결하여 발판이 오버레이되면 재생 및 역재생합니다.
발판이 들어갔다 나오는게 보이시나요? 잘 구현되었습니다.
발판이 눌리는 정도가 마음에 들지 않는다면 Multiply의 계수를 변경하며 조절해주세요.
이제 됐습니다.
문으로 사용할 액터를 더 만들고 BP_Door로 명명해주세요.
그리고 앞서 했던것과 같이 벽 프레임을 가져와 액터의 루트로 만들어줍니다.
다음으론 문 메쉬가 두 개 필요합니다.
양 쪽 메쉬가 같아야하니 하나의 메쉬를 두 번 추가합니다.
문의 이름에 L, R을 붙여 좌, 우를 구분합니다.
문은 움직일테지만 상대위치가 (0, 0, 0)이 되면 좋을 것입니다.
간단한 트릭을 사용해보죠.
Scene 컴포넌트를 추가하고 이름을 Anchor_L로 해주세요.
이것을 알맞은 위치로 옮긴 뒤, Anchor_L하위에 SM_Door_L메쉬를 넣어주세요.
SM_Door_L의 상대 위치를 (0, 0, 0)으로 설정해주시면 됩니다.
반대쪽도 마찬가지로 Anchor_R을 만들어 위치를 정해주고 그 하위에 SM_Door_R을 넣어준 다음에 (0, 0, 0)으로 만들어주면 됩니다.
하지만 SM_Door_R은 SM_Door_L과 회전각이 같으므로 180도 회전시켜주어야 반댓문의 역할을 할 수 있습니다.
Anchor_R의 회전각을 180도 돌려줍니다.
이제 문을 Anchor 아래 두었습니다.
작업하기 편리한 구성이 완성됐죠.
Event Graph로 들어가 기존 노드를 모두 지워줍시다.
왜냐하면 이번엔 커스텀 이벤트로 시작할 것이기 때문입니다.
Custom Event를 추가하고 이름을 OpenDoor로 만들어줍니다.
그 다음엔 ClosedDoor라는 Custom Event를 만들어주세요.
그리고 Timeline을 추가하여 이름을 DoorAnimation으로 명명해주세요.
아까와 거의 비슷한 구성입니다.
하지만 곧 사소한 차이를 볼 수 있을 것입니다.
DoorAnimation으로 들어가 0.5초(Length)로 설정해주세요.
* 영상: 벡터 트릭을 사용해도 좋지만 0~1 영역 내에서 작업하고 나중에 배수로 값을 미세조정하면 커브를 매번 변경하지 않아도 돼서 그 편을 더 선호합니다.
Float Track을 추가합니다.
키를 하나 추가하여 Time = 0.5 Value = 1.0으로 설정합니다.
하나 더 추가하여 두 값을 모두 0으로 설정합니다.
위 사진에서 표시해둔 수평, 수직에 맞춰주는 버튼을 누르면 사진과 같은 모습으로 적용됩니다.
두 키를 선택하고 우클릭하여 Break타입으로 바꿔주면 위 사진과 같은 곡선형을 가지게 됩니다.
여기서 오른쪽 핀의 각을 틀어주면 사진과 같이 점점 증가폭이 커지는 그래프로 만들 수 있습니다.
이제 그래프로 다시 돌아갑시다.
SM_Door_R, L을 가져와 이번에도 Set Relative Location을 연결해줍니다.
앵커 아래 이걸 놓아두면 아주 유용합니다.
이번에도 벡터를 구조체 핀 분할하고 Multiply를 사용할 것입니다.
Timeline의 업데이트를 Set Relative Location과 연결해줍니다.
Door Movement는 Multiply로 -70값을 주어 Location Y로 설정했습니다.
이것을 테스트하기위해 조금 더 노드를 추가할 것입니다.
Event BeginPlay를 추가하고 3초 Delay시킨 후 Open Door를 실행시킵니다.
문을 계곡 입구에 배치했습니다.
실행하면 3초뒤에 문이 열리는 것을 볼 수 있습니다.
이제 어떻게 발판을 눌러 문이 열리게 할 수 있을까요?
여기서 우리는 소유한 컴포넌트를 사용할 것입니다.
Blueprint를 Actor Component 타입으로 만들어주세요.
이름은 BP_InteractionComponent로 명명하겠습니다.
게임 로직을 담는 작은 상자라고 생각하면 좋습니다.
이 블루프린트에는 프로젝트의 어떤 액터든 넣을 수 있습니다.
열어보면 지금까지 봤던 액터 블루프린트와 비슷하게 생겼지만 뷰포트나 컴포넌트가 없습니다.
기존 노드를 제거해주세요.
간단하게 작업을 해봅시다.
나중에 외부에서 호출할 수 있도록 커스텀 이벤트를 만들고 StartInteraction이라고 명명해주세요.
커스텀 이벤트를 하나 더 만들어 StopInteraction이라고 명명해주세요.
다음으로는 Event Dispatcher를 달아 이벤트가 일어났음을 우리가 월드에 알릴 수 있게 합니다.
Event Dispatcher를 추가하여 OnInteract로 명명합니다.
그리고 Details에서 변수를 추가하고 Boolean타입의 on 변수를 만듭니다.
이것을 Event Graph로 끌어와 생성합니다.
StartInteraction과 연결하고 on을 True 처리 해줍니다.
그리고 StopInteraction과도 연결해주는데, 이것은 on을 False 처리 해주세요.
필요한 컴포넌트는 이게 전부입니다.
이것을 연결해봅시다.
방금 만든 새 컴포넌트를 압력판에 추가할 수 있습니다.
BP_PressurePlate에서 컴포넌트로 BP_InteractionComponent를 추가합니다.
이것에서 Start Interaction과 Stop Interaction을 생성하고 각각 상호작용을 하면 Start Interaction하면 Play하고
상호작용이 끝나면 Stop Interaction을 통해 Reverse하도록 합니다.
잘 작동하는지 테스트해보기 위해서 Print String 노드를 추가해주세요.
위 사진처럼 설정했다면 발판과 봇이 오버랩될 때 Hello를 출력하고 오버랩의 끝이 호출되면 Bye가 출력될 것입니다.
잘 작동합니다.
이제 문으로 돌아가서 테스트 코드를 지웁니다.
Event BeginPlay에서는 컴포넌트의 Event Dispatcher를 Listen해야합니다.
Event Dispatcher는 월드에 Interaction의 시작과 중단을 알려줍니다.
우선 새 변수를 추가하고 Trigger로 명명합니다.
그리고 변수의 타입을 Actor > Object Reference로 변경해줍니다.
모든 액터는 Interaction 컴포넌트를 가질 수 있기 때문입니다.
이것을 그래프로 끌어와 Get으로 생성하고 '검증된 Get으로 변환'을 해줍니다.
이제 이 Trigger에서 Get Component by Class를 검색하여 연결해줍니다.
그리고 Component Class를 우리가 만든 BP_InteractionComponent로 설정해주세요.
이제 이 액터에 BP_InteractionComponent가 있는지 확인할 수가 있습니다.
유효한 지 한번 더 확인합시다.
두 경우가 모두 확인되면 여기 있는 액터에 게임 로직이 만들어진 것입니다.
이어서 Event Dispatcher OnInteract에 커스텀 이벤트를 할당(Assign)합니다.
OnInteract 이벤트에서 Branch를 사용하여 True / False일 때 서로 다른 함수를 실행할 것입니다.
Branch를 사용하여 True면 상호작용 중이니 Open Door를 실행합니다.
False면 Closed Door를 실행합니다.
그리고 변수에서 Trigger의 눈모양 아이콘을 눌러 인스턴스별로 편집 가능하게 해야합니다.
이제 다 됐습니다.
저장하고 레벨로 돌아가 확인해봅시다.
잘 작동합니다.
이전에 만들었던 것들을 이용하여 압력판 위에 구체를 생성하여 AI가 발판을 밟아주면 문이 열립니다.
우리는 이를 이용하여 문을 통과하여 탈출할 수 있는 게임을 만들 수 있습니다.
또는 상자를 밀어서 압력판에 올려도 됩니다.