GitHub ActionsのLinux環境でAssetDatabase処理を入れるとエラーになる【Unity】【GitHubActions】

はじめに

ゲームジャムに参加している中で GitHub Actions上でのCD環境を構築していました。あるときからビルドが失敗するようになってしまったので、調査していると環境でのエラーに遭遇したのでメモしておきます。

環境

  • Unity 2021.3.14f1

CD環境の環境ファイル

name: Build

env:
  UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }}

# Controls when the action will run. 
on: 
  workflow_dispatch: {}
  push:
    branches:
      - main
    paths-ignore:
      - '.github/**'
  # Triggers the workflow on push or pull request events but only for the main branch

# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
  build:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        projectPath:
          - .
        unityVersion:
          - 2021.3.14f1
        targetPlatform:
         - WebGL
    steps:
    - name: Checkout
      uses: actions/checkout@v2
      with:
        lfs: true
        clean: false
        
#     Cache
    - uses: actions/cache@v2
      with:
        path: Library
        key: Library

    # Build
    - name: Build project
      uses: game-ci/unity-builder@v2.0.4
      with:
        unityVersion: ${{ matrix.unityVersion }}
        targetPlatform: ${{ matrix.targetPlatform }}
        
    - name: Deploy to GitHub Pages
      uses: JamesIves/github-pages-deploy-action@v4.4.0
      with:
        branch: gh-pages
        folder: build
  

    # Output
    - uses: actions/upload-artifact@v2
      with:
        name: Build-${{ matrix.targetPlatform }}
        path: build/${{ matrix.targetPlatform }}

現象

GitHub Actions(Linux)上でビルドするとエラーになって止まってしまう。

以下は Github actions上のエラーの一部です。

Serialized binary data for shader Hidden/Universal Render Pipeline/StencilDeferred in 0.00s
    gles3 (total internal programs: 0, unique: 0)
Shader warning in 'Hidden/Universal Render Pipeline/StencilDeferred': Hidden/Universal Render Pipeline/StencilDeferred shader is not supported on this GPU (none of subshaders/fallbacks are suitable)
Compiling shader "Hidden/Universal Render Pipeline/LutBuilderHdr" pass "LutBuilderHdr" (vp)
    3 / 3 variants left after stripping, processed in 0.00 seconds
    starting compilation...
    finished in 0.00 seconds. Local cache hits 3 (0.00s CPU time), remote cache hits 0 (0.00s CPU time), compiled 0 variants (0.00s CPU time), skipped 0 variants
    Prepared data for serialisation in 0.00s
Serialized binary data for shader Hidden/Universal Render Pipeline/LutBuilderHdr in 0.00s
    gles3 (total internal programs: 3, unique: 3)
Compiling shader "TextMeshPro/Sprite" pass "Default" (vp)
    4 / 4 variants left after stripping, processed in 0.00 seconds
    starting compilation...
    finished in 0.00 seconds. Local cache hits 4 (0.00s CPU time), remote cache hits 0 (0.00s CPU time), compiled 0 variants (0.00s CPU time), skipped 0 variants
    Prepared data for serialisation in 0.00s
Serialized binary data for shader TextMeshPro/Sprite in 0.00s
    gles3 (total internal programs: 4, unique: 4)
Asset has disappeared while building player to 'sharedassets0.assets' - path '', instancedID '15416'
UnityEngine.StackTraceUtility:ExtractStackTrace () (at /home/bokken/build/output/unity/unity/Runtime/Export/Scripting/StackTrace.cs:37)
UnityEditor.BuildPipeline:BuildPlayerInternal (string[],string,string,UnityEditor.BuildTargetGroup,UnityEditor.BuildTarget,int,UnityEditor.BuildOptions,string[]) (at /home/bokken/build/output/unity/unity/Editor/Mono/BuildPipeline.bindings.cs:449)
UnityEditor.BuildPipeline:BuildPlayer (string[],string,string,UnityEditor.BuildTargetGroup,UnityEditor.BuildTarget,int,UnityEditor.BuildOptions,string[]) (at /home/bokken/build/output/unity/unity/Editor/Mono/BuildPipeline.bindings.cs:348)
UnityEditor.BuildPipeline:BuildPlayer (UnityEditor.BuildPlayerOptions) (at /home/bokken/build/output/unity/unity/Editor/Mono/BuildPipeline.bindings.cs:322)
UnityBuilderAction.Builder:BuildProject () (at Assets/Editor/Editor/UnityBuilderAction/Builder.cs:71)

原因と解決方法

いろいろ試している中で、以下の部分を変更することでビルドが通るようになりました。

            var instance = ScriptableObject.CreateInstance<GameParameterData>();
            instance.isDevelop = true;
            AssetDatabase.CreateAsset(instance, $"Assets/_Project/Scripts/GameParameter/GameParameter.asset");
            AssetDatabase.Refresh();

上記のコードを #if UNITY_EDITOR_WIN で囲むことによって、ローカルビルドの際のみ実行するようにしました。

#if UNITY_EDITOR_WIN
            var instance = ScriptableObject.CreateInstance<GameParameterData>();
            instance.isDevelop = true;
            AssetDatabase.CreateAsset(instance, $"Assets/_Project/Scripts/GameParameter/GameParameter.asset");
            AssetDatabase.Refresh();
#endif