<배경이 왼쪽으로 움직이게 하는 방법>
| public class ScrollingObject : MonoBehaviour { public float speed = 10f; // 이동 속도 private void Update() { // 게임 오브젝트를 왼쪽으로 일정 속도로 평행 이동하는 처리 transform.Translate(Vector3.left*speed*Time.deltaTime); } } |
1. transform이란?
- transform은 클래스 이름이 아니라, MonoBehaviour가 기본으로 제공하는 프로퍼티예요.
- Unity에서 모든 GameObject는 위치(position), 회전(rotation), 크기(scale)를 가지는데, 이 정보를 담는 게 Transform 컴포넌트입니다.
- 즉, transform은 해당 스크립트가 붙은 게임 오브젝트의 Transform 컴포넌트에 접근하는 예약어예요.
- 예: transform.position, transform.rotation, transform.localScale
👉 정리: transform은 "이 오브젝트의 위치·회전·크기"를 제어하는 참조(reference). 클래스 이름이 아님.
2. tarnsform.Translate란?
- transform은 뒤에 Translate(현재 위치에서 벡터만큼 이동), position(오브젝트의 현재 위치) 등이 붙어야 기능을 할 수 있음
- transform.Translate(...) 는 오브젝트를 현재 위치에서 지정한 방향/거리만큼 이동시키는 함수입니다.
- 주의점!! vector2가 아닌 vector3에만 사용 가능함. 2D라도 vector3를 이용해야 함
3. transform.Translate와 Rigidbody의 차이?
둘 다 위치가 바뀌는 기능을 하지만 차이가 있음
1) transform을 사용하는 경우
- "강제로" 위치를 이동시키는 방식 / 물리엔진(충돌, 중력 등)을 무시하고 그냥 좌표를 옮겨버림
- 주로 배경 스크롤, UI 이동, 단순한 오브젝트 이동 등에 사용합니다
2) Rigidbody를 사용하는 경우
- Unity의 물리엔진(Physics) 을 이용하는 방식입니다.
- Rigidbody는 질량, 속도, 중력, 충돌 등을 계산해주기 때문에, 속도를 직접 설정하거나 힘(Force)을 가해서 움직입니다.
- 이렇게 하면 중력, 마찰, 충돌 판정이 자연스럽게 적용됩니다.
- 주로 플레이어 캐릭터, 몬스터, 움직이는 오브젝트처럼 물리 법칙을 따라야 하는 대상에 씁니다.
4. Vector3.left란?
Unity에서 제공하는 미리 정의된 단축 벡터 중 하나
실제 값은 Vector3.left = new Vector3(-1f, 0f, 0f);
즉, x축 방향으로 -1만큼 이동하는 벡터라는 뜻(왼쪽으로)
- Vector3.right → ( 1, 0, 0 )
- Vector3.left → ( -1, 0, 0 )
- Vector3.up → ( 0, 1, 0 )
- Vector3.down → ( 0, -1, 0 )
- Vector3.forward → ( 0, 0, 1 )
- Vector3.back → ( 0, 0, -1 )
5. Time.deltaTime이란?
- Time.deltaTime은 “이전 프레임에서 이번 프레임까지 걸린 시간(초)”을 의미합니다.
- 컴퓨터 성능/프레임레이트에 따라 Update()가 호출되는 속도가 다르기 때문에, 이를 보정하기 위해 사용합니다.
- 그냥 Time이 아닌 Time.deltaTime을 이용해야 컴퓨터 성능별로 배경 이동속도에 차이가 발생하지 않음
- 모니터 60fps → 한 프레임은 약 0.016초 / 모니터 30fps → 한 프레임은 약 0.033초
- 만약 deltaTime을 안 쓰면, 30fps 환경에서는 오브젝트가 느리게 움직이고 60fps에서는 빠르게 움직이는 문제가 발생
< 배경이 무한 반복하게 하는 방법>
이 함수는 아예 통으로 외워두면 좋을 듯
| using UnityEngine; // 왼쪽 끝으로 이동한 배경을 오른쪽 끝으로 재배치하는 스크립트 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; } } |
1. private void Awake() { } 함수 이용
>> 씬 실행 시 최초 1번만 확인되면 되기에 Awake 함수 사용
1) Awake() = 오브젝트가 씬에 생성되자마자 (활성화될 때) 제일 먼저 실행
2) Start() = 모든 Awake가 끝난 뒤, 그리고 첫 번째 Update()가 실행되기 직전에 호출
* 현재 상황에선 Start를 써도 무방함
2. BoxCollider2D backgroundCollider = GetComponent<BoxCollider2D>();
>> 해당 오브젝트에 적용될 BoxCollider 2D를 backgroundCollider로 설정하고, GetComponent로 적용함
3. width = backgroundCollider.size.x;
오브젝트에 BoxCollider2D가 있으면, 자동으로 해당 오브젝트의 가로,세로 길이를 가져올 수 있습니다.
뒤에 .size.x를 붙이면 가로 길이 .size.y를 붙이면 세로 길이를 의미함
4. if(transform.position.x <= -width)면 Reposition 함수가 실행되게 처리.
즉, 오브젝트(배경)의 중간 값(x)이 오브젝트의 가로길이보다 뒤에 있다면 Reposition 함수 실행
5. 위 코딩에는 안 나오지만, 배경 오브젝트를 복사해서 기존 배경 오브젝트 오른쪽에 이어지게 위치 조정해두면 됨.
그러면 게임 화면에서는 끊김 없이 이어지는 것 처럼 보임
6. transform.position은 위에도 나왔지만 Vector3D만 가능하지만, 현재는 2D에 적용해야 하기에
(Vector 2) transform.position 로 기재하여 z축을 버리고 2D 좌표로 변환.
'✏️ 취미 > 코딩' 카테고리의 다른 글
| 🕹️ 티스토리 헬로우(hello) 스킨 다크모드 없애는 법 (0) | 2026.01.14 |
|---|---|
| [C#] Text Rpg 예시 (0) | 2025.09.03 |
| [공부] 2D 유니런(유니티+런) 게임 제작 - player 총합 (4) (3) | 2025.08.17 |
| [공부] 2D 유니런(유니티+런) 게임 제작 - (3) (2) | 2025.08.17 |
| [공부] 2D 유니런(유니티+런) 게임 제작 - (2) (3) | 2025.08.17 |