Unity Term Book
핵심 & 아키텍처

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 분류

📁 Assets/
🖼

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

각 파일 → Unity가 고유 GUID .meta 생성 → 스크립트는 경로가 아닌 GUID로 참조

실습 단계

1

프로젝트에 Asset 임포트

Explorer/Finder에서 Project 창으로 드래그하거나 Assets → Import New Asset...

2

Import Settings 구성

Asset 선택 → Inspector → Compression, Max Size, Load Type… 조정 → Apply.

3

SerializeField로 참조

Project에서 Asset을 Inspector의 [SerializeField] 필드에 드래그합니다.

4

Addressables로 필요 시 로드

Asset을 Addressable로 표시한 뒤 필요할 때 Addressables.LoadAssetAsync<T>(key).

5

폴더를 깔끔히 유지

명확한 경로: Assets/Art/Textures/, Assets/Scripts/… Assets 루트에 파일을 쌓지 마세요.

인터랙티브 시뮬레이터

Import로 Asset을 추가하고 클릭해 속성을 검사하세요. SerializeField에 할당해 GUID로 참조합니다.

Assets: 0

📁 Assets/

Asset이 없습니다 — "Import Asset"을 누르세요

Inspector

Asset을 선택하세요

SerializeField

Asset을 여기로 드래그...

Selected: None|팁: 모든 Asset에는 고유 GUID .meta 파일이 있습니다

코드 예제

기본

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