빈 오브젝트를 9개 생성하여, 각각에 박스 콜라이더 트리거를 적용했습니다.
이 오브젝트들은 플레이어의 이동에 의해 맵과 트리거가 함께 이동하게 됩니다.
[1][2][3],
[4][5][6],
[7][8][9]
편의를 위해 9개의 트리거에 임의의 숫자를 할당하였습니다.
중앙을 제외한 8방향에 대해 각각 Vector3 형태의 변수로 1칸(3)만큼의 이동값을 할당했습니다.
예를 들어, 플레이어가 왼쪽으로 이동한다면 X값이 감소하고, Z값의 변화는 없으므로 new Vector3(-3, 0, 0)로 표현할 수 있습니다. 이렇게 이동하는 경우 4번 트리거에 닿게 됩니다.
그 후에는 콜라이더 검출을 통해 다른 오브젝트(플레이어)가 해당 트리거에 닿으면, 자신의 트리거 번호를 확인하여, 1번 트리거라면 맵과 모든 트리거를 Vector3 area1만큼 이동시키는 작업이 이루어집니다.
나머지 2~9번 트리거도 이와 같은 메커니즘으로 작동합니다.
MonsterManager 클래스는 적(몬스터) 객체에 대한 정보를 관리합니다.
적이 사망하면 플레이어의 스테이터스를 상승시키거나 다양한 효과의 아이템을 드랍하게 됩니다.
또한, 적 객체는 NavMeshAgent 클래스를 이용하여 스폰 이후 플레이어를 추적하며, 추적 유효 범위, 속도, 회전 각도 등의 설정이 이 클래스에서 이루어집니다.
traceRange(추적 유효 범위)를 설정한 이유는, 한 번 스폰되고 영구적으로 쫓아올 경우 오브젝트가 쌓여 메모리가 낭비되는 현상이 발생할 수 있기 때문입니다.
적 객체는 Random.Range 클래스를 사용하여 플레이어 위치로부터 랜덤한 값을 더하여 스폰됩니다.
아이템을 드랍하는 코드입니다.
적 객체가 사망할 시 85.0% 확률로 아이템을 드랍하게 됩니다.
아이템의 종류는 6가지가 있으며, 그 중 91.0% 확률로 노말 아이템(공격속도, 공격력, 이동속도, 체력 증가 중 1)이 드랍되며, 나머지 9.0% 확률로 레어 아이템(클리너, 자석 중 1)이 드랍됩니다.
자석 아이템을 획득하면 필드에 남아있는 근처 경험치 오브젝트가 전부 플레이어에게 끌려오는 효과를 줍니다.
먼저 ExpManager 클래스에서 경험치의 2가지 상태(대기, 이동)를 설정하고, 자석 아이템을 획득했을 때 유효 범위와 추적 속도를 정했습니다.
대기(Idle) 상태일 때 추적을 비활성화하고, 이동(Move) 상태일 때 자신의 거리와 플레이어의 거리를 계산한 값이 추적 유효 범위(traceRange)보다 낮으면 네비게이션의 목적지를 플레이어의 위치값으로 정합니다.
이 코드는 Update에서 다루어져 플레이어의 위치가 변경되어도 목적지도 계속 갱신되어 자연스러운 효과가 연출됩니다.
이후 Player 클래스의 콜라이더 검출 함수에서 '자석 아이템을 습득할 때'에 로직을 작성해줍니다.
먼저 "EXP" 태그를 가진 모든 게임 오브젝트를 찾아 배열에 저장할 것인데요, 배열은 "EXP" 태그를 가진 모든 오브젝트를 포함하게 됩니다.
찾은 "EXP" 태그를 가진 모든 오브젝트에 대해 반복문을 실행하여 각 오브젝트의 ExpManager 컴포넌트를 가져와서 expState 변수를 ExpManager.instanceE.expState1 (이동 상태)로 설정합니다.
이후 충돌한 상대방 오브젝트를 파괴하여 더 이상 충돌이 감지되지 않도록 합니다.
AutoFire 클래스입니다. 발사 지점을 Transform 컴포넌트를 받아왔습니다.
LookMouse 함수입니다.
마우스 위치에 따라 카메라에서 생성된 레이가 교차하는 지점을 계산하고 오브젝트를 해당 지점을 향해 회전시키는 역할을 합니다.
이 코드는 플레이어의 공격을 관리하는 코루틴입니다.
플레이어의 공격 속도에 따라 발사 간격을 atkSpeed 변수로 설정하고, 플레이어의 기본 공격력을 atk로 받아옵니다.
trF는 spPointF의 전방으로 *50 만큼 밀어내는 발사 효과를 가지며, 기본적으로 이 위치에서 bullet 프리팹이 생성됩니다.
만약 기본 공격력인 atk 값이 20 이상, 40 이상, 80 이상, 120 이상이라면, 각기 다른 spPoint들의 좌표를 받아와서 발사 위치를 점차적으로 늘려 공격을 강화하는 효과를 연출합니다.
마지막으로 사용한 yield return new WaitForSeconds(atkSpeed) 코드는 플레이어의 공격 속도에 따른 연사속도를 제어하는 역할을 합니다.
이 코드를 통해 공격 후 일정 시간 동안 기다렸다가 다음 공격이 가능하도록 합니다.
velog는 영상 첨부가 불가능하여 이 곳에 들어가면 확인할 수 있습니다.