ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • (24) 메인맵 제작#2 + 스테이지 제작 준비
    Galaxy Ball/2. 싱글플레이 - 스토리모드 2024. 6. 11. 18:03
     

    (22) 스테이지 클리어 조건 & 클리어 씬 제작

    클리어 조건을 만들기전에 클리어 씬부터 제작하겠다 우선 구성은 InformationBox와 GalaxyBackGround로 구성되어 있는데GalaxyBackGround는 위에 보이는 우주 아이콘들,  InformationBox는 밑에 있는 알림창과

    sangeun00.tistory.com

    위 글에서 준비해두었던 우주의 신비로운 사실들... 이걸 원래는 클리어씬에 출력되도록 할 예정이었으나

    계획을 바꿨다. 맨 처음 맵을 선택할때 소개란에 무엇을 띄워야할지 고민이 되었는데 

    이곳에 출력시키도록 변경해주었다

     

    메인 스테이지 박스.

    백그라운드와 하단에 스테이지 넘버링을 맡고 있는 Stagenumber. 그 밑에 깔린 StageTitle

    우주의 사실들을 출력해주는 공간인 StageExplain, 스테이지로 이동시켜주는 Button으로 구성되어 있다

     

    당연히 구현은 위 글에서 쓰였던 StageInformationtxt를 그대로 가져왔다

    여기서 한가지 수정해야 할것이 있다면 이 정보는 하나하나 클리어 해나가면서 그것에 대한 보상으로

    재밌는 우주에 관한 정보들을 알아가는것인데, 만약 내가 클리어한 스테이지는 10이면서

    11로 갔을때 11의 정보를 보여줄순 없다는것. 그러므로 StageClearID와 StageID를 비교하여

    만약 StageClearID가 더 높다면 정보를 보여줄수가 없다

     

      public void UpdateStageInfo()
      {
          StageGameManager gameManager = FindObjectOfType<StageGameManager>();
    
          string jsonString = JsonFile.text;
          Information[] stageInfos = JsonConvert.DeserializeObject<Information[]>(jsonString);
    
          int stageID = StageState.chooseStage;
          int stageClearID = gameManager.StageClearID;
    
          // stageID에 해당하는 String 가져오기
          string stageString = "";
          foreach (Information info in stageInfos)
          {
              if (info.id == stageID)
              {
                  if (stageClearID < stageID)
                  {
                      stageString = "<size=20>???</size>";
                  }
                  else
                  {
                      stageString = info.String;
                  }
                  Debug.Log(info.id + "번 설명입니다");
                  break;
              }
          }

     

    그래서 기존 코드에서 살짝 수정을 해 stageClearID(여태 내가 클리어한 스테이지의 수)가

    stageID(=chooseStage = 내가 현재 선택한 스테이지 넘버링)보다 낮다면 "???"를 출력하도록 했다

     

    거기에 사이즈 조절을 위해 <size=20>으로 맞추어 주었다

     

     

    이제 클리어 여부에 따라 텍스트를 보여주기도, 보여주지 않기도 한다

     

    그리고 이제 하루 할당량이 생겼다. 스테이지를 못해도 하루에 15개씩 만드는것

    그렇다고 딱히 어렵거나 새로 배울거 없이 밸런스 생각하면서 노가다만 하면 되니 즐거운 마음으로 제작해보자

     

    예전에 잠깐 스테이지 제작을 생각할때 어쨌든 위치값을 json에 적어야할텐데 어떻게 일일이 옮겨 적어야하나 고민하고

    이런식으로 x,y축 가장 끝값을 미리 계산해놔 메모까지 해놨었는데 생각해보니까 그럴 필요가 없었다

     

     

    그냥 보면서 배치 다 해놓고 좌표값만 옮겨적으면 되는일. 왜 이렇게 복잡하게 생각했었나 모르겠다

     

     

    이제 본격적으로 배치할 준비가 되었으니 적을 생성하는 코드도 끝까지 완성시키자

    고정구체는 전부 위치를 (0,0,0)으로 고정하고 만든 것이기에 크게 어려울건 없다

     

    이제 정말 준비가 다 되었고, 시작하기전 마지막으로 배경화면에 쓰일 색 몇가지만 미리 값을 받아놓고 시작하자

     

     

    주황

    R :248 G :221 B :104  A : 255

     

    노랑

    R :255 G :255 B :0  A :255 

     

    하늘

    R :144 G :255 B :255  A :225 

     

    검정

    R :0 G :0 B :0  A :255 

     

    흰색

    R :255 G :255 B :255  A :255 

     

     

    근데 이렇게 하다보니까 느낀건데, 원래는 이 배경색을 랜덤으로 할 생각이었는데, 차라리 아무 의미도 없이 바꾸는것보다

     

    이 행성들 색에 맞춰서 바꿔주는건 어떨까?

     

    물론 디테일하게 하나하나 다 맞춰줄순 없겠지만, 랜덤하게 바꾸는것보다 훨씬 좋은 생각같다

    하지만 그렇게 하려면 스테이지를 제작하는것보다 먼저 스테이지 순서를 배치하는게 우선이 될수 밖에 없을것이다

     

     

    즉, 이 스테이지에 모든 행성들을 알맞게 배치하는걸 우선으로 해야한다는것. 

    계획이 바뀌었다. 이것부터 시작하자. 물론 이것도 스테이지 제작의 일부로 간주하겠다

     

     

     

    가장 먼저 6~15스테이지인 태양계를 구현해보았다. 고증을 살려

    수금지화달목토천해 순으로 태양과의 거리를 조절하였고, 원래 이 에셋을 판매하신분이

    태양 주변을 공전하는것까지 구현하라고 애니메이션을 주셨으나 행성이 계속 동적으로 이동을 한다면

    스테이지 선택을 하고, 스테이지 설명을 읽는것이 굉장히 까다로워질것 같아 그 기능은 없애기로 했다

     

     

     

    각자의 행성에 들어갈 설명들도 행성의 컨셉에 맞춰 설명을 넣어주었다

     

    ----------------------------------------------------------------

     

    그리고 이 과정에서 2시간가량 오류 하나에 막혀 계속해서 뺑뺑이를 돌았는데 원인은 바로 json 파일에서 줄바꿈하는

     

    "\n" 여기서 n을 쓰는것을 2개 빼먹었었다. 그것때매 2시간을...

    json formatter에서 \ 만 쓰는것은 오류로 간주하지 않아서 더 찾는데 오래 걸린것같다

    말 그대로 정말 노가다로 찾았다. 하나 대입해서 게임 실행하고, 다시 수정해서 게임 실행하고....

    ------------------------------------------------------------------

     

    아 그리고 하다보니 생각난건데 굳이 위에 적어둔것처럼

     

    주황

    R :248 G :221 B :104  A : 255

     

    이렇게 할게 아니라 그냥 46A7FA 이거 하나면 된다

     

    using UnityEngine;
    using Newtonsoft.Json;
    using System.Collections.Generic;
    
    public class SpawnGojungAndBack : MonoBehaviour
    {
        public TextAsset jsonFile;
        public GameObject[] Gojungtype;
    
        [System.Serializable]
        public class GojungBackData
        {
            public int id;
            public int Gojungnum;
            public string Color;
        }
    
        void Start()
        {
            int stage = GlobalData.SelectedStage;
    
            if (jsonFile != null)
            {
                List<GojungBackData> colorDataList = JsonConvert.DeserializeObject<List<GojungBackData>>(jsonFile.text);
    
                GojungBackData colorData = colorDataList.Find(data => data.id == stage);
    
                if (colorData != null)
                {
                    if (ColorUtility.TryParseHtmlString("#" + colorData.Color, out Color color))
                    {
                        GameObject backgroundObject = GameObject.Find("BackGround");
    
                        if (backgroundObject != null)
                        {
                            SpriteRenderer spriteRenderer = backgroundObject.GetComponent<SpriteRenderer>();
    
                            if (spriteRenderer != null)
                            {
                                spriteRenderer.color = color;
                            }
                        }
                        if (colorData.Gojungnum > 0 && colorData.Gojungnum <= Gojungtype.Length)
                        {
                            Instantiate(Gojungtype[colorData.Gojungnum - 1], new Vector3(0, 0, 0), Quaternion.identity);
                        }
                        else
                        {
                            Debug.LogError("Gojungnum 값이 배열 범위를 벗어납니다.");
                        }
                    }
                    else
                    {
                        Debug.LogError("유효하지 않은 색상 코드입니다: " + colorData.Color);
                    }
                }
                else
                {
                    Debug.LogError($"ID가 {stage}인 데이터를 찾을 수 없습니다.");
                }
            }
        }
    }

     

    json파일을 받아 고정물체와 배경화면 색을 변경해주는 코드도 수정해주었다. 

     

    이제 복잡하게 RGBA값 대신 칼라값만 넣어주면 되니 훨씬 더 간편하고 다양한 색을 사용할 수 있다

     

    그렇게 각 행성의 핵심 색상을 전부 따서

     

    이런식으로 jsonn파일에 각각 다르게 지정해주었다. 

    전부터 색상은 어떤식으로 다양하게 잡아줘야할지 늘 고민이었는데 이렇게 풀려 다행이다

     

    이번엔 적 배치를 해보자. 적배치는 사실 변동사항도 없고 지난번에 만들어둔 json파일을

    그대로 이어나가기만 하면 되기때문에 임시로 스테이지 10까지 대충 배치해두었다

     

    색상과 함께 적 유닛까지 잘 배치되는것을 확인할 수 있다

     

    이제 정말 남은건 딱 하나. 밸런스 조절하면서 노가다로 스테이지를 만들어주기만 하면 된다

     

     

Designed by Tistory.