유니티는 이미지 파일을 직접적으로 Scene에 올려서 사용할 수 없다. 유니티에 맞도록 이미지 파일 형식을 변경해 주어야 한다. 이와 관련된 정보는 아래의 글에서 다룬다.
2025.02.11 - [유니티/기초] - 유니티 이미지 파일 렌더링 (Image File Rendering)
유니티 이미지 파일 렌더링 (Image File Rendering)
1. 이미지 파일 (Image File) 이미지 파일은 사진, 그림 등의 정보를 디지털화되어 저장한 파일이다. 이미지 파일은 다양한 파일 형식(File Formats)이 있다. 이는 사용 목적, 압축 방법, 특허 등에 따라
notyu.tistory.com
본 글에서는 이미지 파일을 동적으로 관리하는 방법에 대해 다룬다. 이미지 파일은 Sprite로 변환하여 Sprite Renderer 컴포넌트를 이용해 렌더링을 하거나, Texture로 사용해 Mesh Renderer를 통해 렌더링을 한다. 우선, 이미지 파일과 렌더러를 1:1로 연결하는 페어(쌍, Pair)를 만들고, 이미지 파일을 변경해야 하는 경우 필요한 이미지 파일과 Renderer 페어를 통으로 교체하는 방법이다. 하지만 프로그래밍 기법들의 발전으로 잘 사용하지 않는다.
다음으로는 렌더링이 필요한 곳에 Renderer 컴포넌트를 만들고, 필요할 때마다 이미지 파일을 교체하는 방법이다. Renderer는 이미지 파일(데이터)을 읽어 렌더링을 하는 역할을 수행한다. 이미지 파일은 이미지에 대한 디지털화된 데이터이다. 이처럼 역할이 명확할 경우에는 Renderer를 두고, 이미지 파일을 교체하는 방법으로 구현하는 것이 자원 관리에 있어 용이하다. Renderer 컴포넌트를 여러 개 만드는데 드는 비용이 더 들기 때문이다.
Sprite을 사용한 이미지 파일 변경 및 관리
이미지 파일의 변경은 SpriteRenderer에서 렌더링 하는 Sprite를 변경하면 된다. 그리고 Sprite로 변환된 이미지 파일의 관리는 배열, 리스트 등을 선언해 관리하면 된다. 여기에서는 Sprite 배열로 Sprite를 관리하고, 변경하는 로직을 구현한다.
먼저 이미지 파일들을 Sprite 형식으로 변환한다. 그렇지 않으면 등록할 수 없다.
이미지 파일 선택 → Texture mode : Sprite → Apply
클래스를 선언하고, SpriteRenderer 와 Sprite 배열을 선언한다. Sprite 배열은 public으로 선언하고 이미지 파일을 직접 드래그하여 등록하도록 한다.
using UnityEngine;
public class SpriteAnimator : MonoBehaviour
{
SpriteRenderer spriteRenderer;
public Sprite[] sprites;
}
SpriteRenderer 컴포넌트를 추가한다. 게임 오브젝트를 생성하고 SpriteRenderer 컴포넌트를 직접 추가할 수 있다. 여기서는 반드시 SpriteRenderer 컴포넌트가 필요하므로 RequireComponent 컴포넌트를 사용하여 추가하는 방법을 사용한다.
RequireComponent 컴포넌트는 유니티에서 제공하는 기능으로 자동으로 해당 컴포넌트를 추가해 주는 속성 클래스이다.
RequireComponent(typeof(SpriteRenderer))
SpriteRenderer 참조 변수가 GetComponent()를 사용해 생성한 SpriteRenderer 컴포넌트 개체를 참조하도록 한다.
SpriteRenderer spriteRenderer;
spriteRenderer = GetComponent<SpriteRenderer>();
Sprite 배열에서 원하는 이미지를 가져와 SpriteRenderer의 현재 렌더링 중인 이미지의 값을 변경한다.
spriteRenderer.sprite = sprites[index];
아래의 스크립트는 Sprite 배열에 등록한 Sprite를 시간이 지남에 따라 애니메이션이 이루어지는 것처럼 렌더링 하도록 만든 예제이다. 1초가 경과할 때마다, Sprite 배열에서 순차적으로 Sprite를 읽어와 SpriteRenderer의 Sprite를 변경한다.
using UnityEngine;
[RequireComponent(typeof(SpriteRenderer))]
public class SpriteAnimator : MonoBehaviour
{
public Sprite[] sprites;
SpriteRenderer spriteRenderer;
static readonly float timeRate = 1.0f;
float time;
int index;
// Start is called before the first frame
void Start()
{
spriteRenderer = GetComponent<SpriteRenderer>();
time = timeRate;
index = 0;
}
// Update is called once per frame
void Update()
{
AnimSprite();
}
void Anim()
{
if(sprites == null)
{
return;
}
if(0 >= sprites.Length)
{
return;
}
time -= Time.deltaTime;
if(0.0f > time)
{
spriteRenderer.sprite = sprites[index];
index++;
if(index >= sprites.Length)
{
index = 0;
}
time = timeRate;
}
}
}
SpriteAnimator 클래스를 사용하는 방법은 Scene 뷰에 Empty Game Object를 생성하고, SpriteAnimator 클래스를 추가하면 된다.
아래는 Scene View에 SpriteAnimator 클래스를 등록한 사진이다.
Texture를 사용한 이미지 파일 동적 변경 및 관리
Texture를 사용하여 이미지 파일을 렌더링 할 때, 이미지 파일을 변경하는 방법은 두 가지가 있다. Material의 Texture를 변경하는 방법과 Renderer의 Material을 변경하는 밥법이다.
Texture 변경
Texture 파일을 직접 관리하는 방법이다. Texture의 정보를 관리하는 Material에 접근하여, Texture를 변경하는 것이다.
이미지 파일을 렌더링하기 위해, Material을 생성한다. Material을 생성하면 Standard Shader를 사용하는 Material이 생성된다. 다음으로 Material의 Albedo에 이미지 파일을 연결한다.
Project View → Mouse Right Click → Create → Material
이미지 파일을 렌더링하는데 Plane을 사용한다.
GameObject → 3D Object → Plane
Plane을 생성하면 MeshRenderer와 MeshFilter가 추가된다. MeshRenderer의 Materials에 생성한 Material을 등록한다.
MeshRenderer 참조 변수를 생성한다.
public MeshRenderer meshRenderer;
Texture를 관리하기 위한 변수를 선언한다.
public Texture[] textures;
MeshRenderer에 등록된 Material의 Texture의 값을 변경한다.
Stander Shaderd의 Material의 Albedo texture의 변경하기 위한 Property name은 "_MainTex" 이다.
meshRenderer.material.SetTexture("_MainTex", textures[index]);
TextureAnimator 클래스 Example
using UnityEngine;
public class TextureAnimator : MonoBehaviour
{
public MeshRenderer meshRenderer;
public Texture[] textures;
static readonly float timeRate = 1.0f;
float time = 0.0f;
int index = 0;
// Update is called once per frame
void Update()
{
AnimTexture();
}
void AnimTexture()
{
if(textures == null)
return;
if(0 >= textures.Length)
return;
time += Time.deltaTime;
if(timeRate > time)
return;
Material material = meshRenderer.material;
material.SetTexture("_MainTex", textures[index]);
index++;
if(index >= textures.Length)
{
index = 0;
}
time = 0.0f;
}
}
Texture Animator GameObject
Material 변경
Texture를 관리하는 Material들을 만들어, Renderer에서 렌더링 하는 Material의 값을 변경하는 방법이다.
첫 번째 방법과 동일하게 Plane GameObject를 사용하여, 이미지 파일을 렌더링 한다.
이미지 파일을 렌더링 하는데 Plane을 사용한다.
GameObject → 3D Object → Plane
Material을 사용하고자 하는 이미지 파일의 수만큼 Material을 생성한다.
Project View → Mouse Right Click → Create → Material
각각의 Material에 이미지 파일(Texture type : Default)을 등록한다.
Material을 관리하기 위한 List를 만든다.
public List<Material> materials;
List를 사용하기 위해서는 System.Collections.Generic namespace를 등록해야 한다.
using System.Collections.Generic;
이미지 파일의 변경은 MeshRenderer의 material을 수정하면 된다.
MeshRenderer meshRenderer;
meshRender.material = materials[index];
MaterialAnimator 클래스
using System.Collections.Generic;
using UnityEngine;
public class MaterialAnimator : MonoBehaviour
{
public MeshRenderer meshRenderer;
public List<Material> materials;
int index;
static readonly float timeRate = 1.0f;
float time;
//Start is called before the first frame update
void Start()
{
time = timeRate;
index = 0;
}
//Update is called once per frame
void Update()
{
AnimMaterial();
}
void AnimMaterial()
{
if(materials == null)
return;
if(0 >= materials.Count)
return;
meshRenderer.material = materials[index++];
if(index >= materials.Count)
index = 0;
time = 0.0f;
}
}
Material Animator GameObject
'유니티 > 기초' 카테고리의 다른 글
유니티 DontDestroyOnLoad (0) | 2025.02.13 |
---|---|
유니티 이미지 파일 렌더링 (Image File Rendering) (0) | 2025.02.11 |
Unity Block Input On UI (0) | 2025.02.08 |
유니티 코드 디버깅 (Debugging) (0) | 2021.01.16 |
유니티 Invoke (0) | 2020.12.01 |