ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • (17) Json으로 배경색 조절 & 고정구체 배치
    Galaxy Ball/2. 싱글플레이 - 스토리모드 2024. 5. 30. 17:48

     

     

    (14) Json으로 스테이지에 적 배치하기

    전 글에서 올바르게 스테이지를 찾아간뒤, 현재 스테이지의 인덱스값(chooseStage)까지인게임창에 전달하는것을 성공했으니 이번에는 그 스테이지의 인덱스값을 이용하여 적 유닛을 배치해보겠다

    sangeun00.tistory.com

    사실상 이 글의 연장선이나 다름없고 이번엔 Json으로 배경색을 조절하고 고정구체까지 배치해보도록 하겠다

     

    이것만 배치를 달리 해줘도 스테이지의 컨셉이나 느낌이 확확 달라질수 있다

    원래는 고정구체 요소들도 적 유닛처럼 내가 직접 하나하나 배치해주려 했으나, 아무리 생각해봐도 그건

    너무 효율성이 떨어져 차라리 미리 맵을 몇개 만들어놓은뒤 Json 아이디에 따라 미리 만들어놓은 스테이지를

    배치시키기로 했다

     

    가장 기본 스테이지. 아무것도 배치시키지 않았다

     

    그외의 다른 스테이지들. 여기까지는 별다른 특징없이 디자인 차이다

     

     

     

    노란색의 고정구체는 더이상 "고정" 구체라고 보기 어렵다. 충돌에 따라 이동이 가능하기 때문

     

     

     

    짜잘하게 여러개를 배치하면 이런 느낌이다. 이게 적 유닛의 총알에 의해 고루고루 퍼지게 되면

    꽤 많은 변수가 생길것이다

     

     

    응용해서 이런것들도 만들어보았다

     

    움직이지 않는 고정체, 물리 영향을 받는 오브젝트에 이어 세번째는 스스로 움직이는 동적 오브젝트이다

     

    using System.Collections;
    using UnityEngine;
    
    public class GojungMoving : MonoBehaviour
    {
        public float speed = 1.5f; 
        public float distance = 1.7f; 
        private bool movingLeft = true;
    
        void Start()
        {
            StartCoroutine(Move());
        }
    
        IEnumerator Move()
        {
            Vector3 startPosition = transform.position;
            Vector3 leftPosition = startPosition + Vector3.left * distance;
            Vector3 rightPosition = startPosition + Vector3.right * distance;
    
            while (true)
            {
                if (movingLeft)
                {
                    yield return StartCoroutine(MoveToPosition(leftPosition));
                    movingLeft = false;
                }
                else
                {
                    yield return StartCoroutine(MoveToPosition(rightPosition));
                    movingLeft = true;
                }
            }
        }
    
        IEnumerator MoveToPosition(Vector3 targetPosition)
        {
            while (Vector3.Distance(transform.position, targetPosition) > 0.01f)
            {
                transform.position = Vector3.MoveTowards(transform.position, targetPosition, speed * Time.deltaTime);
                yield return null;
            }
        }
    }

     

    코루틴을 이용하여 speed의 일정한 속력만큼 distance의 거리를 부드럽게 왕복운동 하도록 코드를 하나 짜두었다

     

    방향을 바꾸는 변수는 bool타입 movingLeft 변수를 만들어 false면 오른쪽으로, true면 왼쪽으로 이동한다

     

     

     

    동영상으로 확인하면 이런 느낌인것이다. 당연히 이건 충돌의 영향을 받지 않는다

     

    정신없이 만들다보니 벌써 스테이지만 10개가 넘었다. 당연히 이것도 적 유닛처럼 추후에 아이디어가 떠오르는대로 더

    만들 예정이지만 우선 여기까지 만들고 더 중요한 Json과의 연계를 구현해보도록 하겠다

     

    이번엔 Json으로 고정오브젝트 생성과 함께 배경색도 함께 조절할수 있게 해보자

     

    우선 배경색 변경에 필요한건 RGBA값, 그리고 고정오브젝트 배치에 필요한것은 오브젝트 넘버링,

    그리고 식별을 위해 필요한 기본 아이디이다

     

    사실 id와 고정 오브젝트 넘버링을 이용하는것은 지난번에 했던 적 유닛배치와 똑같은 원리이다

    그리고 색변경도 어렵지 않다. 그냥 이름이 "BackGround"라는 오브젝트를 찾아 해당 오브젝트의 

    Sprite Render 색상을 해당 RGBA값으로 바꾸어주기만 하면된다

     

    [
       {
          "id":1,
          "Gojungnum":1,
          "R":255,
          "G":255,
          "B":255,
          "A":30
       },
       {
          "id":2,
          "Gojungnum":2,
          "R":100,
          "G":100,
          "B":100,
          "A":50
       }
    ]
    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 float R;
            public float G;
            public float B;
            public float A;
        }
    
        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)
                {
                    float r = colorData.R / 255f;
                    float g = colorData.G / 255f;
                    float b = colorData.B / 255f;
                    float a = colorData.A / 255f;
    
                    GameObject backgroundObject = GameObject.Find("BackGround");
    
                    if (backgroundObject != null)
                    {
                        SpriteRenderer spriteRenderer = backgroundObject.GetComponent<SpriteRenderer>();
    
                        if (spriteRenderer != null)
                        {
                            spriteRenderer.color = new Color(r, g, b, a);
                        }
                    }
                    // Gojungnum에 해당하는 오브젝트를 생성합니다.
                    if (colorData.Gojungnum > 0 && colorData.Gojungnum <= Gojungtype.Length)
                    {
                        Instantiate(Gojungtype[colorData.Gojungnum - 1], new Vector3(0, 0, 0), Quaternion.identity);
                    }
                }
            }
        }
    }

     

    사실 적 유닛배치와 크게 다를것 없고 색상변경도 생소한 내용은 아니기에 코드만 적고 넘어가겠다

     

     

    StageSpawn이라는 새로운 폴더를 만들어 적을 생성하는 EnemySpawn,

    고정 오브젝트를 생성하고 백그라운드의 색상을 결정하는 GojungSpawn을 자식 오브젝트로 넣어주었다

     

     

     

     

    이제 적 생성에 이어 고정 오브젝트 색상까지 잘 변경되는것을 확인할 수 있다

     

    다 만들고 나니 굳이 이걸 둘로 나눠서 관리해야하나..? 라는 생각이 들었지만

    그렇다고 이걸 하나로 합치기엔 너무 길어질것같아 조금 번거롭더라도 둘로 나눠서 관리하도록 하겠다

     

Designed by Tistory.