ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • (22) 인트로씬 & Json 응용 연습
    Galaxy Ball/1. 멀티플레이 - 대전모드 2024. 4. 30. 16:01

    이번엔 임시로 쓰일 인트로씬을 만들고 Json으로 스테이지를 만드는 연습을 해보겠다

     

    게임을 실행하면 나오는 회사만의 로고들을 나도 만들어보겠다

     

    그림판으로 그린 귀여운 로고. 핸드폰 비율에 맞춰 1920X1080으로 틀을 맞춘뒤 그렸다

    쓰일 그림을 그렸다면 새로운 씬(Intro Scene)을 만든뒤 UI로 이미지를 붙여주자

     

    using UnityEngine;
    using UnityEngine.UI;
    using System.Collections;
    using UnityEngine.SceneManagement;
    
    public class FadeInOut : MonoBehaviour
    {
        public Image image;
        public float fadeTime = 2f;
    
        void Start()
        {
            image = GetComponent<Image>();
            StartCoroutine(FadeEffect());
        }
    
        IEnumerator FadeEffect()
        {
            for (float t = 0f; t <= 1f; t += Time.deltaTime / fadeTime)
            {
                Color newColor = image.color;
                newColor.a = Mathf.Lerp(0f, 1f, t);
                image.color = newColor;
                yield return null;
            }
    
            yield return new WaitForSeconds(1.5f); // 최고점에서 대기
    
            for (float t = 0f; t <= 1f; t += Time.deltaTime / fadeTime)
            {
                Color newColor = image.color;
                newColor.a = Mathf.Lerp(1f, 0f, t);
                image.color = newColor;
                yield return null;
            }
            SceneManager.LoadScene("Start Scene");
        }
    }

     

    그리고 해당 이미지에 붙일 FadeInOut 스크립트를 작성해준다

     

    이미지가 최대치까지 천천히 밝아졌다 다시 서서히 어두워지는것을 구현하고 싶기때문에

    코루틴을 사용했고, 코루틴이 끝나면 바로 Start Scene으로 씬변환을 해주었다

     

    잘 작동하는것을 확인했으니 이번엔 Json을 이용하여 간단하게 스테이지 만드는 원리를 알아보자

     

    Json + Excel 응용(Json.Convert)

    json생각보다 의미 자체나 활용은 어렵지 않지만 중요한 내용이기에 꼭 확실하게 짚고 넘어가야하는 json이다 json : 웹이나 네트워크에서 서버와 클라이언트 사이에서 데이터를 주고 받을 때 사용

    sangeun00.tistory.com

    결국 JsonUtility 말고 Json.Convert를 사용하기로 했다.

    위글에서 엑셀 파일을 Json파일로 변환하여 사용하는법까지 상세하게 설명되어 있으니 헷갈린다면 이 글을 참고하자

     

    이번에 해볼것은 인게임 스테이지 위에 구체를 각각(x:1.3, y:1.3), (x:-1.3, y:-1.3)으로 두개씩 생성해보겠다

     

    우선 Resources 폴더 안에 enemy라는 이름으로 Json 파일을 넣어주었고 

    그 안에는 식별을 위한 id와 간단하게 x,y축 값을 넣어주었다

     

    그리고 빈 오브젝트를 만든뒤 그 안에 넣어줄 스크립트를 하나 만든다

    using System.Collections.Generic;
    using UnityEngine;
    using Newtonsoft.Json;
    class Data
    {
        public int id;
        public float x;
        public float y;
    }
    public class Insenemy : MonoBehaviour
    {
        public GameObject enemyball;
        void Start()
        {
            var asset = Resources.Load<TextAsset>("enemy");
            var json = asset.text;
            var datas = JsonConvert.DeserializeObject<List<Data>>(json);
            foreach (var data in datas)
            {
                Debug.LogFormat("{0}, {1}, {2}", data.id, data.x, data.y);
                Instantiate(enemyball, new Vector3(data.x, data.y, 0), Quaternion.identity);
            }
        }
    }

     

    Data 클래스로 Json 파일 형식을 받은뒤 enemy라는 텍스트 파일을 불러와 datas안에 비직렬화를 해주었다

    그리고 foreach문으로 한바퀴를 돌며 Instantiate로 data의 x,y값을 가져와 구체를 생성해주었다

     

    물론 enemyball은 외부에서 가져오도록 public 처리를 했다

     

    스크립트를 부착한뒤 enemyball에 쓰일 오브젝트까지 가져와 붙였다면 게임을 실행해보자

     

     

     

    실행하자마자 곧바로 입력된 좌표에 구체 2개가 생성되는것을 확인할 수 있다

    지금은 임시니까 구체2개가 되었지만 싱글플레이 모드 스테이지에선 주로 적 유닛과 고정구체가 변경되지 않을까 싶다

     

    자 그럼 바로 응용을 해보자. 

    이번엔 변수 stage가 1이라면 id가 1인 구체만 생성

    stage가 2라면 id가 2인 구체만 생성해보도록 하겠다

     

    우선 json 파일의 id부분을 변경해주었다. 이제부터 101,102 가 아니라 1,2이다

    using System.Collections.Generic;
    using UnityEngine;
    using Newtonsoft.Json;
    
    class Data
    {
        public int id;
        public float x;
        public float y;
    }
    
    public class Insenemy : MonoBehaviour
    {
        public GameObject enemyball;
        public int stage = 1;
    
        void Start()
        {
            // 스테이지에 해당하는 ID 계산
    
            var asset = Resources.Load<TextAsset>("enemy");
            var json = asset.text;
            var datas = JsonConvert.DeserializeObject<List<Data>>(json);
            foreach (var data in datas)
            {
                // 현재 스테이지에 해당하는 ID만 생성
                if (data.id == stage)
                {
                    Debug.LogFormat("{0}, {1}, {2}", data.id, data.x, data.y);
                    Instantiate(enemyball, new Vector3(data.x, data.y, 0), Quaternion.identity);
                }
            }
        }
    }

     public int stage = 1;

     

    stage라는 int 타입 변수를 추가해주었다. 지금은 임시 연습용이니 1로 초기화를 해주었지만

    실전에서는 들어가는 스테이지에 따라 이 변수값이 변경될 예정이다

     

     foreach (var data in datas)
     {
         // 현재 스테이지에 해당하는 ID만 생성
         if (data.id == stage)
         {
             Debug.LogFormat("{0}, {1}, {2}", data.id, data.x, data.y);
             Instantiate(enemyball, new Vector3(data.x, data.y, 0), Quaternion.identity);
         }
     }

     

    그래서 data의 id가 stage와 동일하다면 해당 id에 해당하는 구체만 생성하는것이다

     

     

     그렇다면 이렇게 id가 1인 구체만 생성되는것을 확인할 수 있다

Designed by Tistory.