식물 조금 더 심기
타 프로젝트에서 에셋 이주
조금 더 예쁜 식물을 심어보기 위해 타 프로젝트에 에셋들을 가져와보자.
원하는 에셋을 선택한 뒤 Asset Actions > Migrate를 누른다.
내 프로젝트에 Content 파일로 옮겼더니, 계층이 그대로 남아있는 모습을 볼 수 있다! 그대로 남아있는 이 구조는 확실히 유용하고 깔끔할 것 같다.
페인팅
가져온 에셋을 폴리지로 추가해 열심히 페인팅을 해주었다. 제법 멋있는 레벨디자인이 만들어지고 있는 것 같다!
게임 프레임워크
이제 레벨을 근사하게 꾸몄으니, 언리얼의 게임 프레임워크에 대해 공부할 때가 된 듯하다. 지금 프로젝트에서 플레이를 누르면,
기이하게도 초대하지 않은 손님들이 우르르 몰려온다... 대부분 자동으로 생성되는 디폴트 액터라고 한다. 강의에서는 이 중 세가지를 우리의 액터로 대체하겠다고 말했다!
Startup, Default Map 변경
스타트업 맵을 지금까지 만든 내 첫 맵으로 바꾸어주었다.
GameMode 만들기
블루 프린트로 게임 모드와 캐릭터를 만드는 단계인가보다. 블루프린트 클래스를 생성해주었다. GameMode는 블루프린트 부모 클래스인 GameModeBase, 캐릭터는 Character 클래스로 만들어주었다.
블루 프린트 부모 클래스에 대해 조금 알아봤는데,
이렇게 나누어져있다고 한다. 유니티는 MonoBehaviour로 모든 게 이루어지는데, 언리얼은 세분화가 되어있는 모양이다. 나중에 이 클래스도 한 번씩 써보고 싶다.
만든 블루 프린트의 게임 모드를 켜서 몇 가지를 변경해주었다. 기몬 Player Controller는 방금 만든 플레이어 컨트롤러 클래스, Default Pawn Class는 BP_Bot을 넣어주었따.
BP_Bot은 Character 클래스이지만, 이는 Pawn 클래스를 기반으로 하므로 넣어준다고 강의에서 들었다!
프로젝트 세팅에서 생성한 게임 모드 블루프린트를 넣어주었다. 이제 실행을 하면...
아까 봤던 기본값 대신, 내가 지정한 값들이 나왔다!
캐릭터 만들기
시작 지점 설정
캐릭터를 만들기 위해 플레이어의 스타트 지점부터 정해주었다. 신기하다! 언리얼에는 이런 기능도 있구나.
카메라
플레이어를 팔로우하는 카메라를 만들기 위해, 캐릭터 블루프린트 안에 카메라를 부착할 것이다.
카메라 작업 전, 플레이어가 캡슐로라도 게임에 보이게 하기 위해서 블루프린트 안으로 들어가 캡슐>Rendering>Hidden in Game을 해제해주었다! 이제 플레이를 해도 잘 보인다.
플레이어를 내려보기 위해 Spring Arm이라는 컴포넌트를 넣어주고, 그 자식으로 카메라를 넣어주었다.
우와!! 그랬더니 Spring Arm의 회전값을 변경하니 카메라 또한 따라간다. 자식이라 따라가는 듯하다. 꽤나 유용한 컴포넌트인 것 같다. 특히 3인칭 카메라를 구현할 때는 정말 유용할 듯하다.
Unity에서 쉽게 만들 수 있을 듯한 컴포넌트이다. 나중에 필요하다면 만들어봐야겠다.
Spring Arm의 길이도 조정하고 카메라 각도도 조정했다.
Spring Arm에는 Do Collision Test라는 속성이 있는 듯하다. 얼핏 들어봤을 때는 레이캐스트를 간소화한 느낌 같다. 나중에 카메라와 캐릭터 사이에 물체가 있으면 카메라를 그 앞으로 당겨주는 기능을 만들 때 편리할 것 같다.
플레이어가 캡슐이긴 하다만, 그래도 3인칭 카메라를 빠른 시간 안에 뚝딱 만들어냈다!
이벤트 그래프
여러 이벤트들
캐릭터 움직임은 아까 만든 Player Controller 블루프린트에서 구현한다고 한다. 이벤트 그래프라는 비주얼 스크립팅을 통해서 구현하는데, 이벤트 그래프에는 많은 이벤트들이 있다.
유니티의 기본 이벤트 함수들(Start, Update, OnDestroy...)처럼 있는데, 더 궁금해서 찾아보았다.
이 문서를 보면 많은 이벤트들에 대해서 알 수 있는데, 정리해볼 것이다.
이벤트 | 설명 |
Event Level Reset | 레벨이 재시작될 때 실행 신호를 보내는 함수 |
Event Actor Begin Overlap | 두 액터의 콜라이더가 겹치기 시작했을 때 호출되는 함수 (OnCollisionEnter) |
Event Actor End Overlap | 두 액터의 콜라이더가 겹치지 않기 시작했을 때 호출되는 함수 (OnCollisionEnter) |
Event Begin Play | 게임이 시작하면 모든 액터에게, 중간에 스폰되면 그 즉시 호출되는 함수 (Start) |
Event End Play | 액터가 더 이상 월드에 존재하지 않으면 호출되는 함수 (OnDestroy) |
Event On Destroyed | 액터가 소멸했을 때 호출되는 함수 (OnDestroy) |
Event Tick | 매 프레임마다 호출되는 함수 (Update) |
중요한 것만 추려서 정리했다. 아래는 유니티에서 비슷하거나 같은 기능을 하는 함수이다. 여기서 End Play와 Destoryed는 뭐가 다를까... 생각했는데, 바로 공식 문서 밑에
이렇게 나와있었다. C#이라면 [Obsolete] 속성을 붙여놨을 함수이다.
Print String
프린트 스트링 함수를 BeginStart 노드에 연결하여 화면에 Hello를 띄워볼 것이다.
Print String은 받는 매개변수고 참 많은데, 언리얼로 개발을 한다면 가장 많이 쓸 것 같은 함수 중 하나이다. Unity의 Debug.Log가 화면에서도 나온다니! 정말 편리한 함수가 아닐 수가 없다.
잘 뜨는 것을 볼 수 있다.
Tick에 연결했더니 로그가 엄청나게 찍혔다. 당연한 일이다.
캐릭터 움직이기
캐릭터 움직이기
캐릭터를 움직이려면 당연히 매 프레임마다 움직여주어야 하므로 Event Tick을 사용하였다. GetControlledPawn으로 나 자신이 조종하고 있는 Pawn을 반환시킨다. 반환한 타겟의 X를 1만큼 매 프레임마다 올려주는 그래프이다.
앞으로 잘 간다!
그런데, 플레이어 컨트롤러가 조종하는 폰을 가지고 왔는데, 연결해준 기억이 없는데 어떻게 저 캡슐이 반환되는 거지? 궁금에서 Game Mode에 있는 Default Pawn을 내가 만든 캡슐이 아닌, 기본값으로 다시 바꿔보았다. 플레이를 해보니...
캡슐 대신 공이 나타나서 이동하고 있는 걸 볼 수 있다. 아무래도 Game Mode에 연결된 Default Pawn이 캡슐이고, Player Controller Class가 내가 만든 Player Controller였기 때문에 폰을 찾을 수 있었던 것 같다.
이제 마우스 위치에 따라 이동해보는 그래프를 짜보겠다!
이 그래프! GetHitResultUnderCursorByChannel이라는 함수로 마우스 커서의 충돌에 대해서 다양한 정보를 담고 있는 HitResult를 가지고 있다. BreakHitResult로 이 정보를 세분화해 마우스가 충돌한 위치를 가져온다!
그리고 현재 캐릭터의 위치로에서 충돌 위치를 향한 방향을 구하고, 이 값을 AddMovementInput의 WorldPosition으로 연결하면 된다!
이렇게 쉽게 마우스 충돌 위치와 여러 정보들을 가져올 수 있고, 방향을 구하고 벡터를 더해주는 연산을 가진 함수까지 있다니!!!! 생각보다 정말 쉽게 마우스 위치로 이동하는 플레이어를 구현할 수 있었다.
입력 받기
그래프를 건드리기 전, 키 맵핑을 해주러 ProjectSetting > Engine > Input에 갔다.
Axis Mapping도 있었다! 아무튼, 나는 Toggle Input과 왼쪽 마우스를 맵핑하기로 했다. C++이니까 내부에서는 Map 자료구조를 사용하는 걸까?
이벤트 그래프로 갔더니, Toggle Input 이벤트를 구독할 수 있었다! 이렇게 편리할 수가! 역시 블루 프린트...
bool형 변수를 추가해 왼쪽 마우스를 누를 때는 True, 뗄 때는 False로 만들었다.
If 문법도 활용해 AddMovement일 때만 움직이는 것을 실행시켜주었다. 코딩이랑 다를 게 없고 사실 조금 더 번거로운데... 블루프린트 너무 재밌잖아...
입력에 따라 잘 움직이는 것을 볼 수 있다.
'Unreal' 카테고리의 다른 글
[공부일지][3일차] <Your First Game In UE5> 5 (1) | 2023.01.24 |
---|---|
[공부일지][3일차] <Your First Game In UE5> 4 (0) | 2023.01.24 |
[공부일지][2일차] <Your First Game In UE5> 3 (0) | 2023.01.23 |
[공부일지][1일차] <Your First Game In UE5> 1 (1) | 2023.01.22 |
[공부일지][1일차] <Your First Game In UE5> 0 (1) | 2023.01.22 |