Unity Term Book
コアとアーキテクチャ

Asset

Asset は Unity プロジェクト内のあらゆるリソースです。テクスチャ・モデル・音声・スクリプト・マテリアルなどが Assets/ に置かれ、ファイルパスではなく GUID で参照されます。Import Settings、Resources.Load、Addressables の基礎を学べます。

想像してみてください...

Asset は厨房のパントリー(食材庫)のようです。料理する(ゲーム実行)前に、シェフ(Unity Editor)は野菜(テクスチャ)、香辛料(マテリアル)、レシピ(スクリプト)、BGM(オーディオ)を集めます。すべて Assets パントリー にあります。生ファイルを直接調理するのではなく 参照 し、元の食材を変えるとそれを使う料理すべてが更新されます。

概念の詳細

Asset はプロジェクトの Assets/ フォルダ配下のあらゆるファイルです。インポート時、Unity は GUID (グローバル一意 ID)付きの .meta を作ります——これが、壊れやすいファイルパスに頼らず GameObject やスクリプトが Asset を参照する仕組みです。

Asset DatabaseAssetDatabase)が 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:Asset 種別ごとに設定があります—— 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