mcpField
U
unity-platforms

unity-platforms

github.com/nice-wolf-studio開発4067 回インストール6 週間前に更新
リポジトリ

unity-platforms について

Unity 開発者向けのマルチプラットフォーム開発リファレンススキルです。ビルドプロファイル、条件付きコンパイル、モバイルと WebGL の注意点、IL2CPP、Mono、Addressables を扱い、構成やビルド、性能の問題への対応に役立ちます。

主な機能

  1. 01Build Profiles とシーン設定
  2. 02プラットフォーム条件付きコンパイル定義
  3. 03iOS・Android の設定と最適化
  4. 04WebGL のメモリと JavaScript 連携
  5. 05IL2CPP と Mono の比較
  6. 06Addressables によるアセット読み込み

活用シーン

  1. 01プラットフォーム別ビルド設定の管理
  2. 02プラットフォーム固有コードや機能の追加
  3. 03モバイル・WebGL のアセットとメモリの最適化
  4. 04スクリプティングバックエンドの選択とアセット読み込み設定

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/nice-wolf-studio/unity-claude-skills --skill unity-platforms

インストール後、Claude Code で/unity-platformsを入力して読み込まれたか確認します。

同梱ファイルreferences/mobile-optimization.mdreferences/platform-defines.md

詳細

Unity プラットフォームスキル

対応プラットフォーム

Unity 6 は以下のプラットフォームカテゴリをサポートしています。

  • デスクトップ:Windows、macOS、Linux
  • モバイル:Android、iOS
  • 新興プラットフォーム:visionOS、tvOS
  • Web:WebGL(Facebook Instant Games を含む)
  • サーバー:専用サーバー
  • 組み込み:Embedded Linux、QNX
  • UWP:Universal Windows Platform
  • クローズドプラットフォーム:PlayStation、Xbox(Game Core)、Nintendo(機密保持および法的契約と、Platform Module Installation による登録が必要です)

ビルドプロファイルと設定

ビルドプロファイルは、従来の Build Settings ウィンドウに代わるものです。ビルドプロファイルは、特定のプラットフォーム向けにアプリケーションをビルドするための設定一式です。

2 種類のプロファイル
  1. プラットフォーム:現在インストールされているプラットフォームを、すべての構成で共有される設定とともに表示します。Development Build などのオプションを有効にすると、すべての構成に適用されます。プラットフォーム間では、プロファイルごとに同一のシーンデータが共有されます。
  2. ビルドプロファイル:プラットフォーム間で共有されない独立した構成です。それぞれに固有のシーンと設定を指定できます。バージョン管理に対応したアセットファイルとして保存されます。
主な機能
  • 複数のビルド構成を整理するためのカスタム名
  • バージョン管理との統合(プロファイルはアセットファイルとして保存)
  • プロファイルごとのシーン割り当て
  • 開発ビルド(デバッグシンボル、Profiler へのアクセス)とリリースビルド
  • File > Build Profiles からアクセス
  • プラットフォームを右クリックして「Copy to new profile」を選択し、複製
シーン管理

シーンはプロファイルごとに管理されます。ビルドにシーンを追加、除外、削除したり、順序を変更したりできます。それぞれの固有の Scene ファイルは、固有のレベルまたは画面を表します。

プラットフォームスクリプティング定義

#if ディレクティブを使って、プラットフォームごとにコードを条件付きでコンパイルします。

プラットフォーム定義
定義プラットフォーム
UNITY_EDITOR任意の Editor コード
UNITY_EDITOR_WINWindows Editor
UNITY_EDITOR_OSXmacOS Editor
UNITY_EDITOR_LINUXLinux Editor
UNITY_STANDALONE_OSXmacOS スタンドアロン
UNITY_STANDALONE_WINWindows スタンドアロン
UNITY_STANDALONE_LINUXLinux スタンドアロン
UNITY_STANDALONE任意のスタンドアロン(Win/Mac/Linux)
UNITY_SERVER専用サーバー
UNITY_IOSiOS
UNITY_ANDROIDAndroid
UNITY_TVOStvOS
UNITY_VISIONOSvisionOS
UNITY_WEBGLWebGL
UNITY_WSAUniversal Windows Platform
UNITY_WSA_10_0UWP 10.0
UNITY_EMBEDDED_LINUXEmbedded Linux
UNITY_QNXQNX
UNITY_FACEBOOK_INSTANT_GAMESFacebook Instant Games
機能およびバックエンドの定義
定義意味
UNITY_ANALYTICSAnalytics が有効
UNITY_ASSERTIONSアサーションが有効
UNITY_6464 ビットプラットフォーム
ENABLE_MONOMono スクリプティングバックエンド
ENABLE_IL2CPPIL2CPP スクリプティングバックエンド
ENABLE_VRVR サポートが有効
ENABLE_INPUT_SYSTEM新しい Input System が有効
ENABLE_LEGACY_INPUT_MANAGERLegacy Input Manager が有効
ENABLE_WINMD_SUPPORTWinMD サポート
DEVELOPMENT_BUILD開発ビルド
UNITY_CLOUD_BUILDCloud Build
.NET API レベル定義
定義API レベル
NET_STANDARD_2_0.NET Standard 2.0
NET_STANDARD_2_1.NET Standard 2.1
NET_STANDARD / NETSTANDARD任意の .NET Standard
NETSTANDARD2_1.NET Standard 2.1(C# の定義)
NET_4_6.NET Framework
NET_2_0 / NET_LEGACY.NET 2.0(レガシー)
CSHARP_7_3_OR_NEWERC# 7.3 以降が利用可能
バージョン定義

形式:UNITY_X、UNITY_X_Y、UNITY_X_Y_Z、UNITY_X_Y_OR_NEWER

Unity 6000.0.33 の例:

  • UNITY_6000、UNITY_6000_0、UNITY_6000_0_33、UNITY_6000_0_OR_NEWER

モバイルの最適化

iOS

アーキテクチャ:ARM64 のみです(ARMv7 は対象外です)。

スクリプティングバックエンド:iOS では IL2CPP が必須です(Mono は選択できません)。

プレイヤー設定(Edit > Project Settings > Player > iOS):

  • バンドル識別子:com.CompanyName.ProductName
  • 署名チーム ID と Xcode の自動署名
  • 最小ターゲット iOS バージョンを選択可能
  • デバッグ時のシェーダー問題には Metal API Validation を使用します
  • デフォルト以外の向きでのパフォーマンス向上には Metal Write-Only Backbuffer を使用します
  • Metal でハードシャドウを強制します(パフォーマンス向上のためポイントサンプリングを使用します)
  • 向き:縦向き、横向き、または許可する向きを指定した自動回転
  • 起動画面:デフォルト、画像、またはカスタムストーリーボード
  • ARKit サポートを必須にすると、iPhone 6s/iOS 11 以降に制限されます
Android

アーキテクチャ:ARMv7 および ARM64(ARM64 には IL2CPP が必要です)。

プレイヤー設定(Edit > Project Settings > Player > Android):

  • パッケージ名:com.YourCompanyName.YourProductName
  • 最小 API レベルとターゲット API レベル
  • グラフィックス API:自動(Vulkan を優先し、GLES にフォールバック)、Vulkan、または OpenGL ES 3.x
  • Google Play でのダウンロードサイズを小さくするには、ターゲットアーキテクチャごとに APK を分割します
  • 署名用のキーストア設定(本番環境ではカスタムキーストアを使用します)
  • スクリプティングバックエンド:Mono または IL2CPP
  • API 互換性:.NET Framework または .NET Standard 2.1
  • マネージドストリッピングレベル:最小から高まで

主な違い:Android のハードウェア性能はモデルによって大きく異なります。複数のデバイスでテストしてください。

モバイル向け最適化のヒント
  • ASTC テクスチャ圧縮を使用します(iOS と Android の最新デバイスでサポートされています)
  • バッチ処理(静的および動的)によってドローコールを最小限に抑えます
  • オンデマンドコンテンツには AssetBundles または Addressables を使用します
  • Unity Profiler とプラットフォーム固有のツールでプロファイリングします
  • モバイル GPU ではシェーダーの複雑さを抑えます

WebGL に関する考慮事項

メモリ管理
  • Unity のヒープは WebAssembly Memory(サイズ変更可能な ArrayBuffer)として実装されています
  • ヒープは最大 4 GB まで拡張できます(Player Settings の Maximum Memory Size)
  • アセットデータは .data ファイルから仮想メモリファイルシステム(Emscripten)に展開されます
  • ガベージコレクターは各フレームの最後にのみ実行されます(フレーム途中では回収されません)
  • 使用可能なメモリは、デバイス、OS、ブラウザー(32/64 ビット)、タブの分離モデルによって異なります
メモリ最適化

ループ内での文字列連結には、StringBuilder を使用します。

// BAD: Creates ~15 GB temporary allocations for 100k iterations
string hugeString = "";
for (int i = 0; i < 100000; i++)
    hugeString += "foo";

// GOOD: Pre-allocated StringBuilder
var sb = new StringBuilder();
for (int i = 0; i < 10000; i++)
    sb.Append("foo");

GC を回避する一時的な割り当てには、NativeArray<T> を使用します。

using (var data = new NativeArray<byte>(size, Allocator.Temp))
{
    // Memory freed immediately upon scope exit
}

アセットの読み込みには AssetBundles を使用します(追加のブラウザー割り当てなしで、Unity のヒープに直接ダウンロードされます)。

再ダウンロードを減らすには、Data Caching(IndexedDB/Caching API)を有効にします。

JavaScript 相互運用

Unity は 2 種類の JavaScript プラグインファイルをサポートしています。

  • .jslib:C# コードから呼び出せる関数を定義します
  • .jspre:既存の JavaScript ライブラリを含めます

制限事項:.jslib ファイルと .jspre ファイルでサポートされる構文は ECMAScript 5(ES5)のみです。ES6 はまだサポートされていません。

.jslib プラグインの例
// Assets/Plugins/WebGL/MyPlugin.jslib
mergeInto(LibraryManager.library, {
    ShowAlert: function (message) {
        window.alert(UTF8ToString(message));
    },
});
C# から JavaScript を呼び出す
using System.Runtime.InteropServices;
using UnityEngine;

public class WebGLBridge : MonoBehaviour
{
    [DllImport("__Internal")]
    private static extern void ShowAlert(string message);

    void Start()
    {
        #if UNITY_WEBGL && !UNITY_EDITOR
        ShowAlert("Hello from Unity!");
        #endif
    }
}

IL2CPP と Mono の比較

IL2CPP(中間言語からC++へ)

IL2CPPは、C#をC++経由でネイティブコードに変換するUnity独自のAOTスクリプティングバックエンドです。

変換パイプライン:

  1. RoslynコンパイラーがC#を.NETマネージアセンブリ(DLL)に変換します
  2. マネージコードのストリッピングによってアプリケーションのサイズを削減します
  3. すべてのマネージアセンブリを標準的なC++コードに変換します
  4. C++コンパイラーがプラットフォーム固有のマシンコードを生成します
  5. 実行ファイル、DLL、APK/AAB、またはアプリバンドルを作成します

利点:

  • Monoと比べてランタイムパフォーマンスが向上します
  • アプリケーションの起動時間が短縮されます
  • すべてのプラットフォームでサポートされています
  • Monoと同様にマネージコードのデバッグをサポートします

欠点:

  • Monoと比べてビルド時間が大幅に長くなります
  • 最終的なアプリケーションサイズが大きくなります
  • 通常、クロスコンパイルはサポートされていません(ターゲットOS上でビルドする必要があります)
  • 例外:Linux向けのクロスコンパイルは、任意のデスクトッププラットフォームからサポートされています

設定:

  • Player Settings:Edit > Project Settings > Player > Configuration > Scripting Backend
  • スクリプティング API:PlayerSettings.SetScriptingBackend

ビルド速度の最適化:

  • プロジェクトのフォルダーをマルウェア対策スキャンの対象から除外します
  • 利用可能な中で最速のストレージドライブを使用します
  • 「Optimize for code size and build time」を選択します(ランタイムパフォーマンスとのトレードオフがあります)
  • 互換性のあるコードではIL2CPPと併せてBurstコンパイラーを使用します
Mono
  • ビルド時間が短くなります(JITコンパイル)
  • ビルドの出力サイズが小さくなります
  • すべてのプラットフォームで利用できるわけではありません(iOSではIL2CPPが必須です)
  • ランタイムパフォーマンスはIL2CPPより低くなります
選択の目安
基準IL2CPPMono
iOSビルド必須利用不可
AndroidビルドARM64では推奨ARMv7で利用可能
ビルドの反復速度遅い速い
ランタイムパフォーマンス高い良好
コンソールプラットフォーム必須利用不可
WebGL必須利用不可

Addressablesの概要

Addressable Asset System(com.unity.addressables v2.9.1)を使用すると、直接パスではなくアドレスでアセットを参照できます。

主な概念
  • 任意のアセットを「addressable」としてマークすると、どこからでも呼び出せる一意のアドレスが生成されます
  • ローカルまたはリモートの場所からの読み込みをサポートします
  • 自動的な依存関係の解決を伴う非同期読み込みを使用します
  • 直接参照、従来のアセットバンドル、Resourcesフォルダーを置き換えます
  • アクセス先:Window > Asset Management > Addressables
基本的な使用パターン
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;

public class AddressableLoader : MonoBehaviour
{
    [SerializeField] private AssetReference prefabRef;

    async void Start()
    {
        AsyncOperationHandle<GameObject> handle =
            Addressables.InstantiateAsync(prefabRef);
        await handle.Task;

        if (handle.Status == AsyncOperationStatus.Succeeded)
        {
            Debug.Log("Asset loaded successfully");
        }
    }

    void OnDestroy()
    {
        // Always release when done
        prefabRef.ReleaseAsset();
    }
}

よく使われるパターン

プラットフォーム固有のコード
public class PlatformManager : MonoBehaviour
{
    void Start()
    {
        #if UNITY_IOS
        Application.targetFrameRate = 60;
        #elif UNITY_ANDROID
        Application.targetFrameRate = 60;
        Screen.sleepTimeout = SleepTimeout.NeverSleep;
        #elif UNITY_WEBGL
        // WebGL runs at browser refresh rate
        #elif UNITY_STANDALONE
        Application.targetFrameRate = -1; // Uncapped
        #endif
    }
}
ランタイムのプラットフォームチェック
void ConfigureForPlatform()
{
    switch (Application.platform)
    {
        case RuntimePlatform.IPhonePlayer:
            SetupMobileControls();
            break;
        case RuntimePlatform.Android:
            SetupMobileControls();
            break;
        case RuntimePlatform.WebGLPlayer:
            SetupWebControls();
            break;
        default:
            SetupDesktopControls();
            break;
    }
}
ビルドプロファイルのスクリプティング
#if DEVELOPMENT_BUILD
    Debug.Log("Development build active");
#endif

#if ENABLE_IL2CPP
    // IL2CPP-specific code
#elif ENABLE_MONO
    // Mono-specific code
#endif

アンチパターン

  1. Addressablesの代わりに、あらゆる用途でResourcesフォルダーを使用する。Resourcesフォルダーは起動時にすべてのアセットを読み込むため、メモリ使用量と読み込み時間が増加します。

  2. プラットフォーム定義を使用せず、ランタイムチェックだけに頼る。コンパイル時定義を使うと、未使用のコードをビルドから完全に除外できます。

  3. WebGLのループ内で文字列を連結する。WebGLではGCはフレームの終了時にしか実行されないため、大量の一時的な割り当てが発生します。StringBuilderまたはNativeArray<T>を使用してください。

  4. IL2CPPのAOT制限を無視する。リフレクションを多用するコード、System.Reflection.Emit、ランタイムコード生成は、IL2CPPでは失敗します。AOTを考慮して設計してください。

  5. Development Buildを有効にしたまま出荷する。DevelopmentビルドにはProfilerのオーバーヘッドとデバッグシンボルが含まれるため、サイズが増加し、パフォーマンスが低下します。

  6. AndroidでAPKをアーキテクチャ別に分割しない。ARMv7とARM64の両方を含む単一の巨大なAPKを出荷すると、ユーザーの帯域幅が無駄になります。Split APKまたはApp Bundleを使用してください。

  7. プラットフォームのパスをハードコードする。クロスプラットフォームでファイルにアクセスするには、Application.persistentDataPath、Application.streamingAssetsPath、Application.temporaryCachePathを使用してください。

  8. 実機でテストしない。Androidのハードウェアは非常に多様です。エミュレーターやシミュレーターでは、実際のパフォーマンス特性を再現できません。

API クイックリファレンス

API目的
Application.platform実行時のプラットフォームを検出します
RuntimePlatform enum実行時チェック用のプラットフォーム定数
SystemInfo.graphicsDeviceType現在のグラフィックス API(Vulkan、Metal など)
SystemInfo.supportsComputeShadersコンピュートシェーダーのサポートを確認します
PlayerSettings.SetScriptingBackend()スクリプトで IL2CPP または Mono を設定します
Addressables.InstantiateAsync()アドレサブルアセットを読み込み、インスタンス化します
Addressables.LoadAssetAsync<T>()インスタンス化せずにアドレサブルアセットを読み込みます
AssetReferenceアドレサブルアセットへのシリアライズ可能な参照
Application.targetFrameRate目標フレームレートを設定します
Screen.sleepTimeoutモバイルで画面が暗くなるのを防ぎます
Application.persistentDataPathプラットフォームに依存しない書き込み可能なデータパス

関連スキル

  • unity-graphics — レンダリングパイプライン、シェーダー、ビジュアルエフェクト
  • unity-packages-services — Package Manager のワークフローと Unity Gaming Services

追加リソース

コメント