배틀레드_던전 지하층

양규빈·2024년 3월 16일

유니티

목록 보기
24/34

던전 지하 기믹 링크

지하 던전

원소비석과 점프대에 이어지는 파트입니다.
원소비석 기믹 해제 후, 점프대에 올라 잠겨있던 방 안으로 들어오면 지하로 내려갈 수 있는 층계가 존재합니다.

계단 가까이 이동하면 지하 구역으로 이동할 수 있습니다.

의도한 기믹의 개요는 다음과 같았습니다.

하층의 오브젝트와 상층의 오브젝트로 나뉘어, 플레이어 캐릭터는 각 오브젝트를 연결해가며, 다음 칸으로 이동해간다.

이때, 상하 이동 구역을 통해서, 상층부로 넘어가 길이 끊어진 지역을 넘어갈 수 있다.

오브젝트

바닥과 천장의 구조물은 개발했던 자동화 툴을 이용해서 채워넣었습니다.

기믹의 핵심이 될 타워 오브젝트는 던전 에셋의 일부 지형을 끌어와, 유니티 에셋 스토어의 ElementTotem을 import 후. 조합하여 만들었습니다.

마찬가지로 길이 연결되었음을 시각적으로 표현할 수 있도록, 무료 에셋 VolumetricLines 패키지를 가져와, 사용했습니다.

스크립트

기믹의 구현을 위한 스크립트 작성 과정에서 기존의 캐릭터 컨트롤 스크립트나 게임 매니저, 던전 매니저 등에 전체적인 수정이 필요했습니다.

타워 오브젝트

오브젝트의 Y축 회전을 제어하는 토템에는 AttackInteractionObj 레이어가 설정되어, 플레이어의 SwordCollider에 감지됩니다.

이렇게 감지된 객체는 오브젝트 매니저를 통해서 관련 함수를 Call하도록 됩니다.
그렇기에 InteractionObject 클래스를 추가하여, 지정된 Name값을 기준으로 오브젝트 매니저가 행동을 판단할 수 있도록 하였습니다.

UnderObj_CircleBlock 클래스는, 타워 각각에 부착된 클래스로서, 주요 기능에는 타워의 Rotate. 그리고 부모 객체와의 통신을 통한, 기믹 해제 여부에 따른 결과 출력 등이 있습니다.

타워 오브젝트에는 원소비석에서 사용했던 원형 서클 발판이 존재하며, 마찬가지로 플레이어 진입 시 옵저버 패턴을 통해서, 부모 객체에게 이벤트가 발생했음을 알릴 수 있습니다.

즉, EnterTriggerFunctionInit은 플레이어가 발판 진입 시 호출되는 함수로 상속받은 Subject 객체에 내장된 함수인 CallUndergroundObjectNorify()를 호출함으로써, 써클 발판과 관련된 처리를 하도록 합니다.

객체의 회전 함수는 주사위 큐브에서 구현된 것과 크게 다르지 않습니다.
Y축을 기준으로 회전하고, 목표 각도에 따라서 분기하여, 현재 각도에 90을 더한만큼 회전합니다.

다만, 천장에 매달린 상층 구역의 경우에는 X축 계산과 Z축 계산을 반대로 해야, 올바르게 객체가 회전할 수 있기에 이 부분을 고려했습니다.

역중력(ReverseGravity)과 캐릭터 이동

A지점에서 B지점으로의 이동은, 게임을 구현하는 데 있어서 종종 쓰이곤 합니다.
그렇기에 캐릭터의 컨트롤을 담당하는 CharacterControlMng 클래스에, A-B 이동 기능을 담아서 필요할 때마다, 호출할 수 있도록 하였습니다.

불필요한 코드를 여러번 작성하는 것보다는, 관련된 기능을 하나로 묶어서 해당 함수만 호출하는 편이 객체지향에 가깝기 때문입니다.

Move_aPoint_to_bPoint 함수는 여러 매개변수를 오버로딩하여 일정 시간 대기 후에, 이동동 되거나 즉시 이동, 혹은 일정 시간에 걸쳐서 이동하는 등의 기능이 동작됩니다.

상단의 함수는 코루틴을 이용하여 일정 시간 동안 a지점에서 b지점으로 이동하는 함수입니다.

상단의 함수는 즉시 b지점으로 이동하거나, 일정시간 대기 후에 a지점에서 b지점으로 이동하는 함수입니다.

역중력은 부울변수를 통해서 제어됩니다.

RotateX_Dgree함수는 코루틴을 이용하여, 일정 시간에 걸쳐서 캐릭터의 X축을 회전하는 함수입니다.
즉, 캐릭터를 180도 반전 시킵니다.

리버스 중력 상태에서는, 중력의 방향이나 이동의 방향도 수정되어야 합니다.
부울 변수를 통해서, 역중력 상태임을 확인한다면, 분기하여 중력의 방향을 조정하고 이동 방향을 조정하도록 했습니다.

지하 기믹 관리 함수

지하 기믹은 결국, 각 타워 간의 지정된 각도에 따라서 성공 유무를 판단하고, 성공 시에 Laser 객체를 활성화 시키는 것입니다. 여기에 만약 회전 객체가 아니라면, 상하 이동을 가능하도록 할 것입니다.

옵저버 패턴을 통해 호출된 함수는, 자기 자신(타워)를 매개변수로 받아서, 해당 객체가 Hit상태인지. 즉 토템에 컨트롤이 발생했는지. 그게 아니라면, 써클에 진입했을 때. 직선 이동이 가능하도록 각도를 춘 상태인지 판단합니다.
그리고 이에 따라 적절히 함수를 호출하여, 기능을 구현합니다.

NameCorrector는 Dictionary 에서 사용될 보정 이름을 자르는 함수입니다.
모든 타워 객체의 이름은 JumpRoadbot01과 같이 JumpRoad 이후에 번호 등을 작성하기 때문에, JumpRoad_을 파싱한다면, 각 객체를 구분할 수 있게 됩니다.

CheckLastObject는 현재 진입한 써클이, 마지막 타워 오브젝트의 것인지 판단하고, 마지막 객체라면 보상과 관련된 동작을 하도록 합니다.
여기서는, 주사위 퍼즐과 마찬가지로 보물상자를 동적으로 생성하도록 하였습니다.

직선이동은 수평상 같은 Y축에 존재하는, A타워와 B타워 간을 잇는 행동입니다.
이를 위해서는 먼저, 타워 객체가 올바른 방향을 바라보고 있는지 체크할 필요가 있습니다.

써클에 진입하였을 때, 호출되며, 딕셔너리에, 파싱된 객체의 이름을 넣어서 객체의 목푯값이 저장된 List 객체의 인덱스 값을 가져오고 각 값을 비교하여, 방향 일치 여부를 판단하여 Return해줍니다.

직선이동 기능을 실질적으로 담당하는 함수입니다.
먼저 객체명을 보정하여, Dictionary에 넣어서 목표 객체의 이름을 가져오고, 해당 값을 다시 딕셔너리에 넣어서, 매핑된 타워 객체(목표물)을 가져옵니다.

이후, 해당 도착지 객체의 자식 객체 중에서 EndPos를 찾아와서, Transform으로 인스턴스화합니다.

그리고 캐릭터 컨트롤러 클래스에 내장된 A-B 포인트 간 이동 함수를 호출함으로써, 각 지점 간의 이동을 시킵니다.

이때, 타워객체에서 떨어지지 않도록 설치해둔 콜라이더(보이지 않는 벽) 해제 했다가, 다시 풀어주는 작업이 필요합니다.

상하이동 기능을 담당하는 함수입니다.
직선 이동과 마찬가지로, 객체의 이름을 파싱하여 딕셔너리에 넣고 필요한 데이터들을 추출합니다.
여기서도 수평이동과 마찬가지로 목표 객체의 이름을 요구합니다.

목표 객체를 가져온 후에, EndPos를 인스턴스화 하고, Vector3의 자료형으로 저장하여, A-B 이동을 시작합니다.
이와 함께, 캐릭터의 회전을 위해서, isReverseGround 변수를 바꿔줍니다.

이러한 로직을 거치면, 내부적으로는 이동 코루틴이 돌아감과 동시에, 역중력 코루틴이 비동기적으로 동작하여 하->상 혹은 상->하 타워로 이동하면서 역중력/정중력 상태로 돌입하게 됩니다.

profile
훌륭한 개발자를 꿈꾸는 중입니다

0개의 댓글