1. 뒤끝 로그인 씬 코드 공부LoginSceneManager

2023. 11. 16. 15:12언어/유니티

728x90

 

 

- 개요 

뒤끝서버에서 제공하는 파일을 차트에 다 적용시키고

하면 이 화면 나옴 약관 하고 아이디 만들면 그뒤로 부터는 데이터가 남아서 

자동 로그인됨 

 


LoginSceneManager 코드

touchStartButton 은 화면 전체에 안보이게 적용해놈 

LoginButtonGroup 은 로그인 버튼 3개 그룹을 뜻함

 

 

코드내용중


- 키워드 : 싱글톤 , 인스턴스

    public static LoginSceneManager Instance {
        get {
            return _instance;
        }
    }

싱글톤 패턴이다. 이 싱글톤 패턴을 이용하면 어디서든 인스턴스를 이용할 수있게된다.

이메서드의 속성을 어디서든 쓸 수 있게 만들어 준다. 

 


- 키워드 : 로그인 패널 반환 

    public Canvas GetLoginUICanvas() {
        return _loginUICanvas;
    }

로그인 UI의 캔버스를 반환해준다 예를들어 닉네임이 없거나 커스텀 로그인을 했을때

GetLoginUICanvas(); 코드를 넣어준다고 보면된다. 그러면 다시 로그인 해야되니까 

오류가 나지 않는다.


- 키워드 : 경로 프리팹 찾기 , 싱글톤

    void Awake() {
        if (_instance == null) {
            _instance = this;
        }

        // StaticManager가 없을 경우 새로 생성
        if (FindObjectOfType(typeof(StaticManager)) == null) {
            var obj = Resources.Load<GameObject>("Prefabs/StaticManager");
            Instantiate(obj);
        }
    }

앞서 말했던것처럼 싱글톤 패턴으로 위에 패턴을 썻다면 전역 접근을 가능하게 해주기 위해 적어야됨

- FindObjectOfType(typeof(staticManager)) ==null 게인씬에서 staticManager 이라는 오브젝트가 없다면

- 경로에 있는 게임 오브젝트 프리팹(prefab)을 로드(load)하라는 명령

- Instantiate() 복사해서 불러오기

만약 게임 씬에 StaticManager 오브젝트가 없다면,
Prefabs/StaticManager 프리팹을 메모리에 불러와서 게임 씬에 새로 생성하라"


- 키워드 : start

    void Start() {
        _loginButtonGroup.SetActive(false); // 로그인 버튼 비활성화
        SetTouchStartButton(); // 버튼 비활성화
    }

로그인 버튼 비활성화는 처음에 버튼없다가 터치하면 생기는거 할려고한거 

 

 

시작 버튼도 비활성화 되어있다.

( 이말은 클릭시 다음으로 넘어가는 버튼을 말하는거)

버튼 비활성화 이거는 로그인 되어있을때 자동로그인


- 키워드 : 자동 로그인 호출 및 속성

    // 터치하여 시작 버튼 활성화
    // 터치 시, 해당 UI는 사라지며 자동 로그인 함수를 호출한다.
    private void SetTouchStartButton() {
        _touchStartButton.GetComponent<Button>().onClick.AddListener(() => {
            Destroy(_touchStartButton);
            _touchStartButton = null;
            LoginWithBackendToken();
        });
    }

// 시작 버튼 클릭시 사리진다. 그리고 로그인 함수 불러옴

결국 자동 로그인을 만든거 


- 키워드 : 자동 로그인 기능 및 오류탐지

    private void LoginWithBackendToken() {
        SendQueue.Enqueue(Backend.BMember.LoginWithTheBackendToken, callback => {
            Debug.Log($"Backend.BMember.LoginWithTheBackendToken : {callback}");

            if (callback.IsSuccess()) {
                // 닉네임이 없을 경우
                if (string.IsNullOrEmpty(Backend.UserNickName)) {
                    StaticManager.UI.OpenUI<LoginUI_Nickname>("Prefabs/LoginScene/UI", GetLoginUICanvas().transform);
                }
                else {
                    GoNextScene();
                }
            }
            else {
                SetButton();
            }
        });
    }

 

GetLoginUICanvas().transform: 이 부분은 닉네임 설정 UI가 위치해야 하는 부모 오브젝트의 Transform을 가져옵니다. 
UI 요소는 부모 오브젝트의 Transform 위치에 따라 위치하게 되므로, 이를 통해 UI가 표시되어야 할 위치를 정할 수 있습니다. 
따라서, 이 코드는 사용자의 닉네임이 설정되어 있지 않다면, Prefabs/LoginScene/UI 경로의 닉네임 설정 UI를 GetLoginUICanvas().transform의 위치에 열라는 의미를 가집니다.


- 키워드 : 로그인 버튼 , 게스트 로그인 , 구글 로그인

 

    // 로그인 버튼 씬에서 연결하기
    private void SetButton() {
        if (_loginButtonGroup.activeSelf) 
        {  
            return;  
        }
        _loginButtonGroup.SetActive(true);

        Button[] buttons = _loginButtonGroup.GetComponentsInChildren<Button>();
       

        for (int i = 0; i < buttons.Length; i++) {
            buttons[i].onClick.RemoveAllListeners(); 
        }
        
        buttons[0].onClick.AddListener(FederationLogin);
        buttons[1].onClick.AddListener(CustomLogin);
        buttons[2].onClick.AddListener(GuestLogin);
        
        // 페데레이션 로그인 기능 미구현
        buttons[0].gameObject.SetActive(false);

    }

-그룹 버튼이 활성화 되어있다면 그대로 리턴해줌 ( 확인하는거 )

-그룹 버튼 활성화 해주고

-  GetComponentsInChildren<T>() 메서드는 호출한 게임 오브젝트와 그 자식 오브젝트들 중에서 지정한 타입 T의 컴포넌트를 모두 찾아 배열로 반환하는 함수입니다.

결국 그룹버튼 전체 버튼

들을 찾아서 배열로변환

-변환된거 for문으로 돌림

- for문안에

이 코드에서는 모든 리스너를 제거한 후, 새로운 리스너를 추가함으로써 버튼의 기능을 재설정하는 것으로 보입니다.

이해가 잘안되지만 그렇다고 한다.


- 키워드: 씬 이동

 

 

    public void GoNextScene() {
        StaticManager.Instance.ChangeScene("LoadingScene");

    }

 

이건 staticManager에 있는 씬 체인지 코드를 불러오는것이다.

 


- 키워드:  정책 , 커스텀 로그인 , 구글로그인 

 

    private void GetPolicy() {
        StaticManager.UI.OpenUI<LoginUI_Policy>("Prefabs/LoginScene/UI", GetLoginUICanvas().transform);
    }

말그대로 저 ui 불러오고

이용약관 UI를 포함하는 부모 오브젝트의 위치 정보를 가져오는 메서드입니다.

 

이하 동일 

    private void CustomLogin() {
        StaticManager.UI.OpenUI<LoginUI_CustomLogin>("Prefabs/LoginScene/UI", GetLoginUICanvas().transform);
    }
  private void FederationLogin() {
        
    }

- 키워드:  로그인 함수 처리 

    // 로그인 함수 후 처리 함수
    private void AuthorizeProcess(BackendReturnObject callback) {
        Debug.Log($"Backend.BMember.AuthorizeProcess : {callback}");

        // 에러가 발생할 경우 리턴
        // 로그인 버튼 활성화
        if (callback.IsSuccess() == false) {
            SetButton();
            return;
        }
        
        // 새로 가입인 경우에는 statusCode가 201, 기존 로그인일 경우에는 200이 리턴된다.
        if (callback.GetStatusCode() == "201") {
            GetPolicy();
        }
        else {
            GoNextScene();
        }
    }

로그인 에러 발생시 로그인 버튼을 활성화 시킨다.

처음 가입할경우 정책 ui를 뜨게만들고

아닌경우 씬이동

 

결과 적으로 로그인 처음할때만 정책 ui뜨게 만드는것 또한 오류가 날떄 버튼 다시 활성화해서 로그인 유도

 

 

//2023년11월16일 15시12분

728x90