ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • (35) 새로운 적 유닛 정보창
    Galaxy Ball/2. 싱글플레이 - 스토리모드 2024. 7. 12. 16:31

    최종적으로 게임에 쓰인 적 유닛의 종류는 총 34가지 이다. 스테이지가 65개인데 적 유닛만 34가지라니....

    나야 게임을 직접 개발하는 입장이니 종류가 많아도 다 알아보고 외울수 있다지만 다른 사람은 그게 아닐것이다

    물론 알아보기 쉽게 최대한 유닛 디자인을 간결하고 직관적으로 하긴 했으나 그래도 34가지는 전부 외우는데 한계가 있다

     

    그래서 이번엔 새로운 적 유닛이 등장하면 이에 대한 간략한 설명과 스탯을 보여주는 정보창을 만들어보겠다

     

     

    기본 구조이다. 총 6가지의 구성요소로 이루어져 있으며

    bg, top은 정말 배경이미지, OKButton은 하단에 달린 초록색 버튼. 누르면 창이 닫히고 게임이 시작된다

    EnemyImg는 좌측상단에 보이는 적 유닛의 샘플 이미지이다

    EnemyStat은 말그대로 우측 상단에 이미지 옆에 보이는 적 유닛의 스탯

    마지막으로 TMI는 정가운데 하단에 보이는 이 유닛에 대한 간략한 설명이다

     

    적 유닛의 갯수는 34가지이니 이걸 34개 만들어주면 된다. 

    원래는 json파일로 스탯과 TMI를 작성해 늘 하던대로 StageClearID에 따라 값을 넣어줄까 했지만

    차라리 그것보다 작업속도를 더 효율적으로 빨리 할 수 있는 프리팹이 더 낫다고 판단하였다

     

     

    그래서 전부 만들어주었다

     

    이제 해야 할건 인게임 창에 들어갔을때,

    플레이어의 입장에서 처음 보는 유닛이라면 해당 유닛에 맞는 설명창이 활성화 되어야 한다

     

    근데 위 사진속 프리팹 이름들을 자세히 보면 이름뒤에 고유의 두자리 숫자가 적혀있다. 

    이게 어디에 쓰이는지는 잠시 후에 설명하겠다

     

     

    당연히 모든 프리팹은 캔버스안에 UI 요소들로 만들었기에

    정보창이 생성될 곳도 인게임씬의 캔버스안에 들어갈것이다. 우선 EnemyInfo라는 이름으로 빈 오브젝트를 만들어주었다

     

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class ShowEnemyInfo : MonoBehaviour
    {
        public GameObject[] EnemyInfos;
        public Transform canvasTransform;  
    
        void Start()
        {
            StageGameManager stageGameManager = FindObjectOfType<StageGameManager>();
            float stageClearID = stageGameManager.StageClearID;
    
            foreach (GameObject enemyInfo in EnemyInfos)
            {
                if (enemyInfo != null)
                {
                    string enemyInfoName = enemyInfo.name;
                    if (enemyInfoName.Length >= 2)
                    {
                        // 이름 뒤의 두 자리 숫자를 추출
                        string idString = enemyInfoName.Substring(enemyInfoName.Length - 2);
    
                        // 숫자로 변환
                        if (int.TryParse(idString, out int enemyID))
                        {
                            if (enemyID == stageClearID)
                            {
                                InstantiateEnemyInfo(enemyInfo);
                                break; // 일치하는 항목을 찾으면 루프 종료
                            }
                        }
                    }
                }
            }
        }
    
        void InstantiateEnemyInfo(GameObject enemyInfo)
        {
            GameObject instantiatedInfo = Instantiate(enemyInfo, Vector3.zero, Quaternion.identity);
            instantiatedInfo.transform.SetParent(canvasTransform, false);
    
            RectTransform rectTransform = instantiatedInfo.GetComponent<RectTransform>();
            if (rectTransform != null)
            {
                rectTransform.anchoredPosition = Vector2.zero; 
            }
        }
    }

     

    그리고 이 안에 ShowEnemyInfo 스크립트를 작성하여 부착해주자

    우선 EnemyInfos라는 이름으로 배열을 받은뒤 이 안에 만들어 놓은 프리팹을 넣어주면 된다

     

    그리고 왜 프리팹 이름뒤에 두자리수가 들어간건지 여기서 나온다

    사실 저 숫자들은 해당 프리팹에서 설명하고 있는 유닛이 처음으로 등장하는 스테이지의 넘버링이다

     

    즉 프리팹의 이름이 "ZEnemyInfo6 25" 이라면 "6번째 보스타입 유닛은 25번째 스테이지에 첫 등장한다" 와 같은 뜻인거다



                    string enemyInfoName = enemyInfo.name;
                    if (enemyInfoName.Length >= 2)
                    {
                        // 이름 뒤의 두 자리 숫자를 추출
                        string idString = enemyInfoName.Substring(enemyInfoName.Length - 2);

                        // 숫자로 변환
                        if (int.TryParse(idString, out int enemyID))
                        {
                            if (enemyID == stageClearID)
                            {
                                InstantiateEnemyInfo(enemyInfo);
                                break; // 일치하는 항목을 찾으면 루프 종료
                            }
                        }

     

     

    그러니 프리팹 이름에서 뒤 두글자만 추출해서 따온뒤 StageClearID와 비교하여

    숫자가 일치한다면 해당 ID값에 맞는 프리팹을 생성해주면 되는것이다

     

    그리고 한가지 더. 적 유닛 정보창이 뜰 때 동안에는 뒤에 가려진 게임이 진행하게 두면 안되니 

    정보창이 비활성화 되기 전까지는 시간을 정지시키겠다

     

     

     

     

     

     

     

     

Designed by Tistory.