TIL

[멋쟁이사자처럼 부트캠프 TIL회고] 71일차 : 틱택토 빌드

Cadi 2025. 2. 11. 02:18

오늘 배운 것

1. 자투리 지식

2. 틱택토 게임 빌드

3. 버그 수정

 

1. 자투리 지식

 

Altlas

  • 여러개의 텍스쳐를 하나의 큰 텍스쳐로 합쳐서 관리하는 기술
  • 텍스쳐가 많아질수록, 드로우 콜 횟수가 증가하여 게임 성능에 부담을 줄 수 있음 > 해결
  • Create - 2D - Sprite Atlas로 만들 수 있음

UI 이미지들을 아틀라스로 묶음, Compression을 None으로 ! (압축을 해버리면 이상해질 수 있음)

https://docs.unity3d.com/kr/2022.3/Manual/class-SpriteAtlas.html

 

Sprite Atlas 프로퍼티 레퍼런스 - Unity 매뉴얼

Unity에서 스프라이트 아틀라스를 생성하려면 Assets > Create > 2D > Sprite Atlas로 이동합니다.Unity는 파일 확장자가 ’.spriteatlas’인 스프라이트 아틀라스를 Assets 폴더에 생성합니다.

docs.unity3d.com

 

 

2. 빌드 

 

 

빌드하고 테스트해 보기 위해서 일단 제일 간단한 방법을 사용

빌드 후 apk 파일을 USB로 옮기기 . 

 

이를 실행하기 위해서는 다음과 같은 핸드폰 설정이 필요함. 

핸드폰 - 설정 - 소프트웨어 정보 - 빌드 번호 - 7번 이상 연속해서 탭

이후 컴퓨터와 핸드폰을 연결, 뜨는 창에 항상 연결 허용.

 

APK 파일을 핸드폰으로 옮기고 실행. 

 

다음은 바로 실행되게 하는 방법이다. 

연결 후 다음과 같이 뜬다면 연결 후 Build And Run

 

만일 뜨지 않는다면 다음과 같은 과정을 거쳐야 함. 

 

1. Android Studio 설치 - 톱니바퀴 - SDK Manager - 주소 복사 후 - 탐색기 -  platform tools에 들어가서 주소 복사

2. 컴퓨터 설정 - 고급 시스템 정보 보기 - 환경 변수 - 시스템 변수 - path에 위의 주소 추가

3. cmd 창에서 abd devices로 연결 확인

4. 유니티 창에서 SDK 주소 확인.

 

위의 과정이 3시간 걸렸다 .ㅎㅎㅎㅎ 결국 유니티 재설치로 해결

 

3. 버그 수정 

 

 게임을 한 번 플레이하고 (싱글 or 듀얼 플레이) 다시 플레이하면 무조건 싱글 플레이 모드가 실행되는 버그가 있었다.

다른 분의 테스트 결과 GameManager 함수에 있는 구독 때문에 발생한 문제였다. 

private void Awake()
{
    if (_instance == null)
    {
        _instance = this as T;
        DontDestroyOnLoad(gameObject);
    }
    else
    {
     
        Destroy(gameObject);
    }
    
    // 씬 전환시 호출되는 액션 메서드 할당

    SceneManager.sceneLoaded += OnSceneLoaded;
}

 

GameManager의 베이스가 되는 Sigleton함수의 awake 부분이다. 

디스트로이를 하긴 하지만 동시에 자신의 OnSceneLoaded 함수를 scenenLoaded에 구독시켜 두었다. 

 


         SceneManager.sceneLoaded += OnSceneLoaded;


위 코드 때문에 발생합니다. Destroy를 시키긴 하지만 같은 프레임에서 이미 구독을 했기 때문에 구독한 OnSceneLoaded (파괴되어야 할 GameManager에서 실행되는)
함수는 씬이 로드될 때 똑같이 실행됩니다. 


그리고 우리는 첫 번째 (Don'Destroy로 설정한) 함수에 MainPanelController에서 

         GameManager.Instance.ChangeToGameScene(GameManager.GameType.DualPlayer);


 로 함수를 호출합니다. 
player는 Dual플레이어로 정상적으로 설정되나, 이후 파괴되어야 할 두 번째 게임 매니저 함수의 

OnSceneLoaded함수가 호출됩니다. 
이 때,   두 번째 게임 매니저의 Playertype은
 

 public enum GameType { SinglePlayer, DualPlayer }
    private GameType _gameType;



기본적으로 우리가 게임 매니저 함수에서 따로 설정해 주지 않았기에, enum형의 첫 번째 타입인 SinglePlayer가 됩니다.
 때문에 싱글 플레이든 듀얼 플레이든 플레이를 두 번째 할 때 부터는 무조건 싱글플레이 타입으로 게임이 실행됩니다.
(듀얼플레이를 두 번 해도 똑같은 문제 발생)  ,이와 같은 문제를 해결하기 위해서 저는 

  private void Awake()
    {
        if (_instance == null)
        {
            _instance = this as T;
            DontDestroyOnLoad(gameObject);
        }
        else
        {
            // 메인으로 돌아왔을 때 2번째... ( 즉시 소멸되지는 않음)
            //Destroy를 다시 ... 더 이상 참조하지 않겠다는 뜻
            Destroy(gameObject);
            return;
        }
        
        // 씬 전환시 호출되는 액션 메서드 할당
        // 죽어야 하는 2번째 함수가 살아 있음. (참조가 생기면서 소멸이 안됨)
        SceneManager.sceneLoaded += OnSceneLoaded;
    }


싱글톤에 리턴을 추가해 주었고 정상 작동합니다. 


그리고 위의 토막이 내가 정리한 부분이다. 정상 작동한다 !

 

 

Build and run 을 했는데 안드로이드 버전이 맞지 않다고 실행이 안된다...ㅎ슬퍼