본문 바로가기

멋쟁이사자처럼 유니티 부트캠프 11회차 추가학습 (배경 횡스크롤과 Material)

@salmu2025. 5. 27. 17:43
반응형

[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 사용

 

반응형
salmu
@salmu :: SMU 각종 기록

목차