기록 보관소

[Unity/유니티] 기초-2D 종스크롤 슈팅: 원근감있는 무한 배경만들기[B33] 본문

유니티 프로젝트/2D 종스크롤 슈팅

[Unity/유니티] 기초-2D 종스크롤 슈팅: 원근감있는 무한 배경만들기[B33]

JongHoon 2022. 3. 5. 21:52

개요

유니티 입문과 독학을 위해서 아래 링크의 골드메탈님의 영상들을 보며 진행 상황 사진 또는 캡처를 올리고 배웠던 점을 요약해서 적는다.

현재는 영상들을 보고 따라하고 배우는 것에 집중할 것이며, 영상을 모두 보고 따라한 후에는 개인 프로젝트를 설계하고 직접 만드는 것이 목표다.

https://youtube.com/playlist?list=PLO-mt5Iu5TeYI4dbYwWP8JqZMC9iuUIW2 

 

유니티 강좌 기초 채널 Basic

유니티 개발을 처음 시작하시는 입문자 분들을 위한 기초 채널. [ 프로젝트 ] B00 ~ B12 (BE1) : 유니티 필수 기초 B13 ~ B19 (BE2) : 2D 플랫포머 B20 ~ B26 (BE3) : 2D 탑다운 대화형 RPG B27 ~ B37 (BE4) : 2D 종스크롤

www.youtube.com


2D 종스크롤 슈팅: 원근감있는 무한 배경 만들기[B33]

1. 준비하기

기존 배경을 삭제하고 배경 그룹을 만들어서 각각 스프라이트를 넣어준다. Bottom부터 Top까지 순서가 맞도록 Order Layer를 설정한다.

  • 추가로 맵 크기에 맞춰 Main Camera의 Size를 6으로 넓혀주었다. 그에 맞춰 Spawn Point Group, Border, Border Bullet도 변경해준다.

그리고 2개씩 더 복사해준다
0번째들은 Y축을 -12로
2번째들은 Y축을 12로 만든다.

  • 카메라는 그대로 두고, 배경만 움직여서 플레이어가 움직이는 것처럼 보이게 만드는 것이다.

Background 스크립트를 만들고 배경 그룹에 넣어준다.

//Background 스크립트 파일

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

public class Background : MonoBehaviour {
    public float speed;

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

}

Speed 값 설정
실행해보니 맵이 잘 내려왔지만, 중간에 끊긴다.


2. 스크롤링

//Background 스크립트 파일

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

public class Background : MonoBehaviour {
    public float speed;
    public int startIndex;
    public int endIndex;
    public Transform[] sprites;

    float viewHeight;

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

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

        if (sprites[endIndex].position.y < viewHeight * (-1)) {
            //스프라이트 이동
            Vector3 backSpritePos = sprites[startIndex].localPosition;
            Vector3 frontSpritePos = sprites[endIndex].localPosition;
            sprites[endIndex].transform.localPosition = backSpritePos + Vector3.up * viewHeight;


            //인덱스 초기화
            int startIndexSave = startIndex;
            startIndex = endIndex;
            endIndex = (startIndexSave - 1 == -1) ? sprites.Length - 1 : startIndexSave - 1;
        }
    }
}

그룹들의 Y축을 12만큼 올리고, Start Index를 2로 설정
맵이 내려간다
가장 아래에 있는 맵이 거의 끝에 닿으니
위로 다시 올라갔다

  • 내려간 맵을 카메라 밖에서 아래에서 위로 올림으로써 계속 맵이 무한으로 나오도록 만든다.
  • Camera.orthographicSize : orthographic 카메라 Size

3. 패럴렉스

 

그룹 A 속도 4로 변경
그룹 B 속도 2로 변경
그룹 C는 속도 변경 없음
각 층마다 속도가 다 달라 한층 입체적으로 변했다

  • 패럴렉스(Parallax) : 거리에 따른 상대적 속도를 활용한 기술
    • 패럴렉스 기법은 플랫포머에서도 많이 사용함