[골드메탈 BE4] 따라하기 7

배근철·2022년 8월 4일
0

GoldMetal BE4

목록 보기
7/11

✍ 원근감있는 무한배경 만들기

  • 배경 스크롤링과 패럴랙스 기법을 이용해 원근감있는 배경을 만듦.

준비하기

  • 빈오브젝트를 만들어 그룹을 만들고 3개의 배경을 각각 복사해서 3개로 나눈 후 , 서로 나란히 있도록 Y축으로 정렬함.
  • 카메라는 그대로 있는데, 배경만 뒤로 움직여서 앞으로 가는듯한 눈속임
  • transform을 이용해서 이동을 구현
  • Vector3 curPos = transform.position;
           Vector3 nextPos = Vector3.down * speed * Time.deltaTime;
           transform.position = curPos + nextPos;

배경 스크롤링

  • Transform 배열을 이용해 시야에서 벗어난 부분을 위로 이어붙이고 , 인덱스 번호를 스왑해서 sprite 3개로 무한한 배경을 만듦
  • 카메라 크기를 이용해 카메라 밖으로 나간 부분을 계속 위로 이어붙임.
    • Camera View 높이 = Size * 2
    • Camera.main.orthographicSize * 2를 하면 실제 카메라 높이를 구할 수 있다.
    • viewHeight = Camera.main.orthographicSize * 2;
  • 카메라 시야의 밖을 벗어났으면 인덱스를 스왑해줘야함
    • 인스펙터 창에 자물쇠를 누르면 인스펙터창이 고정되므로, 고정시킨 후 Transform배열에 끌어 당겨준다.
    • 인덱스에 맞게 제대로 잘 끌어넣어야 한다.
 if (sprites[endidx].position.y < viewHeight * (-1))
        {

            // #. Sprite ReUse
            Vector3 backSpritePos = sprites[startidx].localPosition;
            Vector3 frontSpritePos = sprites[endidx].localPosition;
            sprites[endidx].transform.localPosition = backSpritePos + Vector3.up * 10;

            // #. Index Change
            int tmp = startidx;
            startidx = endidx;
            endidx = ((tmp - 1) == -1) ? sprites.Length - 1 : tmp - 1;
        }
  • 계층 구조를 이루고 있으면 젤 상위 position을 알고 싶으면 position을 사용하고, 내부에 있는 위치를 알고 싶으면 localPosition을 사용한다.


Parallax (패럴랙스)

  • 거리에 따른 상대적 속도를 활용한 기술
  • 보통 패럴랙스 기법은 플랫포머같은 횡스크롤 게임에 자주 적용된다.
  • 각각의 speed를 조절해 원근감이 있어보이게 표현

BackGround.cs 코드

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

public class BackGround : MonoBehaviour
{

    public float speed;
    public int startidx;
    public int endidx;
    public Transform[] sprites;

    float viewHeight;

    private void Awake()
    {
        viewHeight = Camera.main.orthographicSize * 2;
    }
    void Update()
    {

        Move();
        Scrolling();
    }

    void Move()
    {
        Vector3 curPos = transform.position;
        Vector3 nextPos = Vector3.down * speed * Time.deltaTime;
        transform.position = curPos + nextPos;
    }

    void Scrolling()
    {
        if (sprites[endidx].position.y < viewHeight * (-1))
        {

            // #. Sprite ReUse
            Vector3 backSpritePos = sprites[startidx].localPosition;
            Vector3 frontSpritePos = sprites[endidx].localPosition;
            sprites[endidx].transform.localPosition = backSpritePos + Vector3.up * 10;

            // #. Index Change
            int tmp = startidx;
            startidx = endidx;
            endidx = ((tmp - 1) == -1) ? sprites.Length - 1 : tmp - 1;
        }
    }
}


출처 - https://www.youtube.com/c/GoldMetal

0개의 댓글