🐧 들어가기 앞서

프로젝트가 하나 또 완성됐다.

https://github.com/NBC-Unity-A05-TeamProject/Random5bject

연휴가 길어서 걱정을 많이 했는데, 연휴에도 개발을 하다보니 생각보다 구현이 잘됐다.

다만 아쉬운점은 타워마다 특별한 특징이 없는 점인데,

시간이 부족하다 보니 제작이 힘들었다.

다음에는 메인 기능을 꼭 분리해서 진행해야겠다.

너무 큰 도전이었다!


🐧 오늘 배운 것

  • 피드백
  1. 싱글턴 제네릭하게 사용하는게 더 효율적이다.

  2. 게임이 길어질수록 -> 포지션을 계속 받아와야해서 부하가 될 수 있다.
    컬렉션을 재활용할 수 있는 방법을 고민해보자.


🐧 기억할 것 & 진행

제네릭 싱글톤

  • 싱글톤
using UnityEngine; 
using System.Collections; 
 
public class Singleton<T> : MonoBehaviour where T : MonoBehaviour 
{ 
    private static T _instance; 
 
    public static T Instance 
    { 
        get
        { 
            if (_instance == null) 
            { 
                _instance = FindObjectOfType(typeof(T)) as T; 
 
                if (_instance == null) 
                { 
                    Debug.LogError("There's no active " + typeof(T) + " in this scene"); 
                } 
            } 
 
            return _instance; 
        } 
    } 
}
  • 사용 클래스
using UnityEngine; 
using System.Collections; 
 
public class ManagerClass : Singleton<ManagerClass> 
{ 
 
}

이렇게 진행하면, 매니저 클래스마다 코드를 만들어줄 필요없이 싱글톤으로 구현 가능하다!


포지션 컬렉션화

  • 기존 코드

아래 코드는 현재 타워의 눈금을 지정하는 부분이다.

private Vector2[] CalculateDotPositions(int towerLevel)
    {
        Vector2[] positions = null;

        switch (towerLevel)
        {
            case 1:
                positions = new Vector2[] { Vector2.zero };
                break;
            case 2:
                positions = new Vector2[] { new Vector2(-0.3f, -0.3f), new Vector2(0.3f, 0.3f) };
                break;
            case 3:
                positions = new Vector2[] { new Vector2(-0.3f, -0.3f), Vector2.zero, new Vector2(0.3f, 0.3f) };
                break;
            case 4:
                positions = new Vector2[] { new Vector2(-0.3f, -0.3f), new Vector2(0.3f, -0.3f), new Vector2(-0.3f, 0.3f), new Vector2(0.3f, 0.3f) };
                break;
            case 5:
                positions = new Vector2[] { new Vector2(-0.3f, -0.3f), new Vector2(0.3f, -0.3f), Vector2.zero, new Vector2(-0.3f, 0.3f), new Vector2(0.3f, 0.3f) };
                break;
            case 6:
                positions = new Vector2[] { new Vector2(-0.3f, -0.3f), new Vector2(-0.3f, 0f), new Vector2(-0.3f, 0.3f), new Vector2(0.3f, -0.3f), new Vector2(0.3f, 0f), new Vector2(0.3f, 0.3f) };
                break;
            default:
                break;
        }

        return positions;
    }

이 부분을 컬렉션화해서 재사용이 가능하게 만든다면,

  • 컬렉션화
private Dictionary<int, Vector2[]> dotPositions = null;

private void Awake()
{
    dotPositions = CalculateDotPositions();
}

private Dictionary<int, Vector2[]> CalculateDotPositions()
{
    Dictionary<int, Vector2[]> positions = new Dictionary<int, Vector2[]>();

    positions[1] = new Vector2[] { Vector2.zero };
    positions[2] = new Vector2[] { new Vector2(-0.3f, -0.3f), new Vector2(0.3f, 0.3f) };
    positions[3] = new Vector2[] { new Vector2(-0.3f, -0.3f), Vector2.zero, new Vector2(0.3f, 0.3f) };
    positions[4] = new Vector2[] { new Vector2(-0.3f, -0.3f), new Vector2(0.3f, -0.3f), new Vector2(-0.3f, 0.3f), new Vector2(0.3f, 0.3f) };
    positions[5] = new Vector2[] { new Vector2(-0.3f, -0.3f), new Vector2(0.3f, -0.3f), Vector2.zero, new Vector2(-0.3f, 0.3f), new Vector2(0.3f, 0.3f) };
    positions[6] = new Vector2[] { new Vector2(-0.3f, -0.3f), new Vector2(-0.3f, 0f), new Vector2(-0.3f, 0.3f), new Vector2(0.3f, -0.3f), new Vector2(0.3f, 0f), new Vector2(0.3f, 0.3f) };

이 코드를 사용한다면,

int towerLevel = 3; 
Vector2[] positions = dotPositions[towerLevel];

foreach (Vector2 position in positions)
{
    Debug.Log("Position: " + position);
}

이렇게..?


🐧 내일 할 일

다시 3D 강의를 들어보자! 3D가 어려워도 재밌는 점이 많은 것 같다.

0개의 댓글