2021. 7. 8. 07:32ㆍUnity/VR
현재 제작 중인 게임은 스킬의 종류와 획득 방법의 자유도가 매우 높은 레벨로 기획 되고 있다.
그렇기에 수많은 스킬과 그에 따른 획득 경로를 따로 분리해 관리 하지 않으면 상당히 더러운 코드가 될 가능성이 높다.
스킬 관리에 필요한 클래스는 총 2개
- SkillConditionCheck - 스킬들의 게임 출현 조건을 검사 해주는 클래스
- SkillManager - 게임 출현 조건을 만족해 획득 가능, 사용 가능한 스킬들을 관리 해주는 클래스
- MagicPrepare - SkillManager에서 할당해줄 스킬들을 보관할 장소
먼저 SkillConditionCheck Class이다.
이 클래스는 수많은 조건 검사가 불가피한 클래스이다. 그렇기에 자칫 했다간 큰 성능저하로 이를 수 있다.
그렇기에 본인은 이 문제를 해결하기 위해 Coroutine을 응용 하기로 했다.
스킬이라는 것은 특성상 하나가 열려야 다른하나가 열리는 경우가 있다. 또한 어느 조건이 만족후 또 그 후에 다른 조건이 나와 그 것을 클리어 해야 열리는 경우도 있다. 또한 특정 레벨 이상, 시나리오 진행이 이루어 져야 획득 할 수 있는 스킬또한 존재한다.
그렇기에 무작정 Update함수에서 모든 조건을 돌리는게 아니라 조건검사를 하나하나 Coroutine으로 만들어 무한 반복을 만는뒤 필요할 때 StartCoroutine을 실시해 모든 조건을 실시하지않게 하는 것이다.
IEnumerator DebugMagic1() // debugMagic1Condition 검사
{
while(true)
{
yield return new WaitForSeconds(0.3f);
if(debugMagic1Condition >= 0) //조건 검사
{
Debug.Log("DebugMagic1 획득");
skillManager.kakutokuAble.Add(Resources.Load<GameObject>("DebugMagic1"), 1);
break;
}
}
}
IEnumerator DebugMagic2() // debugMagic2Condition 검사
{
while (true)
{
yield return new WaitForSeconds(0.3f);
if (debugMagic2Condition >= 0) //조건 검사
{
Debug.Log("DebugMagic2 획득");
skillManager.kakutokuAble.Add(Resources.Load<GameObject>("DebugMagic2"), 2);
break;
}
}
}
IEnumerator DebugMagic3() // debugMagic3Condition 검사
{
while (true)
{
yield return new WaitForSeconds(0.3f);
if (debugMagic3Condition >= 0) //조건 검사
{
Debug.Log("DebugMagic3 획득");
skillManager.kakutokuAble.Add(Resources.Load<GameObject>("DebugMagic3"), 3);
break;
}
}
}
StartCoroutine은 여러 곳에서 조건에 따라 실시 될 수 있으며 특히 레벨업이나 시나리오 진행에서는 간간히 쓰일 예정이다.
따로 특수 상황 없이 바로 조건 검사에 들어가야된다면 이렇게 사용할 수도 있다.
void Start()
{ StartCoroutine("DebugMagic1"); }
ps.Coroutine내부에서는 public한정자가 불가능하다. 그래서 public의 변수를 사용 하고 싶다면 get/set을 이용하거나 Coroutine 바깥에 만들어야 한다.
다음은 SkillManager Class이다.
이 클래스는 SkillConditionCheck에서 넘어온 획득 가능 스킬과 사용가능 스킬의 관리가 주 목적인 클래스이다.
획득 가능한 스킬은 모두 특정 포인트를 사용해 획득을 해야 하기 때문에 딕셔너리 형태로 Key,Value값으로 두개의 값을 받는다.<GameObject,int>
사용가능 스킬은 GameObject를 담을 수 있는 배열이면 충분하다.
public class SkillManager : MonoBehaviour
{
public MagicPrepare magicPrepare; // useAble통해 할당
public Dictionary<GameObject, int> kakutokuAble = new Dictionary<GameObject, int> (); //획득가능 변수
public GameObject[] useAble; //사용가능 변수
}
이렇게 만들어진 딕셔너리는 다음과 같이 사용 할 수있다.
foreach(KeyValuePair<GameObject, int> item in kakutokuAble)
{
Debug.Log(item.Value);
Debug.Log(item.Key);
}
foreach가 순회하며 모든 원소를 돌기 때문에 나중에 Ui를통해 적용 할 때도 유용하게 쓰일 수 있다.
마지막으로 MagicPrepare Class이다.
이 클래스는 이미 제작된 클래스로 스킬의 발동을 담당하는 클래스 인데 어떤 스킬을 발동 시킬지의 관한 변수를 SkillManager에서 받아오게 된다. 이 받아오는 로직은 후에 쓰게될 Ui를 통한 스킬 적용에서 후술 할 예정이다.
public class MagicPrepare : MonoBehaviour
{
public GameObject magic1;
public GameObject magic2;
public GameObject magic3;
}
이렇게 만들어진 로직은 실행 했을 때 SkillManager변수에 값들이 저장이 되는 것과 동시에 Log로 key,value값을 잘 찍어내는걸 확인 할 수 있었다.
'Unity > VR' 카테고리의 다른 글
XR Rig Body생성, 스킬 거리 최댓값 주기 (0) | 2021.09.05 |
---|---|
XR Ray Interactor, Teleportation Area를 통한 이동 시스템 (0) | 2021.09.01 |
Unity IceBomb Skill제작 (0) | 2021.07.16 |
Unity 스킬 획득,관리 시스템(3) (0) | 2021.07.11 |
Unity 스킬 획득,관리 시스템(2) (0) | 2021.07.09 |