TIL 2025.01.31 기록
0. 개요
오늘은 벌써 이번달의 마지막 날이다.. 원래 설 연휴동안 강의를 모두 듣고, 과제에 집중해서 다 끝내는게 목표였는데..
명절은 쉽지 않은것 같다.. ㅠㅠ
그래도 좋은 시간은 보냈어서 역으로 좋았다.
문제는 감기에 걸려서 큰일이다..
아무튼 잡담은 여기까지하고, 오늘은 강의를 2주차 전부 들었다.
캐릭터 만들기, 향상된 입력 시스템, 플레이어 컨트롤러, 게임모드, 애니메이션 등등을 배웠다.
연휴동안 너무 쉬기만 했어서 속도를 높여야 할 것 같았다..
어쨋든 이번 과제의 목표는 레이저 퍼즐 게임 1스테이지 만드는게 목표이고, 캐릭터 움직임, 드론 움직임 구현 후 인터페이스를 통한 Select 가능한 액터들을 만들어 플레이어가 캐릭터나 드론으로 들고 움직이거나 회전시킬 수 있도록 구현해 퍼즐을 풀도록 할 것이다.
1. 강의 정리
2. 과제 진행
1. 랜덤 스포너 구현하기
랜덤 스포너의 경우 아이디어는 다음과 같다.
우선 2차 행렬을 만들어서 Board를 만들어둔 다음에, 시작 지점으로 부터 한칸씩 이동해 해당 발판들은 길이되어 떨어지지 않는 발판으로 설치한다.
반대로 지나가지 않은 발판은 떨어지는 발판을 설치해 플레이어가 밟으면 다시 시작 지점으로 되돌아가게 한다.
사실 이렇게만 짜려면 로직이 그렇게 어려워 보이지 않았다.
단순히 다음 노드를 방문할 때 4방향중 무작위로 이동하면 되고, 이동을 하고 나서는 이전 발판의 주위 발판을 이동 불가 발판으로 만들어주면 되기 때문이다.
(물론 고려할건 있지만..)
하지만 이번에 더 괜찮은 알고리즘이 없다 찾아보다가 프림 알고리즘을 알게되었다.
음.. 랜덤 미로 생성 알고리즘에 대해 공부한건데, 보통 Binary Tree나 Side Winder를 많이 사용하는 걸로 보였다.
각각각 이런 저런 단점들이 있었다.
위키를 찾아보니 미로 생성 알고리즘도 엄청 다양하게 있어서 놀랐다.
Maze generation algorithm - Wikipedia
From Wikipedia, the free encyclopedia Automated methods for the creation of mazes Maze generation algorithms are automated methods for the creation of mazes. This maze was generated by a modified version of Prim's algorithm, below. Graph theory based metho
en.wikipedia.org
음.. 그러다가 프림 알고리즘으로 구현한것이 있길래 구현도하고, 공부도 할겸 프림 알고리즘을 사용해 만들어보려 했다.
이전에 최소 신장 트리를 만들거나 관련 문제는 풀어봤는데, 프림 알고리즘은 사용한적이 없어서 이번 기회에 공부하게 되었던 것 같다.
미로 생성 알고리즘을 사용해 만들어서 좋은 점은 위 사진 처럼 좀 더 다양한 길이 나온다는 점이었다.
단순히 길 하나 이어가기보다 이쪽이 더 재미있을 것 같았다.
또, 길 하나 이어가는 방식은 비어있는 칸들이 많을 가능성이 있는데, 해당 방법은 그래도 보다 더 많은 타일을 사용하기 때문에 마음에 들었다.
언리얼 클래스를 코딩하기에 앞써 미리 C++코드로 구현해 콘솔창에 띄워보았다.
보드의 크기가 작을수록 미로가 단순해서 조금 아쉽긴 하지만, 이건 어쩔 수 없는 부분인 것 같다..
(오히려 이럴 때는 이전 방법으로 하는게 나을지도...)
이후에는 ARandomMazeSpawner 클래스를 만들어서 함수와 변수들을 추가해주었다.
이제 기능적인 부분은 거의다 나왔는데, 몇 가지 추가할게 있었다.
- 디버그 드로우 추가
어느정도 크기의 미로가 생성될지, 각 발판 사이즈는 어떤지 시각적으로 보여주고 싶었다. - 완성된 Board에 알맞게 발판 생성
이렇게 크게는 2가지인 것 같다.
2. 랜덤 스포너에 디버그 드로우 사용해보기
랜덤 스포너는 스태틱 매시를 지정해주지 않을 생각이어서 이렇게 준비했다.
(근데 생각해보면, 콜리전 없는 매시를 설정했다가 나중에 플레이 때는 메시 시각화를 꺼주는 것도 괜찮은 방법으로 보인다..
그도 그럴게, 에디터에서 작업할 때, 편하게 하기 위해서 하는 것인데, 결국 디버그 드로우를 보려면 Tick이 호출되어야 한다... 때문에 이번에는 디버그 드로우를 사용해봤다에 의미를 두고, 나중에 실제 구현할 때는 디버그 드로우보다는 콜리전이 없는 매시를 넣어주고, 나중에 플레이가 되면, 랜더링을 꺼주는 방향으로 갈 것 같다.) <- 개인 적인 생각.. ㅎㅎ
void ARandomMazeSpawner::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
DrawDebugBox(GetWorld(), GetActorLocation(),FVector(100.f, 100.f, 100.f), FColor::Cyan);
}
함수의 인자들을 살펴보면,
- UWorld
말 그대로 디버그 드로우를 그릴 월드를 전달해주면 된다. - Center(WorldLocation)
음.. 상대 로케이션인줄 알았는데, 월드 로케이션이었다.. - Extent
Box기준 사이즈인 것 같다. - Color
색상으로 FColor라는 이넘클래스값을 선택해 전달해주면 된다.
등으로 이루어져 있다.
이 외에의 인자들도 받지만 우선 이정도만 사용해도 충분해 보였다.
나중에 시간이 좀 더 여유가 생기면 그때 나머지 디버깅 드로우들도 좀 더 살펴볼 생각이다.
3. 마무리
앞으로는 강의 내용 정리는 따로 올리고, 과제나 추가적으로 배운 것들만 TIL에 적고, 강의 내용정리는 따로 링크를 첨부할 생각이다.
그리고 오늘은 강의만 집중해서 들어서 사실 과제 진도나 추가적으로 사용해본 것은 적은 것 같아 아쉬웠다.. ㅠ
감기에 기운있어서.. 병원에 다녀와서 약먹었는데.. 아직 팔팔하지만 내일이 두려워서 오늘은 일찍 쉬고, 주말을 이용해 밀린 과제를 하려한다.
목표는 마지막 과제 기능 구현까지 모두 마무리 하는 것이다.
그러면 월요일과 화요일에는 액터들을 배치해 스테이지를 완성하는 것만 집중할 수 있기 때문이다.!!