카테고리 없음

25.05.13 TIL

gaon99 2025. 5. 13. 23:27

1. 오늘 학습 키워드

 

엔딩 해금, 상단 바 토글 수정, 미니게임 결과


2. 오늘 학습 한 내용을 나만의 언어로 정리하기

 

엔딩 해금은 엔딩을 볼 시에 isLocked 를 false로 변경시켜서 크레딧 패널에서 해당 엔딩을 다시 볼 수 있도록 했고,

 

상단 바 토글은 뒤로가기가 따로 노는 듯한 느낌이라고 하셨는데 뒤로가기 버튼이 buttons의 부모 아래에 없어서 생긴 일이였다.

 

그리고 미니게임 결과같은 경우는 bool 값을 받아서 클리어 여부를 판단하고,

StartScene 즉 크레딧 패널에서 온 것이 아니라면, 체력 관련 로직을 행하고, 다음 씬 이동이 되도록 짰다.

    public void MiniGameManage(bool isSuccess)
    {
        // payload에서 bool 값을 확인
        bool returnToStart = false;
        
        // 현재 씬의 payload 가져오기
        var currentScene = Current;
        if (currentScene != null)
        {
            Debug.Log($"현재 씬: {SceneName}, Current: {currentScene.GetType().Name}");
            
            // GetPayload 메서드로 스크립트에서 직접 참조 없이 payload 접근
            var payload = currentScene.GetPayload<object>();
            Debug.Log("페이로드: " + (payload != null ? payload.ToString() : "null"));
            
            // payload가 배열 형태로 전달되었을 경우
            if (payload is object[] payloadArray)
            {
                Debug.Log("Payload 배열 길이: " + payloadArray.Length);
                for (int i = 0; i < payloadArray.Length; i++)
                {
                    Debug.Log($"Payload[{i}] = {payloadArray[i]}");
                }
                
                if (payloadArray.Length > 1 && payloadArray[1] is bool returnFlag)
                {
                    returnToStart = returnFlag;
                    Debug.Log("returnToStart 값: " + returnToStart);
                }
            }
        }

        // 시작 씬에서 왔는지 확인 (크레딧 용도)
        if (fromStartScene)
        {
            // 시작 씬에서 왔을 경우 체력 관련 로직 없이 씬 이동만 처리
            GoToNextScene(returnToStart);
        }
        else
        {
            // 일반 게임 플레이 상황
            if (isSuccess)
            {
                // 성공 시 정신력 회복
                Manager.Instance.DataManager.Heal(30);
            }
            else
            {
                // 실패 시 정신력 감소
                Manager.Instance.DataManager.Damage(20);
            }
            
            // 다음 씬으로 이동
            GoToNextScene(returnToStart);
        }
    }

 

어드레서블로 전달해줘야하는 부분이 다르기에 하드코딩이 되었지만, 1회차 치곤,, 나쁘지 않다고 생각한다.

private void GoToNextScene(bool returnToStart)
    {
        if (returnToStart)
        {
            // StartScene으로 돌아가는 경우
            var labelMapping = new AssetLabelMapping[]
            {
                new AssetLabelMapping
                {
                    label = "Ending",
                    assetType = AssetType.EndingSO
                },
                new AssetLabelMapping
                {
                    label = "MiniGame",
                    assetType = AssetType.MiniGameDataSO
                },
                new AssetLabelMapping
                {
                    label = "BGM",
                    assetType = AssetType.AudioClip
                },
                new AssetLabelMapping
                {
                    label = "SFX",
                    assetType = AssetType.AudioClip
                }
            };
            
            var loadData = CreateLoadingSceneData(labelMapping, "StartScene", null);
            LoadScene("LoadingScene", loadData);
        }
        else
        {
            // 기존처럼 MapScene으로 이동하는 경우
            var labelMapping = new AssetLabelMapping[]
            {
                new AssetLabelMapping
                {
                    label = "NodeType",
                    assetType = AssetType._NodeTypeDataSO
                },
                new AssetLabelMapping
                {
                    label = "Character",
                    assetType = AssetType.CharacterSO
                },
                new AssetLabelMapping
                {
                    label = "BGM",
                    assetType = AssetType.AudioClip
                },
                new AssetLabelMapping
                {
                    label = "SFX",
                    assetType = AssetType.AudioClip
                }
            };

            var loadData = CreateLoadingSceneData(labelMapping, "MapScene", new object[] { });
            LoadScene("LoadingScene", loadData);
        }
    }

3. 학습하며 겪었던 문제점 & 에러

 

딱히? 없었던 것 같다 굳이 따지면 정신력 표시 텍스트가 크레딧에서 시작할 때 텍스트를 Inactive로 바꾸려고 했는데,

현재 한 0.2~0.3초 뒤에 사라진다. 이 부분은 추후 페이드 효과를 넣거나 아님 아직은 딱히 방법이 안떠오른다


4. 내일 학습 할 것은 무엇인지

 

애니메이션을 다 깔아두고 이미지를 다 원래의 크기로 바꾼 뒤에 다 실행해보며 확인했기에 이 부분 코드에 하드코딩으로 넣을 예정이다.