Unity

๋ฌดํ•œ ์Šคํฌ๋กค๋ง ๋ฐฐ๊ฒฝ ๋ฒŒ์–ด์ง€๋Š” ๋ฌธ์ œ

ใ…Ž-ใ…Ž 2022. 12. 4. 21:12

์œ—๋ถ€๋ถ„์˜ ๋ฐฐ๊ฒฝ์ด 1ํ”ฝ์…€์”ฉ ๋ฒŒ์–ด์ง€๊ณ  ์žˆ๋‹ค!

๋ฌธ์ œ์˜ ์ƒํ™ฉ
- ๋ฌดํ•œ ์Šคํฌ๋กค๋ง๋˜๋Š” ๋ฐฐ๊ฒฝ์„ ๋งŒ๋“ค๋ ค๊ณ  ํ–ˆ์ง€๋งŒ ๋ฐฐ๊ฒฝ์ด ๋ฒŒ์–ด์ง
- BackgroundSpawner
> ๋งค ํ”„๋ ˆ์ž„๋งˆ๋‹ค Time.deltaTime * speed๋งŒํผ ์ด๋™

์›์ธ

- ๋งค ํ”„๋ ˆ์ž„๋ณ„ ๋‹ฌ๋ผ์ง€๋Š” deltaTime ๊ฐ’์˜ ์ฐจ์ด์— ์˜ํ•ด ๋ฒŒ์–ด์ง

- ์˜ˆ:

  1) ๊ฐ™์€ ๋ฐฐ๊ฒฝ์ด๋ฏธ์ง€ 1, 2, 3์ด ์›€์ง์ด๋ฉด์„œ ์Šคํฌ๋กค ๋ฐฐ๊ฒฝ์„ ์ƒ์„ฑ

  2) ๋ฐฐ๊ฒฝ์ด๋ฏธ์ง€ 1์˜ ์œ„์น˜๊ฐ€ -0.0083์— ๋„๋‹ฌํ•˜๋ฉด์„œ(< 0) ์‹œ์ž‘ ์œ„์น˜๋กœ ๋ณด๋ƒ„

  3) ๋ฐฐ๊ฒฝ์ด๋ฏธ์ง€ 2์˜ ์œ„์น˜๊ฐ€ -0.0071์— ๋„๋‹ฌํ•˜๋ฉด์„œ ์‹œ์ž‘ ์œ„์น˜๋กœ ๋ณด๋ƒ„

  4) ์‹œ์ž‘ ์œ„์น˜๋กœ ๋ณด๋‚ธ ๊ฒƒ์€ ๊ฐ™์ง€๋งŒ ํ˜„์žฌ position์— ๋”ํ•ด์„œ ์ด๋™ํ•˜๋Š” ๋กœ์ง์ธ๋งŒํผ, ๋‘ ์ด๋ฏธ์ง€ ์‚ฌ์ด์— ๊ฐ„๊ฒฉ์ด ๋ฐœ์ƒํ•จ

 

ํ•ด๊ฒฐ

- 0 ๋„˜์–ด๊ฐ€๋Š” ์‹œ์ ์— ์ฐจ์ด๊ฐ’์„ ๊ณ„์‚ฐํ•˜์—ฌ ์‹œ์ž‘ ์œ„์น˜๋กœ ๋ณด๋‚ผ ๋•Œ ์ฐจ์ด๊ฐ’๋งŒํผ ๋” ๋ฐ€์–ด์ฃผ๊ธฐ

 

 

์ตœ์ข…

using System;
using System.Collections;
using System.Linq;
using System.Collections.Generic;
using UnityEngine;

public class BackgroundSpawner : MonoBehaviour
{
    public enum LayerDepth { Base, Down, Middle, Light, Top }

    [Serializable]
    public class BackgroundLayer
    {
        public LayerDepth LayerDepth;
        public float Speed;
        public SpriteRenderer Prefab;
    }

    [SerializeField]
    private BackgroundLayer[] layers;

    private float backgroundXSize;
    private int backgroundsCount;
    private float backgroundXPositionIndex;
    private string layerNameByInt(int i) => ((LayerDepth)i).ToString();

    private float halfXWidth;
    private Dictionary<string, List<SpriteRenderer>> BackgroundLayersByDepth = new Dictionary<string, List<SpriteRenderer>>();
    private float screenX;
    private float _PPUinterpolation;
    private float backgroundRightStartPosX;

    private void Awake()
    {
        backgroundXSize = layers[0].Prefab.size.x;
        halfXWidth = backgroundXSize / 2f;
    }

    private void Start()
    {
        screenX = GameManager.Instance.ScreenRectInWorldSpace.x;

        backgroundsCount = Mathf.CeilToInt(screenX * 2 / backgroundXSize) + 1;  // 2๊ฐœ์ผ ๊ฒฝ์šฐ ์ด๋™ํ•  ๋•Œ ๊ณต๋ฐฑ์ด ์ƒ๊น€์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•จ

        // ๋ ˆ์ด์–ด๋ณ„ ์˜ค๋ธŒ์ ํŠธ ์ƒ์„ฑ
        for(int i = 0; i < layers.Length; i++)
        {
            backgroundXPositionIndex = -((float) backgroundsCount / 2);

            string currentLayerName = layerNameByInt(i);

            GameObject currentLayerObj = new GameObject(currentLayerName);
            currentLayerObj.transform.SetParent(transform, false);

            BackgroundLayersByDepth.Add(currentLayerName, new List<SpriteRenderer>());

            // ๋ ˆ์ด์–ด ํ•˜๋‹จ์— ๊ฐœ์ˆ˜๋งŒํผ spriteRenderer ์ƒ์„ฑ
            for (int j = 0; j < backgroundsCount; j++)
            {
                BackgroundLayer layer = layers[i];

                SpriteRenderer backgroundObject = Instantiate(layer.Prefab);
                backgroundObject.transform.SetParent(currentLayerObj.transform);
                backgroundObject.transform.localPosition = Vector3.zero + new Vector3((backgroundXSize * backgroundXPositionIndex) + halfXWidth, 0, 0);

                BackgroundLayersByDepth[currentLayerName].Add(backgroundObject);

                backgroundXPositionIndex++;
            }
        }

        _PPUinterpolation = (float) 1f / BackgroundLayersByDepth[layerNameByInt(0)][0].sprite.pixelsPerUnit;
        backgroundRightStartPosX = ((backgroundXSize * backgroundsCount) / 2f) ;
    }

    private void Update()
    {
        for (int i = 0; i < layers.Length; i++)
        {
            foreach (SpriteRenderer layer in BackgroundLayersByDepth[layerNameByInt(i)])
            {
                Vector3 moveDistance = (Vector3.right * layers[i].Speed) * Time.deltaTime;

                layer.transform.localPosition -= moveDistance;

                if (layer.transform.localPosition.x + halfXWidth < -screenX)
                {
                    float gapBetweenScreenAndLeftSide = -screenX - (layer.transform.localPosition.x + halfXWidth);
                    layer.transform.localPosition = new Vector3(backgroundRightStartPosX - gapBetweenScreenAndLeftSide, 0, 0);
                }
            }
        }
    }
}