Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Archives
Today
Total
관리 메뉴

시작은 0부터

10. localPosition(상대위치), 싱글톤, 오브젝트 풀링 본문

Unity 학습일지

10. localPosition(상대위치), 싱글톤, 오브젝트 풀링

0base 2022. 8. 17. 23:39

2D 플랫포머 게임 중 생성된 플랫폼 위에서 좌우로 움직이는 장애물을 만들 때, 장애물이 플랫폼 안에서 좌우로 움직이지 않고, 이상한 곳에서 왔다갔다하는 문제가 생겼는데 범위 제한 값을 position으로 줘서 발생한 문제였다.

transform 내부 기능 중에 있는 position 과 localposition은 각각 절대위치와 상대위치다. 이전 시간에 배웠던 부분인데 까먹었다 동기형이 알려줘서 다시 정리한다. 절대위치(position)은 씬 내부에 있는 실제 위치값을 나타내고, 상대위치(localposition)은 자신의 위치를 기준으로 위치값을 나타낸다. 부모 오브젝트 안에서만 좌우로 움직이는 자식오브젝트의 경우 상대위치값을 받아야 부모 오브젝트가 실제위치 어디에 있든 정해진 공간에서 움직일 수 있다.

 

 싱글톤(Singleton)

: 단 하나의 인스턴스만 생성하여 사용하는 디자인 패턴. 광범위하게 활용될 수 있어야하기 때문에 접근이 쉬워야한다. 주로 게임 매니저 등에 사용되는 디자인 패턴. 

public static GameManager instance;

void Awake() {
        // 싱글톤 변수 instance가 비어있는가?
        if (instance == null)
        {
            // instance가 비어있다면(null) 그곳에 자기 자신을 할당
            instance = this;
        }
    }

GameManager를 디자인패턴으로 사용할 경우, 인스턴스를 스테틱으로 생성하고 인스턴스값이 없을 경우 최초에 한해 자기자신을 인스턴스값에 넣어준다. 

 

풀링의 원리를 이용하여 오브젝트 생성을 시도했다.

풀링 구현 방법은 다음과 같다.

	[SerializeField] GameObject A; //외부에서 풀로 만들 오브젝트 연결
	GameObject[] Aa = new GameObject[10]; //10개 오브젝트 배열 생성
        int count = 0; // 인덱스 확인 값;

	for(int i = 0; i < Aa.Length; i++) //시야 밖에 풀링을 해둘 위치에 오브젝트들 미리 생성
        {
            Aa[i] = Instantiate(A, poolPosition, Quaternion.identity);
        }
        
        Aa[count].SetActive(false); //생성해뒀던 풀링 위치에 있는 오브젝트 비활성화
        Aa[count].SetActive(true); //비활성화한 오브젝트를 활성화
        Aa[count].transform.position = new Vector2(x, y); //활성화한 오브젝트 위치 설정
        count++; //오브젝트 인덱스 증가(활성화한 오브젝트 다음 인덱스 오브젝트를 활성화하여 번갈아가면서 사용)
        
        if (count >= Aa.Length) //인덱스 값이 풀링 배열을 넘어서면 0으로 돌려서 다시 처음부터 사용
        {
             count = 0;
        }

이 방법으로 2D 플랫포머 러닝게임을 만들었다. 플레이어 점프 이동, 플랫폼이 랜덤한 높이로 주기적으로 생성되며 플랫폼 위에는 좌우로 움직이는 장애물이 있고, 먹으면 점수가 증가하는 코인과 먹으면 무적이 되는 아이템, 먹으면 코인을 끌어오는 아이템을 만들었다.  그리고 무적아이템 지속시간이 끝나면 바로 끝나지 않고 플레이어가 깜빡이면서 텀을 주는 기능을 구현했다. 깜빡이는 기능은 스프라이트 랜더에 있는 컬러 알파값을 0(투명)과 1(불투명) 사이에서 조절하여 구현했다.