원소비석은 메터리얼을 바꾸는 것으로 비석의 심볼 색상을 구현했습니다.
각 심볼은 비석이 요구하는 원소를 나타내며.
적색은 불.
청색은 물.
녹색은 풀.
자색은 번개.
민트색은 바람으로 대치됩니다.
또한, 파티클 이팩트를 비활성 상태로 보유하고 있어.
플레이어가 일치하는 원소로 공격을 했을 경우에 활성으로 전환하여 원소 비석이 활성화 되었음을 가시적으로 표현했습니다.
점프대를 나타내는 마법진 또한, 초기에는 비활성화 상태로 두어서 플레이어가 모든 원소 비석에 원소반응을 일으켰을 경우에 활성 상태로 전환하도록 하였습니다.
원소비석과 점프대를 구현하는 데 있어 관련된 클래스는 오브젝트 매니저와 캐릭터의 Sword 클래스, 카메라 컨트롤러 등이 있습니다.
오브젝트 매니저는 원소비석의 활성화와 직접적인 관련이 있으며,
소드 클래스는 캐릭터의 공격을 통한 오브젝트와의 충돌 감지를 감지하는 데 필요합니다.
카메라 컨트롤러는 ToTarget 상태로 전환하여, 해제한 기믹을 통해서 플레이어가 얻게 된 리워드를 확인하는 데 사용됩니다.
추가로 구현해야하는 부분은,
플레이어가 점프대(마법진) 위에 올랐을 때.
충돌을 감지하여, 일정 조건을 만족하였을 때. 기능 함수를 호출하는 부분이 필요했습니다.
기존의 소드 클래스에 추가된 함수입니다.
충돌을 감지한 otehr 객체가 InteractionObject일 경우에.
객체에 설정된 Name 값을 가져와, 조건문으로 검사합니다.
이후, 비석에 설정된 원소명에 따라서 분기하여 플레이어의 현재 원소 상태를 추적하여 일치하지 않는다면 return하고
모든 과정을 만족하였을 때.
오브젝트 매니저를 호출하여, 기능 함수를 호출하도록 합니다.
오브젝트 매니저에 추가된 함수입니다.
obj의 Name값을 확인하고 함수를 호출하는 것은 동일합니다.
각 비석이 요구하는 원소와는 별개로, 각 객체는 모두 같은 동작을 하기 때문에 함수를 공유합니다.
원소비석에 연결된 기능함수입니다.
비석 객체는 부모로 ElementRocksObjecet 객체를 갖는 트랜스폼 계층 구조를 가지고 있기 때문에,
부모 객체를 GetComponent하여 RockOn 함수를 호출합니다.
그리고 객체가 보유하고 있는 이벤트 파티클 시스템을 활성 상태로 변화해줍니다.
이때, SetActive(false) 상태이기 때문에 true값을 매개변수로 넘겨주어야 합니다.(디폴트는 false)
오브젝트 매니저에서 호출된 RockOn 함수는 다음과 같이, 자신이 가지고 있는 모든 원소비석 객체를 순회하면서, 활성 상태가 맞는지 확인합니다.
만약, 하나라도 활성 상태가 아닌 것이 있다면.
isClear를 false로 바꾸어서 진행을 막습니다.
모든 객체가 활성상태라면.
서클 객체를 활성화 하고, 리워드 보상을 안내하기 위해서, 카메라 컨트롤러에게 옵저버 패턴을 통해서, 좌표들을 담은 List를 전송합니다.
옵저버 패턴은 카메라의 상태를 ToTarget으로 전환하고 코루틴 함수를 호출하여 Get한 좌표들을 보여줄 수 있도록 합니다.
위의 함수는 리스트의 좌표들을 순회하며 부드럽게 움직일 수 있도록 해줍니다.
현재 좌표에서 다음 좌표까지의 거리를 13으로 나누어서 중간 좌표를 만듭니다.
이 중간 좌표는 객체의 오버슈팅(OverShooting)을 막기 위해서, 이동 시작부와 종점부의 속도를 낮추는 역할을 합니다.
기본적으로 이동 속도는 2~10 사이의 값을 거리에 따라서 조절하는 방식이지만,
1구역과 13구역의 경우에는 0.5f로 고정시킵니다.
마지막으로 카메라 상태를 다시 ChasePlayer로 바꾸어. 플레이어를 비추도록 해줍니다.
기존의 상호작용 시스템은 세가지가 있었습니다.
첫 번째, 플레이어의 위치를 기반으로한 InteractionObject 레이어 객체의 탐색.
두 번째, 카메라를 기반으로 한, 일정 범위 내 객체 탐색.
세 번째, 플레이어의 공격을 이용한 상호작용.
하지만 점프대는 그 어떤 것에도 해당되지 않았습니다.
플레이어가 마법진 위에 올라선 후에, 점프 키를 입력하고 나서 발동되는 것이 점프대이기 때문입니다.
그렇기에 점프대의 구현을 위해서는, 새로운 상호작용 시스템을 구현해야 했습니다.
이후의 확장성을 고려하여, 단일 클래스를 받아서 함수를 호출하는 것은 지양했습니다.
IObjectTriggerCheckFunc 인터페이스를 새로 만들어, 상호작용의 기능을 담당하는 클래스가 해당 인터페이스를 구현해, 함수를 호출받을 수 있도록 했습니다.
인터페이스의 가상함수를 오버라이딩한, 객체를 부모객체로부터 받아와서, 플레이어의 충돌을 체크 후. 함수를 호출합니다.
IsActive는 중복 호출을 방지하기 위한 제어 플래그 입니다.
인터페이스의 함수가 호출됩니다.
그 객체가 마법진 1번이라면 점프 함수를 호출하고
2번이라면 ActiveConvertObject 객체들을 Active True/False 전환하여 문을 열 수 있도록 해줍니다.
1번 마법진에서 호출되는 점프함수입니다.
플레이어의 조작을 방지하기 위해서, IsControlLock함수를 호출하고 객체를 이동시킵니다.
시작점과 종착점을 반으로 나눈 중간 지점을 최고점으로 삼아서, 포물선을 그립니다.
CalculateParabola 함수를 통해서, 시작 지점과 중간 지점, 종착 지점을 매개변수로 받아서 경로를 계산합니다.
이렇게 구한 좌표값으로 플레이어 객체의 위치를 이동합니다.