unity-platforms について
Unity 開発者向けのマルチプラットフォーム開発リファレンススキルです。ビルドプロファイル、条件付きコンパイル、モバイルと WebGL の注意点、IL2CPP、Mono、Addressables を扱い、構成やビルド、性能の問題への対応に役立ちます。
主な機能
- 01Build Profiles とシーン設定
- 02プラットフォーム条件付きコンパイル定義
- 03iOS・Android の設定と最適化
- 04WebGL のメモリと JavaScript 連携
- 05IL2CPP と Mono の比較
- 06Addressables によるアセット読み込み
活用シーン
- 01プラットフォーム別ビルド設定の管理
- 02プラットフォーム固有コードや機能の追加
- 03モバイル・WebGL のアセットとメモリの最適化
- 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 種類のプロファイル
- プラットフォーム:現在インストールされているプラットフォームを、すべての構成で共有される設定とともに表示します。Development Build などのオプションを有効にすると、すべての構成に適用されます。プラットフォーム間では、プロファイルごとに同一のシーンデータが共有されます。
- ビルドプロファイル:プラットフォーム間で共有されない独立した構成です。それぞれに固有のシーンと設定を指定できます。バージョン管理に対応したアセットファイルとして保存されます。
主な機能
- 複数のビルド構成を整理するためのカスタム名
- バージョン管理との統合(プロファイルはアセットファイルとして保存)
- プロファイルごとのシーン割り当て
- 開発ビルド(デバッグシンボル、Profiler へのアクセス)とリリースビルド
- File > Build Profiles からアクセス
- プラットフォームを右クリックして「Copy to new profile」を選択し、複製
シーン管理
シーンはプロファイルごとに管理されます。ビルドにシーンを追加、除外、削除したり、順序を変更したりできます。それぞれの固有の Scene ファイルは、固有のレベルまたは画面を表します。
プラットフォームスクリプティング定義
#if ディレクティブを使って、プラットフォームごとにコードを条件付きでコンパイルします。
プラットフォーム定義
| 定義 | プラットフォーム |
|---|---|
UNITY_EDITOR | 任意の Editor コード |
UNITY_EDITOR_WIN | Windows Editor |
UNITY_EDITOR_OSX | macOS Editor |
UNITY_EDITOR_LINUX | Linux Editor |
UNITY_STANDALONE_OSX | macOS スタンドアロン |
UNITY_STANDALONE_WIN | Windows スタンドアロン |
UNITY_STANDALONE_LINUX | Linux スタンドアロン |
UNITY_STANDALONE | 任意のスタンドアロン(Win/Mac/Linux) |
UNITY_SERVER | 専用サーバー |
UNITY_IOS | iOS |
UNITY_ANDROID | Android |
UNITY_TVOS | tvOS |
UNITY_VISIONOS | visionOS |
UNITY_WEBGL | WebGL |
UNITY_WSA | Universal Windows Platform |
UNITY_WSA_10_0 | UWP 10.0 |
UNITY_EMBEDDED_LINUX | Embedded Linux |
UNITY_QNX | QNX |
UNITY_FACEBOOK_INSTANT_GAMES | Facebook Instant Games |
機能およびバックエンドの定義
| 定義 | 意味 |
|---|---|
UNITY_ANALYTICS | Analytics が有効 |
UNITY_ASSERTIONS | アサーションが有効 |
UNITY_64 | 64 ビットプラットフォーム |
ENABLE_MONO | Mono スクリプティングバックエンド |
ENABLE_IL2CPP | IL2CPP スクリプティングバックエンド |
ENABLE_VR | VR サポートが有効 |
ENABLE_INPUT_SYSTEM | 新しい Input System が有効 |
ENABLE_LEGACY_INPUT_MANAGER | Legacy Input Manager が有効 |
ENABLE_WINMD_SUPPORT | WinMD サポート |
DEVELOPMENT_BUILD | 開発ビルド |
UNITY_CLOUD_BUILD | Cloud 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_NEWER | C# 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スクリプティングバックエンドです。
変換パイプライン:
- RoslynコンパイラーがC#を.NETマネージアセンブリ(DLL)に変換します
- マネージコードのストリッピングによってアプリケーションのサイズを削減します
- すべてのマネージアセンブリを標準的なC++コードに変換します
- C++コンパイラーがプラットフォーム固有のマシンコードを生成します
- 実行ファイル、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より低くなります
選択の目安
| 基準 | IL2CPP | Mono |
|---|---|---|
| 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
アンチパターン
-
Addressablesの代わりに、あらゆる用途でResourcesフォルダーを使用する。Resourcesフォルダーは起動時にすべてのアセットを読み込むため、メモリ使用量と読み込み時間が増加します。
-
プラットフォーム定義を使用せず、ランタイムチェックだけに頼る。コンパイル時定義を使うと、未使用のコードをビルドから完全に除外できます。
-
WebGLのループ内で文字列を連結する。WebGLではGCはフレームの終了時にしか実行されないため、大量の一時的な割り当てが発生します。
StringBuilderまたはNativeArray<T>を使用してください。 -
IL2CPPのAOT制限を無視する。リフレクションを多用するコード、
System.Reflection.Emit、ランタイムコード生成は、IL2CPPでは失敗します。AOTを考慮して設計してください。 -
Development Buildを有効にしたまま出荷する。DevelopmentビルドにはProfilerのオーバーヘッドとデバッグシンボルが含まれるため、サイズが増加し、パフォーマンスが低下します。
-
AndroidでAPKをアーキテクチャ別に分割しない。ARMv7とARM64の両方を含む単一の巨大なAPKを出荷すると、ユーザーの帯域幅が無駄になります。Split APKまたはApp Bundleを使用してください。
-
プラットフォームのパスをハードコードする。クロスプラットフォームでファイルにアクセスするには、
Application.persistentDataPath、Application.streamingAssetsPath、Application.temporaryCachePathを使用してください。 -
実機でテストしない。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