Unityでプレイアブル広告を作る方法【Luna Playable Plugin】

こちらはUnityのアドベントカレンダー2023の5日目の記事です。


今回は日本でUnityを使ったプレイアブル広告の作り方を解説している記事をあまり見かけなかったため紹介したいと思います。

本記事で紹介するプラグインにめちゃくちゃ詳しいという訳ではないので、間違いなどがありましたらコメント欄でご指摘を頂けると助かります。


# 自己紹介
[株式会社Gaudiy](https://gaudiy.com/)でゲームやメタバースの開発をしている [くりやま](https://github.com/KazukiKuriyama) と申します。個人でゲーム・XR・メタバースなどの受託開発や技術支援・コンサルなどもやっています。

https://gaudiy.com/

# はじめに
プレイアブル広告というものをご存知でしょうか？
SNSを触っているとゲームがプレイできる広告を見かけることがあると思いますが、それがプレイアブル広告となります。
また、方言として `プレイアブルアド` として表現される場合もあったりします。

https://hcg.iti-inc.co.jp/playableads/


私が過去に見たことがあるプレイアブル広告は以下のようなものです。
- 同じ数字を繋げて数字を増やすパズルゲーム
- ハンバーガーショップでお客さんにハンバーガーを渡すゲーム
- 町中にできた穴を操作し、オブジェクトを吸い込むゲーム
- インベーダーゲームっぽいシューティングゲーム
- 弓でモンスターを倒すアクションゲーム
- マッチ３パズル
など沢山あります。

以下のYouTube動画で紹介されていますので、イメージがわかない方はこちらから確認してみてください。

https://youtu.be/9ycHZq2nkDk?si=1AF1ThIulxhYzqz1


国内のアプリの広告はまだまだ少ないようですので、会社・個人などでアプリをリリースされている方は本記事をきっかけに是非挑戦してみてください。

# Unityでプレイアブル広告を作る方法
Unityでは `Playable Plugin` というプラグインでプレイアブル広告を開発することができます。

https://docs.lunalabs.io/docs/playable/overview

このツールを提供しているルートが若干複雑ですが、一応Unityの公式ツールと思われます。
関係する各社の概要と関係はこのようになっています。

* Luna社
    * Playable Pluginを開発した企業
    * 2021年にironSource社に買収された
    * 現在もPlayable PluginのページにLuna FROM UNITYという商標？ロゴ？として名前が残っている
* ironSource社
    * モバイルアプリのマネタイズ及びマーケティングプラットフォーム
    * （本記事とは関係ないが）Unityに実装可能な広告用のSDKを開発している
    * 2021年にLuna社を買収した
    * 2022年にUnity社に買収された
* Unity社
    * 2022年にironSource社を買収した


https://docs.lunalabs.io/


# Playable Pluginの概要
### デプロイ可能なプラットフォーム
Playable Pluginでは以下のプラットフォーム向けにデプロイすることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/c556dda7-af57-b4ec-8e87-9eb027508f87.png)

- AARKI
- AdColony
- Applovin
- Appreciate
- Display & Video 360
- Facebook
- Google Ads
- ironSource
- Liftoff
- Mintegral
- Moloco
- Remerge
- Tencent
- TikTok
- Unity Ads
- Vungle
- MRAID (generic build)

上記のほとんどが日本では見かけないプラットフォームなので、日本をターゲットとするなら `FaceBook,Google Ads,TicTok,UnityAds` のあたりにデプロイすることになりそうです。
（現状だと結構対応している広告プラットフォームが少ないので、日本でプレイアブル広告が流行っていない原因はこのあたりにある？？）

https://docs.lunalabs.io/docs/playable/ad-networks/overview

### アプリの制約
筆者はWebGLビルドで開発した際に制約が多く感じたが、本プラグインではWebGLとは比較にならない程制約が多く、開発着手には一定の覚悟とUnity以外での開発を検討をする判断力が必要と感じました。
また、これらの制約を理由に広告とゲーム本体を同じプロジェクトで作成するのは非常にハードルが高いです。

それらの制約の内のいくつかを紹介したいと思います。

#### HTML5出力として開発する
本プラグインでビルドするとC#からJavaScriptへのトランスパイルが実行され、index.htmlファイルが出力されます。
これはWebGL開発時相当の制約を受けることになり、マルチスレッドが使えなかったり、Unityの様々な基本機能が制約を受けることを意味します。
過去に書いたWebGLの制約に関する記事はこちらです。

https://qiita.com/kazuki_kuriyama/items/3155606bb6cb5861ce68

また、多くの広告プラットフォームではSingle HTML file（単一のHTMLファイル）が条件になっており、StreamingAssetsなどの外部のファイルを配置することもできません。
基本的にネットワーク機能も制限されていますので、ビルドファイルに含まれないファイルは一切使えないと考えた方が良いです。

#### 出力ファイルサイズの制限
出力ファイルサイズの制限についてはプラットフォームによって異なり、以下の通りです。

<table>
  <caption>容量制限一覧</caption>
  <thead>
    <tr>
      <th>広告プラットフォーム</th> <th>制限</th>
    </tr>
  </thead>
  <tr>
    <td> Facebook </td> <td>2 MB HTML / 5 MB Zip	Single HTML or Zip with resources</td>
  </tr>
  <tr>
    <td> Google Ads </td> <td>5 MB	Zipped HTML file</td>
  </tr>
  <tr>
    <td> TikTok </td> <td>3MB	Zip file with resources</td>
  </tr>
  <tr>
    <td> Unity Ads </td> <td>5MB	Single HTML file</td>
  </tr>
</table>

TikTokを視野に入れる場合の制限が厳しく圧縮後で3MB以内に収める必要があります。

### Unityのバージョン
現状で対応しているバージョンは下記の通りとなります。
尚、最新のLTSである2022.3でビルドしたところ、エラーが発生しアプリが起動しませんでした。
- 2020.3.16以降
- 2021.3 (LTS)

### Unity基本機能の制限
Unityの標準的な機能でも以下の機能は利用することはできないようです。
* URP,HDRP
* NavMesh
* Generic,Humanoidアニメーション

### SDKの制限
前述のファイルサイズの制限に対応するため、Playable Pluginを使ったビルド時には強力なコードストリッピングが発生します。その影響によりUniRx,UniTask,VContainerなどのUnityによるモダンな開発ができなくなります。
代替手段は下記となります。
- UniRx
    - 非対応
    - Action,Eventやdelegateなどを使ってイベント通知を行う
- UniTask
    - 非対応
    - Coroutineで非同期やDelay処理をする
    - async,awaitは使える
- DIコンテナ
    - VContainerは非対応
    - [Ver8.0.0.までの非DLLのZenjectなら利用可能(Extenjectは不明)](https://docs.lunalabs.io/docs/playable/code/unity-plugins/zenject)
        - VContainerよりサイズが大きいので注意が必要
    - 簡易的なDIコンテナを自前するでも良い
    - 容量制限的に複雑なプロジェクトは作れないのでDIコンテナを使わないという選択肢も考える
- [DOTWeen](https://docs.lunalabs.io/docs/playable/code/unity-plugins/dotween)
    - Free版のみ利用可能
    - GUI上でアニメーション設定したい場合は諦めてスクリプトを書く
- [TextMeshPro](https://docs.lunalabs.io/docs/playable/code/unity-plugins/tmp)
    - デフォルトだと制限されているので設定を変えれば利用可能
    - 利用可能なTMPのバージョンに制約があるので注意
    - フォントサイズが大きくならないように注意が必要
    - (Dynamicフォントを使ったらエラーになった)

### 広告のリンク先
本ツールのダッシュボードでアプリを管理する際にGoogle Play,またはApp StoreのアプリURLを入力することになり、この項目は入力必須欄となっています。
これはストアアプリに並べているアプリの広告のみしか開発できないことを意味しているため、他のアプリ配信プラットフォームやWeb（ゲームの）サイトへのリンクに対してのプレイアブル広告を開発できないことを意味しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/791a7292-38c7-cf89-25b2-399e1be0f688.png)
また、FaceBookなどのプラットフォーム側のプレイアブル広告投稿用のダッシュボードでも同様にメジャーなストアのURLしか貼れないようになっているケースもあるので、Unity以外でプレイアブル広告を開発した場合でも広告を出せない可能性があるので事前に確認が必要です。

### スクリプトの制限
デフォルトではC#7.0以降の機能を利用することができません。
ただし、[C# 8.0,C# 9.0の機能を開放するオプション](https://docs.lunalabs.io/docs/playable/code/luna-compiler-v2)も存在していますが対象バージョンでも使えない機能があったりします。開発チームに問い合わせたら`LUNAはC#8,9に完全には対応していない` との回答だった。 

C# 8.0,C# 9.0機能解放チェックボックス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/5dbe3c86-f0b1-d078-5af8-d4c4b636da4c.png)



また、C#の機能以外にも以下の通り、利用できないUnity用のAPIが複数存在します。
> Do you support all Unity APIs?
The Unity engine has a vast number of APIs, many of which are not required for playable ads (i.e. Editor scripts) or not feasible for use on the web (i.e. native features). Considering this, the Playable Plugin engine supports all of the major and most commonly used components and APIs for playable ads. Over time, we plan to support more and more of these.
すべての Unity API をサポートしていますか
Unity エンジンには膨大な数の API があり、その多くは再生可能な広告 (つまり、エディタ スクリプト) には必要ないか、Web での使用には適していません (つまり、ネイティブ機能)。これを考慮すると、プレイアブル プラグイン エンジンは、プレイアブル広告の主要で最も一般的に使用されるコンポーネントと API をすべてサポートしています。時間の経過とともに、これらをさらにサポートする予定です。

気づいた範囲で使えないor不安定な機能
* SelializeFieldの値が反映されない場合がある
    * オートプロパティのみだめっぽい。C#7.3の機能だから？
    * バッキングフィールドを使えば問題なく設定した値が反映されるので面倒だが毎回ちゃんと記述する必要あり
* OnTrigger*****2Dが検出できないことがある
    * 開発に問い合わせると3D用のAPI（2Dがついていないやつ）を使ってほしいとのこと


# 開発の流れ
前項の制限を理解した上で開発に着手する場合はこちらのページを参考にプレイアブル広告の作成をすることになりますので、詳細はリンク先をご確認ください。

https://docs.lunalabs.io/docs/playable/quickstart

https://docs.lunalabs.io/docs/playable/getting-started/step-by-step

本項目では簡単な流れを紹介します。

- Playable Pluginに対応したUnityバージョンのインストール
- MSBuild(VisualStudio)またはmono-mdkのインストール
- .net4.7のインストール
- Playable Pluginの[ダウンロード](https://playground.lunalabs.io/login?redirect_back=https%3A%2F%2Fplayground.lunalabs.io%2Fdownloads)
- Unityのツールバーの `Tool > Playable Plugin` で必要なオプションなどのプロジェクトを設定
- ビルド後に使えないUnity,C#機能が多いので、こまめにPluginメニューからビルドしながら開発
- ビルドファイルをPlayable Pluginのダッシュボードにアップロード
- 広告配信プラットフォーム用のビルドファイルをダウンロード
- 広告配信プラットフォームのダッシュボードよりプレイアブル広告をアップロードする


# 最後に
今回はUnityでプレイアブル広告を作成するプラグインの紹介でした。

Unityでプレイアブル広告を作成するには制約が非常に多いため、このプラグインを使ってUnityで開発するのか？Unityを利用せずにJavaScriptのゲーム用のライブラリで開発するのか？それともプレイアブル広告自体の開発を断念するのか？この記事の読者の判断の助けになれたら幸いです。