반응형
[11회 차 수업 내용]
1. C# 유니티 배경 횡스크롤 transform.position
2. Material 배우기
3. Material 이용한 배경 횡스크롤
1. 배경이동 / 무한 2D 배경 만들기
1.1 두개의 배경 돌려가며 transform.position 사용해 무한 배경 구현
public class Transform_LoopMap : MonoBehaviour
{
public float moveSpeed = 0.3f; // Speed of the object
public float height = 1.5f; // Height of the object
public Vector3 returnPosition = new Vector3(30f,2f,0f); // Position to return to when the object goes off-screen
void Update()
{
//배경 왼쪽으로 이동하는 기능
transform.position += Vector3.left * moveSpeed* Time.fixedDeltaTime; // Move the object to the left
Debug.Log(Time.fixedDeltaTime);
if (transform.position.x <= -30f) // Check if the object has moved off-screen
{
transform.position = returnPosition; // Reset the position to the specified return position
}
}
}
*fixedDeletaTIme
“실선 문제” = 움직임이 정수 배수로 안 떨어질 때 생기는 미세한 들뜸 현상 (티어링/깨짐)
- 예: 픽셀 단위로 딱 떨어지지 않으면 텍스처가 겹치거나, 깜빡이는 현상이 생김
- 그래서 Time.deltaTime은 프레임마다 다르고 소수점 이동이 누적되다 보니 이 문제가 생길 수 있음
- fixedDeltaTime은 항상 고정된 값이므로,→ 위치 오차가 줄어들고 픽셀 맞춤도 쉬워짐→ 이동 거리도 고정
그러나...
- Update()는 매 프레임 호출되지만 Time.fixedDeltaTime은 물리 시간 간격 (예: 0.02초)이라 적합하진 않음
- 일반적인 무한 배경은 프레임 기반으로 처리하는 게 자연스러움
만약 실선 문제(찢어짐, 떨림, 겹침)가 걱정된다면
- 픽셀 퍼펙트 카메라(Pixel Perfect Camera) 사용
- 이동 거리를 정수 배수로 고정 (Mathf.Round, Snap, 등)
- 카메라와 오브젝트 위치를 동기화해서 스크롤 백터 차이를 줄이기
* 참고 - 언제 fixedDeltaTime을 써야 할까?
- RigidBody 이동, 힘 추가 (AddForce, MovePosition)
- 중력/마찰/충돌 감지
- 물리 기반 캐릭터 움직임
📌 핵심: Unity의 물리 엔진은 고정된 주기로 작동하므로, 이 시간 기준을 따라야 안정적
| 구분 | Time.deltaTime | Time.fixedDeltaTime |
| 의미 | 현재 프레임 시간 (매 프레임마다 달라짐) | 고정된 시간 간격 (기본 0.02초) |
| 기본 용도 | 화면 렌더링/이동/카메라/애니메이션 등 | 물리 엔진 기반 동작 (RigidBody 등) |
| 관련 함수 | Update(), LateUpdate() | FixedUpdate() |
| 주기 | 매 프레임 호출 | 고정 주기 (50회/초) |
| 정확도 | 프레임에 따라 다름 (더 부드러움) | 정해진 시간 단위로 정확함 (0.02초) |
2. Material
2.1 Lit과 Unlit (셰이더/머티리얼)
| 항목 | Lit | Unlit |
| 빛 영향 | O (있음) | X (없음) |
| 그림자 | O | X |
| 성능 | 비교적 무거움 | 매우 가벼움 |
| 용도 | 3D 모델, 리얼한 씬 | UI, 배경, 라이트 없는 게임 |
| 셰이더 종류 | PBR 기반 (Lit, Standard) | 단순 색상/텍스처 (Unlit) |
- * 텍스처 다운로드 사이트
ambientCG - Free Textures, HDRIs and Models
Free 3D Assets Never Looked This Good! Get 2000+ PBR Materials, HDRIs and more for free under the CC0 Public Domain license.
ambientCG.com
2.2 Material 세팅
| 맵 이름 | 역할 | 주로 쓰이는 파일명 예 | 확장 |
| Base Map (Albedo) | 표면의 색상 정보. 빛이 없을 때도 보이는 색. 투명도(알파 채널) 포함 가능. | *_BaseColor, *_Albedo, *_Diffuse | .png, .jpg |
| Metallic Map | 픽셀의 금속성 여부(흑백). 보통 R 채널에만 사용. **Smoothness(Glossiness)**는 A 채널에 함께 저장됨. | *_Metallic, *_MetallicSmoothness, *Roughness | .png |
| Normal Map | 표면의 세세한 요철 표현. 광원 반응을 바꿔 입체감을 줌. 실질적인 메쉬 변경은 없음. | *_NormalGL | .png |
| Height Map | 실제 표면의 높낮이 표현. Displacement Mapping 등에 사용. 메쉬를 변형 가능. | *_Height, *_Displacement | .png, .exr |
| Occlusion Map (Ambient Occlusion) | 그림자 정보. 틈새나 접힌 부분처럼 빛이 잘 안 들어가는 곳 표현 | *_AO, *_Occlusion | .png, .jpg |

2.3 Material 적용하는 여러 코드
using UnityEngine;
public class StudyMaterial : MonoBehaviour
{
public Material mat;
public string hexCode;
void Start()
{
this.GetComponent<MeshRenderer>().material = mat; // MeshRenderer에 접근해서 바꾸는 방식
this.GetComponent<MeshRenderer>().sharedMaterial = mat; // MeshRenderer에 접근해서 바꾸는 방식
this.GetComponent<MeshRenderer>().material.color = Color.green;
this.GetComponent<MeshRenderer>().sharedMaterial.color = Color.green;
this.GetComponent<MeshRenderer>().material.color = new Color(130f/255f, 20f/255f, 70f/255f, 1);
mat = this.GetComponent<MeshRenderer>().material;
Color outputColor;
if (ColorUtility.TryParseHtmlString(hexCode, out outputColor))
{
mat.color = outputColor;
}
}
}
3. Material 이용한 배경 횡스크롤
using UnityEngine;
public class Material_LoopMap : MonoBehaviour
{
private MeshRenderer renderer;
public float offsetSpeed = 0.1f; // 오프셋 이동 속도
{
renderer = GetComponent<MeshRenderer>(); //MeshRenderer 가져오기
void Update()
{
// 오른쪽 방향으로 시간에따라 오프셋 생성
Vector2 offset = Vector2.right * offsetSpeed * Time.deltaTime;
//기존 텍스처 오프셋 + offset만큼 움직이기
renderer.material.SetTextureOffset("_MainTex", renderer.material.mainTextureOffset + offset);
}
}

2.1 오프셋(Unity)
- 텍스처를 시작 위치에서 얼마나 이동시킬지를 나타내는 값
- UV 좌표계를 따라 텍스처를 밀어내는 것
2.2 material / sharedMaterial
| 항목 | 설명 |
| material | 인스턴스 복사본을 가져와서 수정. 해당 오브젝트에만 적용됨. |
| sharedMaterial | 원본 머티리얼 자체를 수정. 모든 오브젝트에 영향을 줄 수 있음. |
| 런타임 중 수정하려면 material, 에디터상 공용 변경은 sharedMaterial 사용 | |
반응형
'프로그래밍 > 유니티 부트캠프' 카테고리의 다른 글
| 유니티 (핀볼 게임/ 애니메이션 이해) _멋쟁이사자처럼 유니티 부트캠프 13회차 추가학습 (1) | 2025.06.09 |
|---|---|
| 멋쟁이사자처럼 유니티 부트캠프 12회차 추가학습 (Collider & Rigidbody / Physics Material / 고양이 점프와 파이프 생성) (3) | 2025.06.08 |
| W3Schools C# 개인학습 (Array->Multidimensional Arrays) (0) | 2025.05.26 |
| 멋쟁이사자처럼 유니티 부트캠프 10회차 추가학습 (Transform 이동 회전, 연산자_2D 룰렛 돌리기) (1) | 2025.05.26 |
| 멋쟁이사자처럼 유니티부트캠프 9회차 추가학습 (수학과 회전, Unity C#) (0) | 2025.05.23 |