Tilemap 정보 읽어오기
🌝 공지 사항 이 포스트는 인프런의 입문자를 위한 UE5-Part2. 언리얼 엔진 2D 게임 개발 입문 강의를 통해 학습한 내용의 요약입니다. 자세한 내용은 해당 강의를 참고해주세요.
타일맵의 정보를 읽어오는 법
- 사전 준비 : BP_TileMap 생성. Render Component의 Tile Map을 생성한 타일맵으로 교체한다.
- 다른 BP들과 마찬가지로, Component들을 꺼내올 수 있다.
- 따라서, Render Component 안에 있는 Tile Map과 타일맵이 가지는 여러 Detail을 모두 출력할 수 있다는 뜻.
읽어오기
- 따라서, Render Component 안에 있는 Tile Map과 타일맵이 가지는 여러 Detail을 모두 출력할 수 있다는 뜻.
- 목적 : 타일맵의 모든 요소를 순회하면서 이동할 수 없는 타일을 체크하는 것
- 먼저 순회하기 위해서 타일맵의 Width, Height를 곱해서 모든 타일의 개수를 변수에 입력한다.
- 모든 요소를 순회하면서 해당 타일에 벽 Layer에 속하는지 확인한다.
- 앞서 타일맵을 제작할 때, 벽은 Layer를 따로 생성했기 때문에 [해당 Layer에 타일이 있다(is valid) == 이동할 수 없다]
- (실제 코드 참고)
- 벽이라면 False, 땅이면 True 처리해서 List가 정확히 출력되는지 확인.
- 먼저 순회하기 위해서 타일맵의 Width, Height를 곱해서 모든 타일의 개수를 변수에 입력한다.
Grid Pos to Index : 타일맵의 XY값이 있을 때 저장한 MapGrid의 Index로 변환하기
- xy값을 가지고 해당 타일이 갈 수 있는 곳인지 체크하기 위해서는 저장한 True/False를 검사할 수 있도록 Index로 변환이 가능해야 한다.
- Input으로 들어온 X와 Y값이 맵의 범위 안에 있는지 체크한 뒤, X값 + (Y값 * width) = Index값이 되므로, return하는 함수를 구현한다.
Get Tile Pos : 타일의 Position값을 가져오기
타일이 맵 상에 실제로 위치하는 Location 값을 가져오기 위함.
- 맨처음 타일을 만들 때 사용했던 TileSet을 확인하면 타일의 Size가 32 * 32(pixel)인 것을 알 수 있다.
- 우리는 사이즈를 5배씩 키워두었으므로, 이 사이즈에 5를 곱한다. Y축은 아래로 이동해야하니, -5를 곱함.
- Actor(BP_TileMap)의 Location을 구한 뒤 각각 X, Z축에 더해준다.
제대로 배치되는지 TEST
- BP_Knight로 이동 후 Get Actor Of Class로 Tilemap을 가져온다.
- Get Tile Pos를 이용해서 플레이어를 배치할 공간의 좌표를 알아낸다.
- 위치에 나이트를 배치시켜 본다.
한칸씩 이동
현재까지 타일의 X, Y 좌표를 이용해서 Location을 확인하는 법을 만들었고, 더불어 함수 내에서 이동이 가능한 영역인지(맵의 범위 안에 있는지 + 이동가능한 타일인지) 확인하는 것까지 구현되었다.
이제 어떻게 해야하겠는가?
- Move에 대한 처리는 BP_Creature.UpdateLogic()과 BP_PlayerController에서 하고있다.
- GridPos Structure를 선언한다.
- Creature 안에서 이동 로직을 개선한다.
- 키보드 입력이 있으면 다음칸을 목적지로 지정하고 도착할 때까지 이동하는 함수를 구현
- 목표지점에 도착하면 멈추도록 한다.
- Update Logic
- HasArrivedToDest() : DestLocation과 ActorLocation을 뺀 값이 10 이하이면 도착한 것으로 체크해서 bool 값 리턴
- UpdateLogic에서는 State가 Move이고 HasArrivedDest가 false일 때에 UpdateDestination()과 AddMovementInput()을 실행한다.
- Update Destination()
- StopMove가 false일 때, Destination을 GridPos로 변환해서 얻은 TileMap의 좌표값이 CanGo()를 통해서 갈 수 있는 곳인지 체크하고, 맞으면 SetDestination 한다.
- PlayerController에서는 이를 위한 로직을 추가로 구현
- Destination을 자꾸 체크하는 것을 막기 위해서 MoveUp과 MoveRight value 외에 추가로 Move상태로의 변환에 HasArrivedToDest 조건을 추가한다.
뭔가 굉장히 복잡해졌다… 시간날때 한 번 씩 보자
댓글남기기