유니티( Unity )는 2D 게임을 개발할 때 매우 강력한 도구입니다. 특히, 유니티에서의 쉐이더( Shader )와 머티리얼( Material )은 게임의 비주얼을 결정짓는 중요한 요소입니다. 이 글에서는 2D 쉐이더와 머티리얼의 개념, 설정 방법, 그리고 간단한 예제 코드를 통해 이러한 요소들이 어떻게 작동하는지 알아보겠습니다.
1. 쉐이더와 머티리얼의 이해
1.1. 쉐이더란?
쉐이더는 그래픽 카드가 3D 및 2D 오브젝트의 렌더링을 처리하는 방식입니다. 간단히 말해서, 쉐이더는 텍스처에 효과를 추가하거나 색상을 변경하는 프로그램 코드입니다. 유니티에서 쉐이더는 주로 Vertex
쉐이더와 Fragment
쉐이더의 두 가지로 나눌 수 있습니다. 2D 게임에서는 주로 Fragment
쉐이더를 사용하여 픽셀 단위의 처리를 수행합니다.
1.2. 머티리얼이란?
머티리얼은 쉐이더와 텍스처를 결합하여 오브젝트에 적용하는 것으로, 각 오브젝트의 표면 속성을 정의합니다. 머티리얼이 없으면 쉐이더가 오브젝트에 적용될 수 없습니다. 따라서, 머티리얼을 통해서 쉐이더의 다양한 효과를 오브젝트에 적용할 수 있습니다.
2. 2D 쉐이더의 주요 요소
2.1. 유니티의 기본 쉐이더
유니티는 여러 기본 제공 쉐이더를 가지고 있습니다. 2D 게임에서 주로 사용되는 쉐이더는 다음과 같습니다:
- Unlit Shader: 조명이 필요 없는 단순한 색상과 텍스처를 적용할 때 사용합니다.
- Sprites/Default: 2D 스프라이트의 표준 쉐이더로, 조명 효과가 적용됩니다.
- Sprites/Diffuse: 표면에 조명이 반사되는 효과를 더한 스프라이트 쉐이더입니다.
2.2. 커스텀 쉐이더 작성
유니티에서 커스텀 쉐이더를 만들면, 더욱 독창적이고 다양한 비주얼 효과를 적용할 수 있습니다. 다음은 간단한 2D 커스텀 쉐이더의 예제입니다:
Shader "Custom/MySimpleShader"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 200
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata_t
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};
sampler2D _MainTex;
float4 _MainTex_ST;
v2f vert (appdata_t v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
return tex2D(_MainTex, i.uv);
}
ENDCG
}
}
Fallback "Diffuse"
}
3. 머티리얼 설정과 적용
쉐이더를 작성한 후, 이를 사용하여 머티리얼을 만듭니다. 머티리얼은 쉐이더와 텍스처를 결합하여 오브젝트에 적용되며, 프로퍼티 값을 설정하여 시각적 효과를 조정할 수 있습니다.
3.1. 머티리얼 생성하기
유니티에서 머티리얼을 생성하는 방법은 다음과 같습니다:
- 유니티 에디터의 프로젝트 창에서 마우스 오른쪽 버튼을 클릭합니다.
Create
->Material
을 선택합니다.- 생성된 머티리얼을 클릭하고 인스펙터에서 쉐이더를 설정합니다. 현재 예제에서 생성한
Custom/MySimpleShader
를 선택합니다.
3.2. 머티리얼에 텍스처 적용하기
머티리얼에 텍스처를 적용하려면:
- 머티리얼을 선택한 후 인스펙터의
MainTex
에 사용할 텍스처를 드래그 & 드롭합니다. - 머티리얼의 속성 값들을 조정하여 원하는 시각적 효과를 만듭니다.
4. 코드를 통한 머티리얼 적용
게임 오브젝트에 스크립트를 통해 머티리얼을 적용할 수도 있습니다. 다음 코드 예제는 특정 스프라이트 렌더러에 머티리얼을 적용하는 방법을 보여줍니다.
using UnityEngine;
public class ApplyMaterial : MonoBehaviour
{
public Material customMaterial;
void Start()
{
SpriteRenderer spriteRenderer = GetComponent();
if (spriteRenderer != null && customMaterial != null)
{
spriteRenderer.material = customMaterial;
}
}
}
5. 간단한 쉐이더 효과 적용 예제
다음은 간단한 효과를 구현하는 커스텀 쉐이더 예제입니다. 이 쉐이더는 오브젝트에 텍스처를 적용하고 색상을 조정할 수 있습니다.
Shader "Custom/ColorShift"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_Color ("Color", Color) = (1,1,1,1)
}
SubShader
{
Tags { "RenderType"="Opaque" }
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata_t
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};
sampler2D _MainTex;
fixed4 _Color;
v2f vert (appdata_t v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = v.uv;
return o;
}
fixed4 frag (v2f i) : SV_Target
{
fixed4 texColor = tex2D(_MainTex, i.uv);
return texColor * _Color;
}
ENDCG
}
}
Fallback "Diffuse"
}
6. 결론
이번 글에서는 유니티에서의 2D 쉐이더와 머티리얼의 개념, 설정 방법, 그리고 간단한 예제 쉐이더를 통해 시각적 효과를 적용하는 법에 대해 알아보았습니다. 유니티는 매우 강력한 그래픽 엔진으로, 많은 종류의 쉐이더를 지원하며 사용자가 커스텀 쉐이더를 작성하여 독창적인 비주얼을 구현할 수 있게 도와줍니다. 이러한 쉐이더의 활용은 게임의 전반적인 퀄리티를 높이고, 플레이어들에게 독특한 경험을 제공합니다. 더욱 다양한 쉐이더 효과를 구현하기 위해 실험해 보시길 바랍니다. 여러분의 창의력을 발휘하세요!