UnityのMetaファイルの管理を自動化する

AvatarPosted by

この記事は GRIPHONE Advent Calendar 2022 7日目の記事です。
クライアントエンジニアをしておりますKappaBullです。この記事では、UnityのMetaファイルの管理の自動化に関して書いていこうと思います。

Metaファイルとエディタ拡張

MetaとはUnityのファイル、フォルダ毎に生成される設定ファイルです。テクスチャ設定や、サウンドファイル設定、様々な設定が存在し、対象の名前.metaという名前で生成されます。

これらには基本的にエディタ拡張での自動設定が可能です。
テクスチャの例だと下記の様なエディタ拡張を書く事によりUnityでMetaファイルが生成、更新された際に設定を自動で追加する事ができます。

using System;
using UnityEditor;
using UnityEngine;

public class TextureSettingImporter : AssetPostprocessor
{
    void OnPreprocessTexture ()
    {
        var ti = assetImporter as TextureImporter;
        if (ti == null) return;
        
        //基本設定
        ti.textureType = TextureImporterType.Sprite;
        ti.mipmapEnabled = false;
        ti.maxTextureSize = 1024;

        //各プラットフォーム毎の基本設定
        ti.SetPlatformTextureSettings (new TextureImporterPlatformSettings
        {
            overridden = true,
            name = "Android",
            format = TextureImporterFormat.ETC2_RGB4,
            textureCompression = TextureImporterCompression.Compressed,
            resizeAlgorithm = TextureResizeAlgorithm.Mitchell
        });
        ti.SetPlatformTextureSettings (new TextureImporterPlatformSettings
        {
            overridden = true,
            name = "iPhone",
            format = TextureImporterFormat.ASTC_6x6,
            textureCompression = TextureImporterCompression.Compressed,
            resizeAlgorithm = TextureResizeAlgorithm.Mitchell
        });
    }
}

この様なエディタ拡張により詳細な設定に詳しくない作業者でも生成した時点でこのエディタ拡張が自動で設定を行う為、設定漏れによるヒューマンエラーを防ぐ事ができます。

これだけでMetaファイルの自動管理は充分なのか

これだけでも最低限のMetaファイルの管理としてとても良い機能です。
ですが、この設定はユーザーの意図したファイルとは別に生成される物です。Gitに不慣れな作業者や、画像のみを扱うUnityを利用しない様なデザイナーや作業者から見た場合どうでしょうか。
Metaとは自動で作成される自分の意図しないファイル…、Gitへコミットし忘れる事やUnityを開かずに画像のみを追加する様な場合には対応が行えません。
下記の様なバージョン管理外のMetaファイルが発生し、ファイルを生成した本人は自身が追加したファイルではないので放置される事が度々発生します。

ユーザー的に意図しないこの様な場合、CIを利用した解決が有効的です。
CIにてバージョン管理におけるバージョン管理外ファイルへのアプローチが行なえます。

CIでの解決

昨今はGithubでバージョン管理が行われる事が多い為、GithubActionsでの解決策を1つ紹介します。

https://github.com/KappaBull/UnityTemplate/blob/master/.github/workflows/EditorAutoPush.yml

name: EditorAutoPush

on:
  push:
    paths:
      - 'Assets/**'
      - 'Packages/**'
      - 'ProjectSettings/**'
      - ".github/workflows/EditorAutoPush.yml"

jobs:
  EditorAutoPush:
    runs-on: ubuntu-latest
    timeout-minutes: 30
    strategy:
      fail-fast: false
      matrix:
        platform: [StandaloneOSX, StandaloneWindows64, iOS, Android]
    steps:
      - uses: actions/checkout@v2
        with:
          lfs: true
          ref: ${{ github.head_ref }}
      - uses: actions/cache@v3
        with:
          path: Library
          key: Library-build-${{ matrix.targetPlatform }}-${{ hashFiles('Assets/**', 'Packages/**', 'ProjectSettings/**') }}
          restore-keys: |
            Library-build-${{ matrix.targetPlatform }}-
            Library-build-
      - uses: game-ci/unity-builder@v2
        env:
          UNITY_EMAIL: ${{ secrets.UNITY_EMAIL }} 
          UNITY_PASSWORD: ${{ secrets.UNITY_PASSWORD }} 
          UNITY_SERIAL: ${{ secrets.UNITY_SERIAL }}
        with:
          buildMethod: BuildCI.CompileErrorCheckCMD
          targetPlatform: ${{ matrix.platform }}
      - uses: stefanzweifel/git-auto-commit-action@v4
        id: autocommit
        with:
          commit_message: "[GithubActions] AutoUpdate"
        continue-on-error: true
      - name: "Run if Commited have been detected"
        if: steps.autocommit.outcome == 'failure'
        run: echo "Parallel Commited"

このGithubActionsの設定ではプッシュされた際にLinux上で4つのプラットフォームのUnityを並列起動してGit上での変更があればそのファイルをプッシュするという動作を行う様に設定しています。

      - uses: game-ci/unity-builder@v2
        env:
          UNITY_EMAIL: ${{ secrets.UNITY_EMAIL }} 
          UNITY_PASSWORD: ${{ secrets.UNITY_PASSWORD }} 
          UNITY_SERIAL: ${{ secrets.UNITY_SERIAL }}
        with:
          buildMethod: BuildCI.CompileErrorCheckCMD
          targetPlatform: ${{ matrix.platform }}

このUnityエディタを起動している際のBuildCI.CompileErrorCheckCMDというメソッドはDebug.Logで起動しているプラットフォームを表示するだけなのでTest等を書いてる方はそれを指定しても良いかもしれません。
GithubActionsではGameCIというCIでのUnity利用を簡易化するActionを利用して簡素的にUnityのCIを記述する事が出来るのでおすすめです。

これらの自動化により開発時の設定漏れを防ぐと共にGit上のファイルの正当性が保証される為、Unity起動時にしかプロジェクトの正当性が確保されない状況を無くす事が出来ます。

まとめ

今回紹介したMetaファイルの管理方法は1つのGithubActionsのYAMLファイルと呼び出す空のビルドメソッド1つから実践できます。
チーム開発で発生しがちな何故かプッシュされて居ないMetaファイルを見た事ががある人は是非1度試してみては如何でしょうか。

以上、クライアントエンジニアのKappaBullでした。
明日も他のエンジニアの方の記事が公開される予定です。明日のアドベントカレンダーもお楽しみに!