개별 텍스처 스왑은 배치를 끊습니다
비주얼 노벨이나 2D 게임에서 캐릭터 표정(웃음, 분노, 당황 등)마다 독립된 PNG를 SpriteRenderer에 꽂으면 텍스처 바인딩이 달라져 드로우콜 배칭(Dynamic Batching)이 깨집니다. 캐릭터가 많아질수록 SetPass Calls와 Batches가 비례해서 늘어납니다.
using UnityEngine;
using UnityEngine.U2D;
public class CharacterExpressionBinder : MonoBehaviour
{
[SerializeField] private SpriteRenderer spriteRenderer;
[SerializeField] private SpriteAtlas characterAtlas;
public void ApplyExpression(string expressionName)
{
Sprite target = characterAtlas.GetSprite(expressionName);
if (target != null)
spriteRenderer.sprite = target;
}
}Sprite Atlas 설정 주의점
Assets > Create > 2D > Sprite Atlas를 만들고 Characters 폴더 전체를 Objects for Packing에 넣으세요. Tight Packing 옵션은 폴리곤 메쉬를 스프라이트 외곽선에 밀착시켜 여백을 아끼지만, 표정 교체 시 버텍스 좌표가 흔들릴 수 있으므로 일반 2D 캐릭터는 Tight Packing을 끄는 편이 안정적입니다.
#if UNITY_EDITOR
using UnityEditor;
using UnityEditor.U2D;
using UnityEngine.U2D;
public static class AtlasPackUtility
{
[MenuItem("Tools/Atlas/Force Pack All")]
public static void PackAll()
{
SpriteAtlasUtility.PackAllAtlases(EditorUserBuildSettings.activeBuildTarget);
}
}
#endif런타임 클론 스프라이트 관리
characterAtlas.GetSprite()는 호출할 때마다 새로운 Sprite 인스턴스(Clone)를 생성합니다. Update 같은 반복 루프에서 매 프레임 호출하지 말고, Awake나 초기화 시점에 딕셔너리로 캐싱해 두어야 가비지 컬렉션(GC) 부하를 막을 수 있습니다.
공식 문서 대조
검증일
Unity 공식 문서와 본문의 코드·절차를 대조해 공개 준비 상태로 전환했습니다. 별도 Unity 프로젝트나 실기기에서 직접 재현한 결과는 아니며, 특정 버전·기기 문의가 들어오면 해당 환경에서 후속 확인합니다.