Asset
Asset은 Unity 프로젝트의 모든 리소스—텍스처·모델·오디오·스크립트·머티리얼—로 Assets/ 아래 GUID로 참조됩니다. SerializeField·Resources·Addressables·Import Settings와 .meta 관리를 배우는 입문 가이드입니다.
상상해 보세요...
Asset은 주방의 식재료 창고와 같습니다. 요리(게임 실행) 전에 셰프(Unity Editor)가 채소(텍스처)·향신료(머티리얼)·레시피(스크립트)·BGM(오디오)을 모읍니다. 모두 Assets 창고에 있습니다. 원본 파일을 직접 요리하지 않고 참조하며, 재료를 바꾸면 그걸 쓰는 요리도 함께 바뀝니다.
개념 자세히
Asset은 프로젝트
Assets/ 아래의 모든 파일입니다. 임포트 시 Unity는 GUID(전역 고유 ID)가 있는
.meta를 만듭니다——취약한 파일 경로에 의존하지 않고 GameObject·스크립트가
Asset을 참조하는 방식입니다.
Asset Database(AssetDatabase)가
Editor에서 Asset을 관리합니다. 파일이 바뀌면 재임포트합니다. 런타임에는
Resources.Load() 또는
Addressables로 동적 로드합니다.
흔한 Asset 유형: .png/.jpg
(Texture2D), .fbx/.obj (Mesh), .mp3/.wav (AudioClip),
.cs (MonoScript), .prefab (Prefab), .mat (Material),
.asset (ScriptableObject).
Import Settings: 유형마다 옵션이 다릅니다—— Texture Compression / Max Size; Audio Load Type (Decompress on Load / Streaming). 올바른 설정이 메모리와 로드 시간을 크게 줄입니다.
다이어그램: Asset 분류
Textures
.png .jpg .tga .psd
Texture2D · RenderTexture
Audio
.mp3 .wav .ogg
AudioClip
Models
.fbx .obj .blend
Mesh · Avatar
Scripts
.cs
MonoScript
Materials
.mat .shader
Material · Shader
Data Assets
.prefab .asset .anim
Prefab · SO · AnimClip
실습 단계
프로젝트에 Asset 임포트
Explorer/Finder에서 Project 창으로 드래그하거나 Assets → Import New Asset...
Import Settings 구성
Asset 선택 → Inspector → Compression, Max Size, Load Type… 조정 → Apply.
SerializeField로 참조
Project에서 Asset을 Inspector의 [SerializeField] 필드에 드래그합니다.
Addressables로 필요 시 로드
Asset을 Addressable로 표시한 뒤 필요할 때 Addressables.LoadAssetAsync<T>(key).
폴더를 깔끔히 유지
명확한 경로: Assets/Art/Textures/, Assets/Scripts/… Assets 루트에 파일을 쌓지 마세요.
인터랙티브 시뮬레이터
Import로 Asset을 추가하고 클릭해 속성을 검사하세요. SerializeField에 할당해 GUID로 참조합니다.
📁 Assets/
Asset이 없습니다 — "Import Asset"을 누르세요
Inspector
Asset을 선택하세요
SerializeField
Asset을 여기로 드래그...
—
GUID: —
코드 예제
기본SerializeField로 Asset을 참조하고 런타임에 사용합니다.
using UnityEngine;
public class WeaponController : MonoBehaviour
{
// Drag Assets from Project onto these fields in the Inspector
[SerializeField] private Sprite weaponIcon;
[SerializeField] private AudioClip shootSound;
[SerializeField] private GameObject bulletPrefab;
[SerializeField] private Material glowMaterial;
void Start()
{
// Use the assigned Asset — no runtime search needed
GetComponent<SpriteRenderer>().sprite = weaponIcon;
}
public void Shoot()
{
Instantiate(bulletPrefab, transform.position, transform.rotation);
AudioSource.PlayClipAtPoint(shootSound, transform.position);
}
}코드 예제
고급Resources.Load로 런타임에 Asset을 로드하고 캐시합니다.
using UnityEngine;
using System.Collections.Generic;
// Runtime asset manager — load by key, cache for reuse
public class AssetCache : MonoBehaviour
{
private static Dictionary<string, Object> _cache = new();
public static T Load<T>(string path) where T : Object
{
if (_cache.TryGetValue(path, out var cached))
return cached as T;
// Resources.Load looks under Assets/Resources/
T asset = Resources.Load<T>(path);
if (asset != null)
_cache[path] = asset;
else
Debug.LogWarning($"Asset not found: {path}");
return asset;
}
public static void Unload(string path)
{
if (_cache.TryGetValue(path, out var asset))
{
Resources.UnloadAsset(asset);
_cache.Remove(path);
}
}
}
// Usage:
// var tex = AssetCache.Load<Texture2D>("Textures/hero_sprite");📌 빠른 정리
- ▸모든 Asset은
.meta의 GUID를 가짐——함부로 삭제하지 마세요 - ▸
SerializeField= 정적 참조;Resources.Load= 동적 로드 - ▸Import Settings(Compression, Max Size)가 빌드 크기에 직접 영향
- ▸큰 게임에서는 Resources.Load보다 Addressables를 선호
⚠️ 흔한 실수
❌ .meta 파일을 삭제하거나 무시
GUID 변경 → Scene/Prefab 참조가 Missing
✅ Asset과 함께 .meta를 항상 Git에 커밋
❌ 모든 Asset을 Resources/에 넣음
Resources 아래 전부가 빌드에 포함 → 용량 팽창
✅ 동적 로드가 필요한 것만; 그 외는 SerializeField