AI 보조 게임 개발

AI 코딩 어시스턴트로 Unity URP 셰이더 작성 시간 70% 줄이기

kr-gamedev 2026. 6. 3. 10:44

셰이더 코드는 게임 개발자가 가장 기피하는 작업 중 하나다. HLSL 문법, URP/HDRP 파이프라인 차이, 버텍스-프래그먼트 연결, SubShader 블록 구조... 처음 한 번만 헤매는 게 아니라, 프로젝트마다 매번 헤맨다. 예전에 짰던 셰이더 파일을 열어서 복붙하고, 어디서 읽었던 블로그 포스팅을 찾아 헤매고, Unity 문서에서 Properties 블록 문법을 다시 확인하는 반복이 이어진다.

Cursor나 Claude Code 같은 AI 코딩 어시스턴트를 셰이더 작업에 적극 활용하기 시작한 뒤로 이 반복이 거의 사라졌다. "URP Lit 기반으로 림 라이트 추가해줘"라고 말하면 작동하는 코드가 나온다. 물론 그대로 쓰지는 않는다. 하지만 빈 파일에서 시작하는 것과, 80% 완성된 코드에서 20%를 수정하는 것의 체감 속도 차이는 엄청나다.

이 글에서는 실제로 유효한 프롬프트 패턴과, AI가 자주 틀리는 부분을 어떻게 잡아내는지를 정리한다.


1. 왜 셰이더에서 AI가 특히 효과적인가

셰이더 코드는 "패턴 반복"이 심하다. Properties 블록, SubShader 태그, Pass 구조, vertex/fragment 함수 시그니처... 이 뼈대는 프로젝트가 달라져도 거의 동일하다. AI는 패턴이 명확한 코드를 잘 생성한다. 반면 복잡한 게임플레이 로직은 컨텍스트가 너무 많아 AI 혼자서 완성하기 어렵다.

또한 셰이더는 "한 기능, 한 파일" 단위로 분리가 깔끔하다. AI에게 줄 컨텍스트가 최소화되므로 긴 대화 없이도 원하는 결과를 빠르게 얻을 수 있다.


2. 작동하는 프롬프트 패턴

막연하게 "셰이더 만들어줘"는 쓸모없다. 아래 형식이 일관되게 좋은 결과를 낸다.

렌더 파이프라인: URP 14.x (Unity 2022.3 LTS)
베이스: URP Unlit ShaderLab
목표: [원하는 시각 효과]
입력 파라미터: [노출할 프로퍼티 목록]
제약: [모바일 최적화 필요 / HDR 필요 / 스텐실 사용 X 등]

예를 들어 물결 왜곡 셰이더를 만든다면:

렌더 파이프라인: URP 14.x
베이스: URP Unlit ShaderLab
목표: UV 좌표를 시간 기반 사인파로 왜곡해서 물결 효과 구현
입력 파라미터: _MainTex, _WaveSpeed(float), _WaveAmplitude(float), _WaveFrequency(float)
제약: 모바일 대응, 투명도 필요

이 프롬프트로 Cursor에서 생성한 결과물:

Shader "Custom/WaveDistortion"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _WaveSpeed ("Wave Speed", Float) = 1.0
        _WaveAmplitude ("Wave Amplitude", Float) = 0.02
        _WaveFrequency ("Wave Frequency", Float) = 10.0
    }
    SubShader
    {
        Tags
        {
            "RenderType" = "Transparent"
            "Queue" = "Transparent"
            "RenderPipeline" = "UniversalPipeline"
        }
        Blend SrcAlpha OneMinusSrcAlpha
        ZWrite Off

        Pass
        {
            HLSLPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"

            struct Attributes
            {
                float4 positionOS : POSITION;
                float2 uv         : TEXCOORD0;
            };

            struct Varyings
            {
                float4 positionHCS : SV_POSITION;
                float2 uv          : TEXCOORD0;
            };

            TEXTURE2D(_MainTex);
            SAMPLER(sampler_MainTex);

            CBUFFER_START(UnityPerMaterial)
                float4 _MainTex_ST;
                float  _WaveSpeed;
                float  _WaveAmplitude;
                float  _WaveFrequency;
            CBUFFER_END

            Varyings vert(Attributes IN)
            {
                Varyings OUT;
                OUT.positionHCS = TransformObjectToHClip(IN.positionOS.xyz);
                OUT.uv = TRANSFORM_TEX(IN.uv, _MainTex);
                return OUT;
            }

            half4 frag(Varyings IN) : SV_Target
            {
                float2 uv = IN.uv;
                uv.x += sin(uv.y * _WaveFrequency + _Time.y * _WaveSpeed) * _WaveAmplitude;
                uv.y += sin(uv.x * _WaveFrequency + _Time.y * _WaveSpeed) * _WaveAmplitude;
                return SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, uv);
            }
            HLSLPROGRAM
            #pragma vertex vert
            ENDHLSL
        }
    }
}

실제로 바로 컴파일된다. _Time.y로 시간 처리하고, CBUFFER_START로 SRP Batcher 호환성도 챙겼다.


3. AI가 자주 틀리는 지점 3가지

AI가 생성한 셰이더를 맹목적으로 쓰면 나중에 반드시 문제가 생긴다. 직접 검수해야 할 포인트들:

1. ENDHLSL 위치 오류
위 코드 예시처럼 AI가 #pragma 선언을 ENDHLSL 뒤에 중복으로 박는 실수를 종종 한다. HLSLPROGRAM ... ENDHLSL 블록이 제대로 닫혔는지 항상 확인.

2. Built-in RP용 문법 혼용
sampler2D + tex2D() 조합은 Built-in 파이프라인 문법이다. URP에서는 TEXTURE2D + SAMPLE_TEXTURE2D 를 써야 한다. AI가 학습 데이터에 Built-in 예제가 많아 섞어 쓰는 경우가 있다.

3. SRP Batcher 비호환
_MainTex_ST 같은 텍스처 트랜스폼 변수를 CBUFFER_START(UnityPerMaterial) 바깥에 선언하면 SRP Batcher가 비활성화된다. 성능 프로파일러에서 "SRP Batcher: OFF" 뜨면 이 케이스를 의심.

이 세 가지만 체크하면 AI 생성 셰이더의 80% 이상은 그대로 쓸 수 있다.


4. Claude Code로 셰이더 디버깅하기

Cursor는 파일 편집에 강하고, Claude Code는 긴 오류 메시지를 붙여넣고 대화로 파고드는 데 강하다. 컴파일 에러가 뜨면 Claude Code에서 이렇게 쓴다:

Unity 콘솔 오류:
Shader error in 'Custom/WaveDistortion': undeclared identifier 'sampler_MainTex' at line 38

전체 셰이더 코드: [붙여넣기]

URP 14.x 기준으로 수정해줘.

대부분의 경우 정확한 원인과 수정 코드를 바로 돌려준다. "이 에러가 왜 나는지" 설명도 함께 오기 때문에 다음에 같은 실수를 반복하지 않게 된다.


5. 실전 워크플로우 요약

  1. Cursor: 프롬프트 패턴으로 셰이더 뼈대 생성 (2~3분)
  2. 수동 검수: ENDHLSL 블록, RP 문법 혼용, CBUFFER 구조 확인 (1~2분)
  3. Unity 임포트 후 컴파일 에러: Claude Code에 오류 + 전체 코드 붙여넣고 수정 (1분 내)
  4. 파라미터 튜닝: Inspector에서 직접 조정

기존에 셰이더 하나 만드는 데 30~40분이 걸렸다면, 이 플로우에서는 10분 이내로 떨어진다. 어려운 수학이나 고급 알고리즘이 필요한 셰이더(예: SDF 기반 UI, 레이마칭)도 AI가 알고리즘 뼈대를 잡아주면 파라미터 의미를 이해하면서 수정하는 방식으로 접근할 수 있다.


마치며

AI 어시스턴트가 셰이더를 "완벽하게" 만들어주지는 않는다. 하지만 빈 파일 앞에서 막막함을 느끼는 시간, 문서 찾아 헤매는 시간, 문법 실수로 낭비하는 시간은 확실히 줄여준다. 그 시간을 시각 효과 품질을 높이거나, 게임플레이와의 연동을 다듬는 데 쓸 수 있다.

셰이더가 두렵게 느껴졌다면, AI와 함께 시작점을 낮추는 것도 좋은 방법이다.