일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Algorithm
- Unreal Engine 5
- guide
- w3school
- Tutorial
- String
- loop
- 문제풀이
- 파이썬
- github
- 오류
- parameter
- dynamic
- Unity
- dfs
- 재귀
- Class
- DP
- Material
- 프로그래밍
- 기초
- C#
- 백준
- W3Schools
- c++
- python
- UE5
- Basic
- Programming
- 시작해요 언리얼 2022
- Today
- Total
행복한 개구리
Unreal Engine 5로 첫 게임 만들기 18 (Spawn, Destroy, Collision Overlap, Is Player Controlled, Function, On Component Begin Overlap) 본문
Unreal Engine 5로 첫 게임 만들기 18 (Spawn, Destroy, Collision Overlap, Is Player Controlled, Function, On Component Begin Overlap)
HappyFrog 2022. 7. 1. 16:44Unreal Engine 5로 첫 게임 만들기 17 (AI Controller, AI MoveTo, NavMesh, Dynamic Material Instance, Vector Parameter Value
Unreal Engine 5로 첫 게임 만들기 16 (Animation, Analysis, Locomotion, Transition Rule, Blend Space, Animation Blueprint) Unreal Engine 5로 첫 게임 만들기 15 (Character Movement, Character Rotation,..
bodong2.tistory.com
이전 게시글에서 이어집니다.
Spawn and Collect Orbs
게임 로직을 더 만들어봅시다.
우선 소품을 추가하게습니다.
SM_Door, SM_GenericPlayerPickup_Core, SM_Modular_WallDoor, SM_PressurePlate_Frame, SM_PressurePlate_Platform을 FirstGame의 Props로 가져오겠습니다.
* 영상에선 SM_Door, SM_Modular_Walldoor, SM_Pickup_Orb, SM_PressurePlate_Frame, SM_PressurePlate_Platform 입니다.
가져온 메쉬들의 머티리얼은 이전에 만들어둔 머티리얼과 같은 이름인 흰 머티리얼이 할당되어 있습니다.
만들어둔 머티리얼로 바꿔줍니다.
Core부터 시작해봅시다.
GameElements 폴더에 새로운 블루프린트를 만듭니다.
Actor 베이스의 BP_Orb로 명명합니다.
블루프린트를 열고 이 곳에 컨텐츠 드로어에서 메쉬를 드래그 앤 드롭해주세요.
그러면 자동으로 StaticMesh 컴포넌트가 생성될 것입니다.
이것을 Root Element로 만들고 Details > Collision Presets > OverlapOnlyPawn을 선택해주세요.
이건 나중에 사용할 것이지만, 미리 설정해둔 것입니다.
우선 이 구체를 월드에 스폰하는 방법을 알아봅시다.
PlayerController로 돌아가서 입력에 따라 액션을 Trigger하겠습니다.
Project Setting > Engine > Input 에서 Action Mappings를 추가하겠습니다.
이름을 SpawnOrb로 해주세요.
그리고 키할당을 누르고 Space Bar를 눌러 액션에 바인딩해줍니다.
이제 컨트롤러로 돌아가 SpawnOrb를 검색하여 추가합니다.
Release 채널에서 드래그하여 Spawn actor from class를 추가해줍니다.
클래스는 BP_Orb로 해주세요.
그리고 Spawn Transform 을 우클릭하여 구조체를 분할합니다.
이러면 구조체 변수에 접근할 수 있으며 이제 스폰할 위치가 필요합니다.
봇의 현재 위치(스페이스 바를 누를 때의 위치)를 사용해봅시다.
노드를 복사해와서 위치에 연결하고 저장해줍니다.
이제 걸어다니면서 오브를 스폰할 수 있게 됐습니다.
이제 월드에 이 오브가 있으면 AI가 수집하게 하려고 합니다.
따라서 봇이 (0, 0, 0)이 아닌 구체를 향해 걸어가게 해야합니다.
AIController를 열어주세요.
AI에 구체를 찾을 수 있도록 함수를 추가하고 이름은 FindOrb로 해줍시다.
구체를 찾았는지 출력하는 함수로 만들 것입니다.
FindOrb함수에서 출력부분에 Boolean타입의 Success와 Actor타입의 OrbActor를 추가해주세요.
이제 로직을 만들어봅시다.
우선 Get All Actors Of Class로 클래스의 모든 액터를 얻어옵니다.
그 중에서도 우리가 찾을 BP_Orb로 설정해줍니다.
이러면 모든 오브의 영역이 나옵니다. 따라서 list형식으로 나옵니다.
Length를 사용하여 목록에 요소가 존재하는 지 파악합니다.
이 Length가 0보다 크다면 Branch를 사용합니다.
이 값이 True라면 뭔가를 찾는 것이고 False라면 찾지 못하는 것입니다.
이제 단순하게 접근해서 목록의 첫 번째 구체만 얻고 반환 노드에 연결합니다.
Compile을 누르고 Event Graph로 돌아가 FindOrb를 추가하면 함수를 트래킹할 수 있습니다.
노드를 직접 만들었으니 이전처럼 연결할 수 있습니다.
하지만 이번 경우에는 함수를 Pure로 설정할 수 있습니다.
Pure로 설정한다면 실행핀이 없는 것을 확인할 수 있습니다.
이 노드의 값이 필요할 때마다 실행된다는 점에 유의하세요.
하지만 지금은 괜찮습니다.
FindOrb가 성공하면 AI MoveTo 명령을 실행하고 Orb Actor 출력을 Target Actor에 연결합니다.
그리고 AI가 목적지에 성공적으로 도착하면 다시 움직이게 해야하므로 OnSuccess에 Move를 추가하여 연결합니다.
또한 타이머를 변경해야합니다.
Looping에 체크하여 3초마다 확인하게 합니다.
씬으로 돌아가 확인해봅시다.
3초가 지나면 봇이 오브를 찾아 뛰어옵니다.
하지만 저 구체가 사라지지않고 계속해서 리스트의 첫번째 구체일 것이기 때문에 다른 구체를 쫓아가지 않을 것입니다.
따라서 AI가 구체에 닿으면 월드에서 삭제해줘야합니다.
구현하기 위해서 컴포넌트가 제공하는 이벤트를 사용하면 됩니다.
BP_Orb > StaticMesh > Add Event > Add OnComponentBeginOverlap을 선택합니다.
이전에 미리 설정했듯이 이 액터는 pawn하고만 오버랩될 것입니다.
Pawn에는 우리가 조작하는 Bot과 AI Bot이 모두 포함됩니다.
여기서 오브와 오버랩되는 액터를 구합니다.
플레이어가 오브를 스폰하자마자 오브로 뛰어가게 하려는 것은 아니므로 둘을 구분할 필요가 있습니다.
따라서 Cast Pawn을 활용하여 구분하겠습니다.
형변환을 할 때 주의할 점이 있습니다.
- 하드 레퍼런스가 있으므로 액터가 메모리에 로드될 때마다 형변환된 액터도 모두 로드된다는 것입니다.
As Pawn에서 드래그하여 Is Player Controlled로 플레이어가 제어하는 폰인지 확인합니다.
AI 컨트롤러와 Player 컨트롤러가 있으니 사진과 같이 Is Player Controlled의 값이 False라면 제어하지 않는 AI Controller이므로 부딛힌 오브가 Destroy되도록 설정해주세요.
씬으로 돌아가 확인해봅시다.
오브가 사라지니 새로운 첫번째 오브를 찾아 따라오는 모습입니다.