Unity_개발일지_47

홍신영·2024년 12월 26일
0

Unity

목록 보기
49/62

스테이지 락 언락 하기

public class ClearData
{
    public bool[,] stageCleared = new bool[12,6]; //12개의 별자리, 6개의 스테이지
}

각 별자리와 스테이지 불 배열을 만들어준다.

public class GameManager : Singleton<GameManager>
{
    public ClearData clearData { get; set; }

    private void Start()
    {
        clearData = new ClearData();
        Debug.Log("클리어 데이터 생성	");
    }

싱글톤을 상속받는 게임매니저에 클리어 정보를 생성해준다.

private void Awake()
    {
        clearData = GameManager.Instance.clearData;
        //Debug.Log("스테이지 클리어 정: " + clearData.stageCleared[0, 1]);
        Debug.Log("스테이지 클리어 정: " + clearData.stageCleared[0, 2]);
        int buttonIndex = 0;
        clearData.stageCleared[0, 0] = true; // 첫 번째 별자리의 첫 스테이지는 언락

        for (int i = 0; i < clearData.stageCleared.GetLength(0); i++) // 별자리 갯수 만큼 12번 돌리기
        {
            for(int j = 0; j < clearData.stageCleared.GetLength(1); j++) // 스테이지 갯수 만큼 6번 돌리기 
            {
                Debug.Log("i:" + i);
                Debug.Log("j:" + j);
                if(buttonIndex >= buttons.Length) // 버튼 수 초과하면 반복 종
                {
                    break;
                }   
                if (clearData.stageCleared[i,j] == false)
                {
                    buttons[buttonIndex].image.color = new Color(1, 1, 1, 0.3f);
                    buttons[buttonIndex].interactable = false;
                }
                else
                {
                    buttons[buttonIndex].image.color = new Color(1, 1, 1, 1);
                    buttons[buttonIndex].interactable = true;
                }
                buttonIndex++;
            }
        }
    }

스테이지 ui가 나오면 각 스테이지 버튼에 만들어준 스테이지 정보를 넣어주는 작업을 한다.
2중 for문으로 각 별자리와 스테이지를 false로 해 잠궈준다.
첫 별자리의 스테이지는 열어주었다.

 public void StageClear()
    {
        Cursor.lockState = CursorLockMode.None;
        UIManager.Instance.Show<UIPopupStageClear>();

        ClearData clearData = GameManager.Instance.clearData;
        clearData.stageCleared[starIdx, stageIdx] = true;
        
        if(clearData.stageCleared.GetLength(1) > stageIdx) // 현재 스테이지가 6스테이지 보다 작으면
        {
            clearData.stageCleared[starIdx, stageIdx + 1] = true; // 다음 스테이지 언락
            GameManager.Instance.clearData.stageCleared[starIdx, stageIdx + 1] = true;
        }
        else if(clearData.stageCleared.GetLength(1) == stageIdx) // 현재 스테이지가 6이면, 
        {
            clearData.stageCleared[starIdx + 1, 0] = true; //다음 별 1스테이지 언락
            GameManager.Instance.clearData.stageCleared[starIdx + 1, 0] = true;
        }
        Debug.Log(starIdx + stageIdx);
        Debug.Log(GameManager.Instance.clearData.stageCleared[starIdx, stageIdx + 1]);
        //GameManager.Instance.OnstageCleared?.Invoke(starIdx, stageIdx + 1);
        //Debug.Log(clearData.stageCleared[starIdx, starIdx+1]);
    }

던전 매니저에서 스테이지 클리어를 했을 때, 다음 스테이지를 열어주도록 하였다.

박싱 언박싱

박싱(Boxing)이란?
값 형식 (int, double, struct 등)을 참조 형식 (object)으로 변환하는 것을 의미합니다.

  • 왜 박싱을 할까요?
    • 모든 객체의 최상위 부모 클래스인 object 타입의 컬렉션에 값 형식을 저장하기 위해
    • 인터페이스의 메서드에 값 형식을 전달하기 위해
    • 다형성을 활용하기 위해
  • 어떻게 작동할까요?
    값 형식이 힙(Heap) 메모리에 새로운 객체로 복사되고, 이 객체에 대한 참조가 반환됩니다.
    즉, 스택에 있던 값 형식의 데이터가 힙으로 이동하면서 객체로 변환되어 참조를 반환하는 것입니다.
    언박싱(Unboxing)이란?
    박싱된 객체 (object)를 다시 원래의 값 형식으로 변환하는 것을 의미합니다.
  • 왜 언박싱을 할까요?
    • 박싱된 값을 다시 값 형식으로 사용하기 위해
  • 어떻게 작동할까요?
    • 박싱된 객체에서 값을 추출하여 원래의 값 형식으로 변환합니다.

박싱과 언박싱의 장단점

  • 장점:
    • 값 형식을 다양한 상황에서 활용할 수 있도록 유연성을 제공합니다.
    • 모든 객체의 최상위 부모 클래스인 object를 통해 다형성을 구현할 수 있습니다.
    • = 위 두개 같은 내용
  • 단점:
    • 박싱과 언박싱 과정에서 성능 오버헤드가 발생할 수 있습니다.
    • 힙 메모리 사용량이 증가할 수 있습니다.
    • 형 변환 시 예외가 발생할 수 있습니다.

박싱에서의 성능저하 (메모리 오버헤드) 언박싱에서의 성능저하(GC)

가비지 컬렉터란?

가비지 컬렉터는 프로그램 실행 중 자동으로 사용되지 않는 동적 메모리를 해제하는 시스템을 말합니다.

C# 어플리케이션의 메모리는 주어진 공간을 순차적으로 채우는 특징 때문에 할당을 반복하면 힙의 마지막 주소에 도달하게 된다. 이때 GC가 필요없는 메모리를 수집하여 해당 공간의 할당을 해제하는데, 이것이 Garbage Collection이다.

마킹(Marking):

  • 루트 집합(Root Set)에서 시작하여 접근 가능한 모든 객체를 탐색하고 표시합니다. 루트 집합은 스택, 정적 영역, 애플리케이션 코드에서 직접 참조되는 객체들로 구성됩니다.
  • 더 이상 참조되지 않는 객체는 표시되지 않습니다.
    스위핑(Sweeping):
  • 마킹되지 않은 객체, 즉 더 이상 사용되지 않는 객체를 가비지로 판단하고 메모리에서 해제합니다.

작동원리는 굳이

단점에 대해, 해결 방안에 대해 이야기 해야됌.
성능저하, 생성 파괴 될 때 니까 오브젝트 풀링으로 방지가능

profile
게임 클라이언트 개발자

0개의 댓글