Mac × Unity × Git で起きるアセット二重化問題

 

3行まとめ

  • Macはファイル名の大文字と小文字を区別しない
  • 大文字小文字両方のファイルが存在するとSpriteAtlasに意図しない方が含まれて読み込めないことがある
  • 完全に別名のファイルに変更すると安全に対処できる

Unityエンジニアの佐々木です。今回はMacのファイルシステム特性(大小文字の扱い)が、UnityのSpriteAtlasとGitの連携に与える影響について、実際に遭遇した事例とともに紹介します。

背景:MacのファイルシステムとUnityアセット管理

多くのMac環境はデフォルトで「大文字小文字を区別しない」ファイルシステム(APFS Case-insensitive)で動作します。一方でGitなどのバージョン管理システム、ビルド環境(CIなど)は「大文字小文字を区別する」場合があります。

同じディレクトリ内で「Sprite.png」と「sprite.png」は、MacのFinder上では同一名とみなされやすく、片方しか見えない・上書きされたように見える振る舞いになります。ですがGitや一部のツールから見ると別ファイルとして扱われ、齟齬が発生します。

前提

  • SpriteAtlasのパッキング対象をディレクトリで指定している
  • SpriteAtlasからGetSpriteによるファイル名指定でSpriteを取得しようとしている
  • 開発機もビルドマシンもMac
  • Gitは大文字小文字を区別する設定(core.ignorecase = false)

問題が起こる流れ(再現手順)

    1. 大文字のSpriteをインポート(例:A.png)
    2. 小文字にリネーム(例:a.png)
    3. Gitでは大文字のファイルが残ったまま小文字が新規追加として検出される

    1. これをコミットする (リネーム前後の2つのファイルがリポジトリに存在する状態になる)
    2. 再度大文字にリネームすると何も差分が表示されない
    3. このままプッシュしビルドする
    4. SpriteAtlasからGetSpriteでファイル名指定で取得すると読み込めないことがある

なぜ起きるのか:根本原因

  • 大小文字を区別しないFS上では、リネーム(大→小、または小→大)をしても何も変わっていない扱いになる
  • Gitは区別する設定のため、同一ディレクトリに大文字・小文字違いの2ファイルが並存してしまう
  • ビルドマシンがMacだとどちらかのファイルしか認識されず、ビルド時にいずれかのSpriteAtlas1つだけが含まれる

安全な対処法

  1. 作業ブランチで、対象ディレクトリに大文字/小文字差分の重複がないか確認
  2. 完全に別名へリネーム(例:sprite.png → hero_idle.png)
  3. GetSpriteでリネーム後のファイル名を指定する
  4. ビルドして、対象のSpriteAtlasから期待したSpriteが取得できることを確認

補足:Gitで「大⇄小」だけを正しくコミットするには

どうしても大文字・小文字だけを変えたい場合は、ツーステップ改名(中間名を挟む)でGitに差分を明確化します。

  1. 一時名へ変更(Sprite.png → sprite_tmp.png)をコミット
  2. 最終名へ変更(sprite_tmp.png → sprite.png)をコミット

ただしこの場合はビルドマシン上でファイルが削除されてしまうことがあるため注意が必要です。

▼ビルドマシン上でファイルが削除される流れ

  1. 修正後ブランチでは小文字のファイルのみ
  2. 修正前ブランチをチェックアウトすると大文字のファイルに戻る
  3. 再度修正後ブランチに切り替えると小文字のファイルが削除された差分が出てくる
  4. そのままビルドすると大文字も小文字も存在しない状態になる

そのためこの場合はブランチ切り替え時に差分を確実に破棄する必要があります。

まとめ

Macはファイル名の大小文字を区別しないため、UnityプロジェクトではGitやビルド環境との整合性が崩れやすいポイントです。SpriteAtlasに意図しないアセットが入る、あるいは読み込めなくなるといった不具合は、大小文字差だけのリネームを避け、完全に別名へ変更することで安定して回避できます。

関連記事

  1. 【JavaScript/TypeScript】forEachは非同期!…

  2. Android15(APIレベル35)への対応が本当にできたのか不安な…

  3. Unityでメモリ位置を表示するツール -その2-

  4. 【Terraform/Redash】1から始めるTerraformによ…

  5. Unityでメモリ位置を表示するツール

  6. GitHub Actionsで1つしかキューされない挙動について

サービスサイト