ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • (13) Json으로 알맞는 스테이지창 불러오기
    Galaxy Ball/2. 싱글플레이 - 스토리모드 2024. 5. 29. 02:04

    이제 스테이지 선택씬에서 선택한 스테이지 번호에 알맞는 스테이지 정보를 출력하고

    해당 스테이지를 불러오려 한다

     

    플레이어 공과 스테이지 구체가 닿으면 출력되는 UI인 StageBox

    이제 충돌이 일어날때 해당 스테이지에 맞춰 저 위의 번호가 바뀌도록 해볼것이다

     

    우선 스테이지는 각자의 이름을 뒤에 붙는 번호로 구분해두었다. 그리고 이걸 이용할 예정이다

    스테이지 하나마다 태그를 달아줄순 없으니...스테이지의 이름으로 구별하여 StageBox를 출력해보자

     

     

    우선 플레이어의 공을 담당하는 StageBallController에 chooseStage라는 int 타입 변수를 선언해주자

    굳이 또 이 코드에 변수를 추가하는 이유는

    스테이지 구체 하나하나마다 스크립트를 달아주는건 너무나도 비효율적이기 때문

     

    그리고 충돌한 오브젝트의 태그가 Stage라면 해당 오브젝트 이름 "Stage + n"의 숫자 n값을 추출한다

    하지만 Substring은 문자열안에 있는 문자열을 출력하는 개념이기에 

    예를들어 "Stage3"에서 3은 int 3이 아닌 String 3이 되어버린다

     

    그렇기에 TryParse를 이용하여 int타입으로 바꿔준뒤 chooseStage에 추출한 값을 정수형으로 넣어주면 된다

     

     

    로그가 잘 찍히는것을 확인할수 있다. 여기까지 성공했다면 절반은 성공한것이나 다름없다

    그럼 이제 임시 Json파일을 만들어보자

     

    엑셀로 만들어 Json형식으로 만들어준뒤 

     

    StageExplain이라는 이름으로 저장해 Resources 폴더 안에 넣어주자

     

    이제 해야할건, 방금 받은 chooseStage 변수값을 해당 Json파일의 id값에 대입시켜 알맞는 문자열을 출력시켜주는것이다

     

    using Newtonsoft.Json;
    using System.Collections;
    using System.Collections.Generic;
    using TMPro;
    using UnityEngine;
    
    public class ShowStageBox : MonoBehaviour
    {
        public TextAsset stageDataFile;
        public TextMeshProUGUI stageTitleText;
        public TextMeshProUGUI stageExplainText;
    
        public class Stage
        {
            public int id;
            public string StageTitle;
            public string StageDetail;
        }
    
        private List<Stage> stages;
    
        void Start()
        {
            stages = JsonConvert.DeserializeObject<List<Stage>>(stageDataFile.text);
        }
    
        public void UpdateStageInfo(int chooseStage)
        {
            Stage selectedStage = stages.Find(stage => stage.id == chooseStage);
            if (selectedStage != null)
            {
                stageTitleText.text = selectedStage.StageTitle;
                stageExplainText.text = selectedStage.StageDetail;
                Debug.Log($"Stage {chooseStage} 정보가 업데이트되었습니다: {selectedStage.StageTitle} - {selectedStage.StageDetail}");
            }
            else
            {
                Debug.LogWarning($"Stage {chooseStage} 정보를 찾을 수 없습니다.");
            }
        }
    }

     

    이를 위해 StageBox에 부착될 새로운 스크립트를 작성해주었다

    예전에 했었던것과의 차이점이라면 Json파일 이름을 Inspector창에 직접 입력하여 읽는것이 아닌

    그냥 해당 파일을 public으로 선언하여 집어넣어주기만 하면 된다는것이다

    생각해보면 이게 제일 간단하고 확실한데 그땐 왜 굳이 이름 헷갈리게 직접 써넣는식으로 했는지 모르겠다;;

     

     

    해당 스테이지의 번호와 설명을 출력하는 Stage. 구성은 StageTitle, StageExplain, Button 이렇게 3가지로 구성되어있고

     

    위 코드에서 해당 오브젝트들을 직접 찾아 넣어주도록 설계하였다

     

    이제 해당 스테이지에 맞게 정보를 출력하는것을 볼수 있다

     

    이제 여기서 플레이 버튼을 누르면 인게임 씬으로 이동하게 되는데, 3번 스테이지에서 버튼을 누르면 3번 스테이지로, 

    4번 스테이지에서 버튼을 누르면 4번 스테이지를 로딩해야한다

     

    사실상 이거 구현하려고 지금까지 준비해온것이다

     

    using UnityEngine;
    using UnityEngine.SceneManagement;
    using UnityEngine.UI;
    
    public class StageGoBtn : MonoBehaviour
    {
        public Button GoBtn;
    
        private void Start()
        {
            this.GoBtn.onClick.AddListener(() =>
            {
                // 씬을 로드하기 전에 chooseStage 값을 저장
                GlobalData.SelectedStage = StageBallController.chooseStage;
                SceneManager.LoadScene("Story-InGame");
            });
        }
    }
    
    public static class GlobalData
    {
        public static int SelectedStage;
    }

     

    플레이버튼에 부착된 StageGoBtn. 이 스크립트에 약간의 수정을 주어 씬을 로드하기전에(이게 중요)

    아까 StageBallControl에 있었던 chooseStage값을 저장한다

     

    결국 스테이지1 = chooseStage(1) = Json파일 id(1) 

     

    이기에 chooseStage에 들어가는 변수의 값이 가장 중요하다고 볼 수 있다

     

     

    자 플레이버튼을 눌러보자. 물론 아무런 차이도 없다. chooseStage로 무슨 값을 받던

    씬변환은 Story-Ingame으로 동일하기 때문. 하지만 상관없다.

    가장 중요한 chooseStage의 변수값을 가져왔다는것이 제일 중요하다

     

    결국 스테이지는 똑같지만 적의 배치, 고정구체 배치로 스테이지가 달라지기 때문에

    chooseStage변수 값으로 적 배치용 Json 파일을 만들어 똑같이 id를 잡아주기만 하면 된다

     

    그러니 chooseStage 변수값을 Story-Ingame씬에 제대로 가져왔는지 로그를 찍어 확인해보자

     

    public class Insenemy : MonoBehaviour
    {
        void Start()
        {
            int stage = GlobalData.SelectedStage;
        }
        private void Update()
        {
            int stage = GlobalData.SelectedStage;
            Debug.Log(stage + "이지롱");
        }
    }

     

    임시로 스크립트를 하나 만들어 확인용 로그만 간단하게 찍어보았다. 이제 최종 결과를 확인해보자

     

     

     

    스테이지 선택씬에서 스테이지3을 담당하는 구체와 충돌이 일어나자 콘솔창에

    스테이지 3에 관한 설명이다. 라고 출력되는것을 확인할 수 있고, UI 박스도 알맞게 보이는것을 확인할수 있다

     

    그리고 거기서 플레이버튼을 누르자 인게임씬으로 이동한뒤 "3이지롱" 이라고 출력되는것을 확인할 수 있다

     

    다음글에서는 이제 전달받은 chooseStage값에 맞춰 스테이지 안에 적을 생성하는 Json 파일과 

    그에 맞는 코드를 짜보도록 하겠다

Designed by Tistory.