오브젝트 생성하기
오브젝트 설정
새 오브젝트를 만들기 위해 Actor 블루 프린트를 생성해주었다. .
에디터에 들어가서 메쉬를 놓아주고 Collision Presets를 OverlayOnlyPawn으로 설정해주었다. 아직 이유는 가르쳐주지 않으셨는데, 강의를 보다가 나오면 추가로 적을 것이다.
입력에 따른 오브젝트 생성
입력을 받는 기능을 구현하기에, 이제는 익숙하게 Project Setting > Input에서 키를 맵핑해주었다.
Player Controller의 이벤트 그래프로 와서 방금 만든 Action을 생성해주었다. 키를 뗄 때 Spawn Actor From Class라는 함수를 호출해주었다. Class에는 만든 오브젝트의 클래스를 넣어주었다.
Spawn Actor From Class
간단하게 지정된 트랜스폼으로 새 액터를 생성하는 함수라고 한다.
그리고 Spawn Trnasofrm을 우클릭해 Split Struct Pin을 클릭해봤는데...
이렇게 나눠졌다! 신기해! 내 생각에는, 저 노드에서 직접 실행을 한다면 Split Sturct Pin을 활용해 나누고, Transform 변수나 함수를 연결하려면 나누지 않는 것 같다. 확장성을 생각하면 Split Sturct Pin은 그리 좋은 방법이 아니라고 생각한다.
라고 하자마자, 강의 선생님이 Location에 현재 위치를 연결해버리셨다...
바보. X, Y, Z를 입력할 수 있다고 연결할 수 없는 게 아니라는 사실을 간과했다! Transform은 나누는 게 좋은 것 같다 ^__^
짠~ 스페이스바를 누르면 구슬을 생성하는 모습이다~~~
오브젝트를 생성하니, 갑자기 간단한 스크롤 슈팅 게임도 만들 수 있을 것만 같은 자신감이 차올랐다! 진짜로!!
AI 만들기
AI Controller로 움직이기
AI를 만들기 위해 블루프린트 클래스에서 AI Controller를 선택해주었다.
Event Graph로 가서, 캐릭터에게 이동 명령을 내릴 수 있는 AIMoveTo 함수를 사용했다. 게임 시작 N초 후에 캐릭터에게 명령을 내려주기 위하여 Set Timer By Event라는 함수를 사용했다.
N초 타이머를 센 후에 연결된 이벤트를 실행시켜주는 함수 같다. Looping도 있으므로 Unity의 Invoke와 InvokeRepeating과 닮았다는 생각을 했다.
Move라는 커스텀 이벤트를 만들어 AIMoveTo 함수를 연결해주었다. AI MoveTo 함수가 Move를 구독하는 형태인 듯하다. GetControlledPawn을 사용해 현재 제어 중인 폰에게 이 명령을 전달했다.
레벨에 끌어다놓은 캐릭터를 클릭한 후 Pawn > AI Controller Class의 AI Controller를 방금 만든 컨트롤러로 바꿔주었다.
NavMesh
캐릭터가 다닐 영역을 설정하기 위해 NavMeshBoundsVolume을 생성해주었다. Unity에서도 종종 보던 아이라 친숙해서 기분이 좋았다. NavMesh를 생성하면
이렇게 작게 영역이 나오는데, Transform에서 스케일을 늘려주면...
이렇게 영역이 커졌다!
Construction Scrpit
일단 플레이어와 AI의 머티리얼이 같기 때문에, 비교를 위해 색을 바꿔줄 예정이라 한다. 이 과정에서 Construction Script를 쓴다고 하는데, 이게 뭐지... 싶어서 검색해봤다.
블루프린트 인스턴스 생성시 컴포넌트 리스트 다음에 실행되는 부분이다.
따라서 블루프린트 인스턴스에서 필요한 초기화 작업을 할 수 있다.
사실 아직 감은 잘 오지 않지만, 같은 블루프린트여도 다른 처리를 해주고 싶을 때 이용하는 친구 같다.
색을 변경시키기 위해 노드를 짜주었다. 블루프린트가 생성되면 동적으로 만든 머티리얼을 반환하는 함수를 실행시켜 얻은 머티리얼의 Color 파라미터의 값을 Color 변수로 바꾸어주는 코드이다.
Color 변수는 밖에서 바꾸지 못하면 아무 소용이 없으므로, 밖에서 바꿀 수 있도록 눈 아이콘을 클릭해준다. Unity로 치면 [SerializeField]를 붙여주어 인스펙터에서 볼 수 있게 하는 것 같다.
플레이어가 주황색으로 스폰이 되도록 DefaultValue를 다시 주황색으로 설정했다! 레벨로 돌아가서 AI의 Color를 변경해주었다.
잘 변하는 것을 볼 수 있다! 신기하다 신기해...
목표 설정
생성한 구체를 따라가게 하기 위해 구체를 찾는 함수를 만들어볼 것이다! 드디어 커스텀 함수!
반환형은 찾았는지에 대한 Bool형 하나, 찾은 Actor형 하나가 있다. 왜 반환형이 두 개이지? 오버로딩된 함수일까, 아니면 다른 편리한 방법이 있는 걸까?
간단한 로직의 함수를 만들었다. 구체 클래스를 레벨에서 모두 담고 있는 배열을 가져온다. 길이가 0보다 크지 않으면, 비었으므로 기본값을 반환해준다. 0보다 크다면, Success를 True로 체크한 후 0번째 액터를 OrbActor로 설정한 후 반환시킨다.
왜 반환형이 여러 개인 것에 의문을 가졌었지만, 내 생각엔 Output이 단순히 "반환 자료형"이 아니라, 그 함수에서 값을 설정해 반환하고 싶은 모든 것들을 데이터핀으로 표현하는 것 같다.
Pure를 설정해 실행 핀이 없는 함수를 만들었다. 이 노드의 값이 필요할 때마다 실행되는 함수로 만들어주는 것이다.
함수를 써서 로직을 구현했다. Find Orb의 Success가 참일 대만 AI MoveTo를 실행해주고, OrbActor를 TargetActor로 설정해준다! 구체를 찾았다면, 찾는 함수를 호출한다. 찾지 못했다면, 3초마다 구체를 탐색하고 구체를 따라가는 AI가 될 것이다.
잘 따라온다! 하지만, 구체 배열의 첫번째 요소는 항상 첫번째 생성한 구체이다. 따라서, 아무리 많은 구체를 생성하고 많은 시간이 흘러도 AI는 처음 구체 자리에만 있는다.
그렇다면, AI가 이동했다면, 구체를 소멸시켜보자!
오브젝트 소멸
구체 블루프린트 안에서 OnComponentBeginOverlap 이벤트를 추가해주었다. 폰과 접할 때만 저 이벤트가 실행된다. 아까 선택한 OverlayOnlyPawn의 기능이 그렇다.
닿은 Actor를 Pawn으로 캐스팅한다. 이때, 액터가 메모리에 로드될 때마다 형변환된 액터도 모두 로드된다는 것을 주의하라고 강의에서 말씀하셨다.
아무튼, 로직은 Pawn으로 형변환시켜 플레이어에게 조종당하는지 아닌지를 체크한다. 조종당한다면 플레이어, 그렇지 않다면 AI이므로 AI일 때 Destroy Actor 함수를 이용해 본인을 소멸시킨다!
'Unreal' 카테고리의 다른 글
[공부일지][3일차] <Your First Game In UE5> End (0) | 2023.01.24 |
---|---|
[공부일지][3일차] <Your First Game In UE5> 5 (1) | 2023.01.24 |
[공부일지][2일차] <Your First Game In UE5> 3 (0) | 2023.01.23 |
[공부일지][2일차] <Your First Game In UE5> 2 (1) | 2023.01.23 |
[공부일지][1일차] <Your First Game In UE5> 1 (1) | 2023.01.22 |