스프라이트 렌더러 컴포넌트 -> 앞뒤 정렬(순서)는 트랜스폼 컴포넌트와 노상관
정렬 레이어(Sorting Layer)가 결정

다만 유니티에선 가장 아래쪽 정렬 레이어가 가장 앞쪽에 그려짐을 유의하자.
즉 Player 와 Sky 컴포넌트가 존재한다면, 플레이어는 가장 아래쪽 레이어인 Foreground로, Sky 는 가장 위쪽인 Background 로 가야한다는 말.
CSS로 마치 Carousel을 만드는 원리와 비슷하다.
width 값을 부여하고,
x축 위치값(transform.position.x)과 width 값을 비교한다.
-width 값을 넘어가게되면, 너무 많이 왼쪽으로 이동했다고 판단,
2 * width 를 더하여 다시 등장할 수 있도록 한다.
(-width -> +width 로 변경하는 꼴)
public class BackgroundLoop : MonoBehaviour {
private float width; // 배경의 가로 길이
private void Awake() {
// 가로 길이를 측정하는 처리
BoxCollider2D backgroundCollider = GetComponent<BoxCollider2D>();
width = backgroundCollider.size.x;
}
private void Update() {
// 현재 위치가 원점에서 왼쪽으로 width 이상 이동했을때 위치를 리셋
if (transform.position.x <= -width)
{
Reposition();
}
}
// 위치를 리셋하는 메서드
private void Reposition() {
Vector2 offset = new Vector2(width * 2f, 0);
transform.position = (Vector2) transform.position + offset;
}
현 위치에서 얼마만큼 오른쪽으로 밀어낼지 지정한 변수
offset은 Vector2 타입
transform.position은 Vector3 타입
이를 더하기 위해 Vector2로 형변환 하여 사용한 것 유의
UI는 캔버스 게임 오브젝트 내에 두어야 함.
캔버스의 크기는 게임을 실행중인 화면의 해상도로 결정,
고정 픽셀모드라면 게임을 실행하는 화면의 크기가 바뀌어도 캔버스의 크기는 고정
640 360 과 1280 720 화면에서 동일한 크기로 보여진다는 뜻

만약 640 360 크기에서 UI를 배치했다고 가정했을 때,
이 모드에선 게임을 실행하는 화면의 크기가 위 해상도보다 크거나 작아도
무조건 캔버스의 크기를 640 360 으로 취급하고,
다른 크기의 화면일 경우 캔버스 자체를 확대/축소함.
(즉 실제 크기와 inspector 에 뜨는 수치가 다름, 우리는 이 inspector에 뜨는 수치만 신경쓰면 알아서 조절된다는 뜻)
게임 매니저 처럼 관리자 역할을 하는 옵젝같은 경우 프로그램에 단 하나만 존재해야함.
즉 어떤 스크립트에서도 씬에 있는 게임 매니저에 쉽게 접근해야함.
-> 이게 바로 싱글턴 디자인 패턴
변수를 static으로 선언하면, 즉 정적변수로 선언하면 여러 옵젝이 해당변수 하나를 공유함.
점 연산자(.)를 사용하여 클래스 외부에서 접근 가능
public static GameManager instance; // 싱글톤을 할당할 전역 변수
void Awake() {
// 싱글톤 변수 instance가 비어있는가?
if (instance == null)
{
// instance가 비어있다면(null) 그곳에 자기 자신을 할당
instance = this;
}
else
{
// instance에 이미 다른 GameManager 오브젝트가 할당되어 있는 경우
// 씬에 두개 이상의 GameManager 오브젝트가 존재한다는 의미.
// 싱글톤 오브젝트는 하나만 존재해야 하므로 자신의 게임 오브젝트를 파괴
Debug.LogWarning("씬에 두개 이상의 게임 매니저가 존재합니다!");
Destroy(gameObject);
}
}
instance 변수를 정적변수로 선언.
이 정적변수에 싱글턴 패턴이 될 GameManager를 담을 예정.
Awake() 메서드에 instance가 null 이라면,
자기 자신을 instance 자리에 할당하여, 게임 매니저를 하나만 유지하도록 함.
이를 통해 GameManager.instance 로 즉시 접근 가능.
else 문은 다른 GameManager 가 생성된 경우 이를 파기함.
SceneManager.LoadScene(SceneManager.GetActiveScene().name);
즉 현재 씬의 이름을 가져오는 것.