๋ฌดํ ์คํฌ๋กค๋ง ๋ฐฐ๊ฒฝ ๋ฒ์ด์ง๋ ๋ฌธ์
๋ฌธ์ ์ ์ํฉ
- ๋ฌดํ ์คํฌ๋กค๋ง๋๋ ๋ฐฐ๊ฒฝ์ ๋ง๋ค๋ ค๊ณ ํ์ง๋ง ๋ฐฐ๊ฒฝ์ด ๋ฒ์ด์ง
- 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);
}
}
}
}
}