この記事は 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でした。
明日も他のエンジニアの方の記事が公開される予定です。明日のアドベントカレンダーもお楽しみに!