배틀레드_퍼즐

양규빈·2024년 1월 8일

유니티

목록 보기
18/34
post-thumbnail

퍼즐 풀이와 중간통로문 영상

퍼즐 구현

오픈월드 게임에는 내부의 컨텐츠로 여러가지 미니게임을 배치하곤 합니다.
예를들어 호요버스사의 원신과 같은 경우에는 같은 공격으로 큐브를 돌려서 같은 문양을 맞추는 퍼즐,
혹은 원소 반응을 이용하여 푸는 퍼즐 문제 등이 있습니다.

배틀레드에도 이러한 퍼즐적 요소를 추가해보았습니다.
아무런 코스트 없이 상호작용만으로 해제할 수 있었던 던전 중앙통로에, 열쇠라는 조건을 달아두었고.

열쇠는 필드 내의 퍼즐 기믹을 해제함으로써 얻을 수 있게 한 것입니다.

이러한 미니게임의 배치는 컨텐츠 소모를 늦추고, 새로운 오락거리를 제공함으로써 흥미를 유발하는 등의 이점이 있을 것입니다.

상단의 유투브는 해당 시연 영상을 담은 영상입니다.

오브젝트

퍼즐 오브젝트의 구현은 다음과 같이 하였습니다.
부모 객체인 Puzzle을 빈게임 오브젝트로 생성한 후, 해당하는 스크립트를 컴포넌트로 부착,
이후. 스크립트를 이용하여 퍼즐 오브젝트를 제어관리합니다.

이때 각 큐브 프리팹은 특정 레이어.
AttackInteractionObj를 설정하여, 몬스터와는 별개로 플레이어가 공격을 감지할 수 있도록 하였습니다.

TriggerEnter를 감지해야하므로, IsTrigger를 체크하고 RigidBody를 부착하였습니다.

이에 따라, 큐브를 통과하지 못하도록 자식객체로써 BoxCollider 컴포넌트를 하나 더 두었습니다.

스크립트

플레이어의 Sword 객체에 부착된 스크립트입니다.
충돌을 감지하여, 데미지 계산이나 상호작용을 합니다.

Monster 레이어를 감지하는 것과 별개로, AttackInteractionObj 레이어를 감지할 수 있도록 하였습니다.

레이어 충돌 감지 후. 충돌체가 PuzzleObject 스크립트를 가지고 있다면, 해당 클래스를 GetComponent하여 퍼즐을 회전할 수 있도록 했습니다.

충돌한 퍼즐 오브젝트와, 그 주위의 퍼즐 오브젝를 회전시키는 함수입니다.
제어플래그를 두어서, 중복으로 호출되는 문제가 발생하지 않도록 하였습니다.

현재 각도를 eulerAngles로 받아서 저장합니다.
이후, 90을 더한 후에 360으로 모듈러 연산을하여 목표 y값을 정합니다.
그리고 타임값만큼, 오브젝트의 Y축을 회전시킵니다.

targetY가 0이라면.
currentAngle이 270으로. 359.9값을 목표로 잡고 y축을 Rotate해야하는데, 이는 360이 엔진 상에서 자동으로 0으로 보정되기 때문입니다.

또한. 디버깅 결과,
currentAngle이 0이 되는 것을 고려하여.
조건문으로 안전하게 예외처리를 해두어야 했습니다.

마지막으로 정확한 각도 세팅을 위해서, targetY값을 객체 각도로 고정하고 플래그 변수를 false로 바꾼 후에.
정답 체크 함수를 호출합니다.

정답체크는 큐브 객체를 저장한 puzzleDice 배열을 순회하면서, 모든 객체가 동일한 각도를 가지는지 체크합니다.

이때, Offset을 고려해야 하는데,
오프셋은, 큐브 객체의 월드 상의 실제 위치를 고려하여.
개발자가 public으로 입력한 보정값입니다.

반복문 순회 후.
정답이 true인 것으로 판명되었다면,
오브젝트 매니저를 통해서, 보물 상자를 생성하고. 크기를 조정.
마지막으로, 보물상자와의 상호작용을 위해서 보물상자의 Name변수 값을 수정하고, 매니저의 관리용 딕셔너리에 InteractionObject 클래스를 추가합니다.

이렇게 저장된 Name값은, 플레이어가 상호작용 후, 기능 함수를 호출하는데 사용됩니다.

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

0개의 댓글