unityでいってみよう!

unityがチョットワカル位の人のブログ

Apple's privacy manifestまとめ 2024年3月11日版

目次

 

UnityEngine Coreライブラリには署名が必要が無い

 

3月8日(金)のUnity Forumの投稿によると、Appleとの話し合いの結果、UnityEngine Coreライブラリは署名する必要がなくなったようです。

 

forum.unity.com

これは「Apple's privacy manifestまとめ 2024年2月5日版」の記事で記載したUnityによるApple private manifest対応の第3フェイズが無くなったことを意味すると思われます。

unityletsgo.hatenablog.com

 

Apple's privacy manifestのマイルストーン

 

またAppleもこれまで春とだけ述べていた期日に対して、具体的な日時を提出してきました。

developer.apple.com

 

- 3月13日以降

承認された理由を必要とするAPIを使用している新規もしくは更新されたアプリケーションをAppStoreConectにアップロードすると、アプリのプライバシーマニフェストに理由が欠落しているかどうかを通知するメールが送信されるようになる。(既存のApp Store Conectからの通知に含まれる)

 

- 5月1日以降

新規もしくは更新したアプリをApp Store Connectにアップロードする際に、承認された理由を必要とするAPIがアプリ内に含まれている場合、承認された理由を含める必要がある。

 

いわゆるソフトローンチというもので、いきなり執行されるのではなく、1ケ月半位の猶予があるのでその間にAppStoreConnectへアップロードして自身のアプリが問題なく対応できているかを確認することが出来ます。

 

Unityのアップグレード

フォーラムの記載によるとApple's privacy manifestへ対応しているUnity バージョン は2021.3.36f1、2022.3.21f1、2023.2.13f1 以降となっていますのでご注意下さい。

 

Vulkan validation layersを有効にしてみよう!

概要

Vulkan validation layersは、VulkanのAPI呼び出しを検証し、開発者がアプリケーションをデバッグし、正常に動作させるためのツールです。VulkanのAPIが適切に使用されていることを検証し、間違ったAPIの使い方をしているときに警告やエラーメッセージを提供してくれます。

UnityとVulkan validation layersの連携

UnityでビルドしたアプリケーションがVulkan validation layersの機能を利用できる件についてはUnity Forumsで言及があります。

forum.unity.com

UnityでVulkan validation layersを有効にする具体的な手順

Androidプラットフォームでの例は以下の通りです

  1. 以下のGithubリポジトリからバイナリファイルを取得します。 github.com
  2. プロジェクトのAssets/Plugin/Android以下に1で取得したバイナリを展開します。 展開後は以下の様に表示されている筈です。
  3. Development Buildを有効にした状態でビルドを行い、端末へ転送します。
  4. ビルドしたアプリケーションの引数に"-force-vulkan-layers"を指定して実行します。
  5. Logcatに以下の表示がされていればVulkan validaton layersが有効になっていることを示しています。
Debug Unity [Vulkan init] layer enabled: VK_LAYER_KHRONOS_validation

Androidアプリケーションに引数を指定する

UnityPlayerActivityを拡張してコマンドライン引数を指定する

Unityのマニュアルに方法が記載されています。

docs.unity3d.com

一度設定すれば良いので何度も試す場合はこちらの方が楽かもしれません。

adb shellから指定する

adb shell am start -n "{Package Name}/com.unity3d.player.UnityPlayerActivity" -e unity -force-vulkan-layers

{Package Name}の部分にはPlayer Settings > Identification > Package Nameで表示されている文字列を指定します。 例えば、"XXX.YYY.ZZZ"であれば以下のようになります。

adb shell am start -n "XXX.YYY.ZZZ/com.unity3d.player.UnityPlayerActivity" -e unity -force-vulkan-layers

以上です。

Unity6ベータ版の新機能を分かった気になってみよう!

目的

UnityForumのUnity 6 beta (2023.3) - Feature HighlightsでUnity6の新機能が紹介されています。色々機能が増えて理解が追い付きませんが、とりあえず誰かに聞かれても「あーあれね」と知ってるふりがとりあえず出来る浅い知識の獲得を目指します。

 

新機能

GPU Resident Drawer

GPU Driven Renderingの機能名。

GPU Driven Renderingはざっくり説明するとGPUからCPUへの手戻りが発生しないようにメモリレイアウトなんかも工夫した描画方法位の認識大丈夫です。

「CPUよりもGPUの方が並列処理が得意でしょ」みたいな感じ。

GPU Occlusion Culling

これまでCPU側で行っていた可視衰退化リングをGPU側で実行します。正にGPU Regident Drawerのおかげ。

Spatial-Temporal Post-Processing (STP)

低解像度でレンダリングされたフレームをアップスケーリングすることでパフォーマンスを向上させる機能です。Editor内やドキュメントではScalable Temporal Post-Processingと記載されています。

Render graph-URP

Render GraphがURPに対応しました。その結果、URPのAPIがまた変更になりました・・・。

 

Foveated rendering for VR platforms - URP

画面中央・若しくはアイトラッキングを利用して特定の領域のみ解像度を上げる技術です。

Foveated = 中心窩≒中心視野?

なので、視点のエリアのみ解像度を上げてそれ以外の部分は低解像度でレンダリングをすることでパフォーマンスの向上が期待できます。

www.tobii.com

Volume framework enhancements with Custom Post Processing

URPでCustom Post Processingを用いてカスタムフォグが実現できるようになりました。

 

More enhancements to Adaptive Probe Volumes

洋ゲーのオープンフィールド物にありがちな、時間経過で朝から夜の表現がUnityの機能として実現できるようになりました。

 

HDRP dynamic worlds

空気感(大気)の表現を行う技術。HDRP限定。

「このオゾン層による空気感がいいよね」みたいな感じで使います。

Quality of Life improvements to the Unity build window, plus all new build profiles

Debug用、Relese用などで設定を切り替えてビルドすることが可能。

これまでビルドスクリプトを作成して設定を切り替えていたのが夢のよう。

Incremental build pipeline available on all supported consoles

差分ビルドが高速に!Unity2021と比較するとBoatAttackプロジェクトの差分ビルドが50%に短縮!

Unlocking more mobile gaming

Android/iOSブラウザーでもUnityWebが動作可能に!

Early access to the WebGPU backend

Web向けの描画がWebGLからWebGPUへ

Unity Editor support for Arm-based Windows devices

Arm-baseのWindows向けのUnityEditorが登場!

UnityPlayerは2023.1の時点で既に対応済みです。

DirectX12

Windowsプラットフォーム向けGraphicsAPIにDirectX12が選択可能

Apple's privacy manifestまとめ 2024年2月5日版

概要と免責

Apple's privacy manifestはWWDC23において発表された新しいガイドラインです。

2024年春からこのガイドラインが適用され、このガイドラインを満たさない場合、AppStoreへのサブミットがリジェクトされる可能性がありますが、現状は情報が出揃っていないように見えます。

今回AppleやUnityから公開されている情報をまとめました。

現時点ではガイドラインが実施されておらずどのようにも解釈できる内容ドキュメントであったりすることから、ここに記載されている内容が不正確な可能性があります。ここに記載されている内容はあくまでも筆者の解釈です。この文章の内容が不正確な場合でも筆者は一切の責任を負うことは出来ません。

可能な限り参照元のリンクを残しますので、自身の目でオリジナルのドキュメントを確認するようにして下さい。

Apple's privacy manifestとは

2024年春以降、App Store Connectに新規アプリまたは既存アプリのアップデートをアップロードする際に、該当するAPIをアプリでどのように使用しているかを正確に説明した承認される理由を説明する必要があります。これらを記述するファイルをアプリのプライバシーマニフェストと呼びます。

なお、Appleから公開されているドキュメントによるとUnityはサードパーティSDKという位置づけになっています。

 

プライバシーマニフェストSDKの署名について

プライバシーマニフェスト

  • プロジェクトに含まれる該当するAPIをどのような目的でしているのかを記述したファイルです。
  • プライバシーマニフェストファイルをXcode15以降で生成可能です。
  • プロジェクト内に複数のプライバシーマニフェストが存在する場合、Xcodeにより1つのレポートに集約することが出来ます。

SDKの署名

署名後にSDKが改変されていないことを保証する仕組みです。Xcodeによって検証されます。

UnityによるApple private manifest対応

Unityは段階的な対応を行っており、2024年2/5現在対応が完全には完了していません。

第1フェイズ

2021.3.34f1,2022.3.16f1,2023.2.5f1

UnityEngineの不要なAPIが削除されました。

第2フェイズ

2021.3.35f1,2022.3.18f1,2023.2.7f1

プロジェクト・パッケージ・SDKそれぞれで定義しているプライバシーマニフェストを統合する機能

第3フェイズ

現在進行中

Unity Engineライブラリへの署名

 

Unityは2021LTS以前へのプライバシーマニフェストをサポートしていません。それ以前のバージョンに関してはユーザーがこちらのドキュメントを参考に独自に行う必要がありますが、ユーザーはUnityEngineのライブラリへの署名が出来ません。

Unityによるプライバシーマニフェストの最新情報はUnityForumsで公開されています。

またApple のプライバシーマニフェストポリシーの要件 - Unity マニュアルが日本語かされました。素早い対応に感謝です。

Unity アプリケーションでのプライバシーマニフェスト導入手順

  1. このドキュメントを元にXcode 15以降でプライバシーマニフェストファイル(PrivacyInfo.xcprivacy)を作成する
  2. プロジェクトのAssets/Pluginsフォルダーにプライバシーマニフェストを保存する
  3. プライバシーマニフェストに Application内で使用されているrequired reason APIC# .Net framework APIsと承認された理由を記載する
  4. Unityでプロジェクトをビルド
  5. Xcodeでプロジェクト内の全てのプライバシーマニフェストをプライバシーレポートとして1つのPDFに統合する
  6. サブミット時にプライバシーレポートを参照して Privacy Nutrition Label に情報を入力する

プライバシーマニフェストファイル名

  • プライバシーマニフェストファイルのマージ機能のよって、プロジェクト内に存在する複数のプライバシーマニフェストファイルはマージされる。
  • プライバシーマニフェストファイルはUnityプロジェクト内のAssets/Pluginsフォルダに配置する。(Assets/Plugins/iOSでは無いらしい)
  • ファイル名が重複しないように以下のルールでプライバシーマニフェストファイルを作成する
    • Unity Projectの場合:PrivacyInfo.xcprivacy
    • Plugin/Package/SDKの場合:<PRODUCTNAME>.xcprivacy

SDKの署名に関する考察

SDKの署名に関して必須なのかが現時点では明確になっていません。

もしSDKの署名が必須の場合、2021LTS以前のUnityでは要件を満たすことが出来なくなります。

SDKの署名が必須か否かが不明なのはAppleから公開されているドキュメントである」近日中に適用されるサードパーティSDKに関する要件に下記のような文言があり、必須ではなくお勧めと記載されている為です。

アプリでサードパーティSDKを使用する場合は、SDKに含まれるアプリのすべてのコードについても責任を持ち・・・すべてのSDKにこの機能を導入することをおすすめします。

何かご指摘・追加がありましたらコメントからご連絡下さい。

以上です。

AndroidでのWebGPUサポート

developer.chrome.com

 

以下の条件を満たすAndroidバイスでWebGPUが有効になるとのこと。

  • Android12以降
  • QualcommもしくはARMのGPU
  • Chrom 121以降

 

もしかしてUnityWebのWebGPUがAndroid端末でも動作する可能性が・・・。

 

一方AppleはiOS17.4でChrome等のSafari以外のブラウザを完全に動作させることが可能になるとのことなのでこちらも一歩前進?

gigazine.net

 

 

Unity6でのUnityWebについて

blog.unity.com

からの抜粋。

 

  • UnityWeb
    • ブラウザ向けのプラットフォーム名はUnity Web
      • 将来的に以下のビルドが作成できるようになる 。
        • WebGLを使用したビルド
        • WebGPUを使用したビルド
        • WebGLとWebGPUを使用したビルド
  • モバイルプラットフォームのサポート
  • Meta社との業務提携
  • WebAssembly
    • Emscripten コンパイラーは、Unity の il2cpp ビルドを WebAssemblyに変換する
    • Unity6では4GBのメモリを使用可能(現時点ではデスクトップのみで、ブラウザーが64bitメモリ対応している必要がある)
    • 例外処理を有効にするとtry/catchのオーバーヘッドが発生するが、オプションのWebAssemblyネイティブ例外処理を有効にすることでオーバーヘッドが殆どなくなる
    • WebAssembly SIMD のサポートを有効にすることでCPU上での演算が高速
  • レンダリング技術WebGL から WebGPU への移行
    • WebGPUはmacOSWindowsGoogle ChromeMicrosoft Edgeでのみ有効(つまりモバイルは未対応)
    • DirectX 12、Vulkan、Metal などのネイティブ GPU API を介して内部に実装される最新のグラフィックスアクセラレーションインターフェースを提供
    • デスクトップウェブでは見たことがないレベルのグラフィックス忠実度を実現
    • CPU と GPU のオーバーヘッドを低減し、スループットと待ち時間を改善
    • Boat AttackのサンプルがWebGPU上で動作可能に
    • WebGPUの先行アクセス用のフォーラムはこちら

Time.maximumDeltaTimeについて解説してみよう!

概要

「Time.maximumDeltaTimeの値を小さくしたのですが、処理落ちが改善しないのは何故ですか?」 という質問が定期的に寄せられます。 パフォーマンスに影響を与えるパラメーターという点に関してはあながち間違ってはいないのですが、1フレームにかかる実際の処理時間を制限する訳ではありません。

結論

Time.maximumDeltaTimeの値は前のフレームからの経過時間deltaTimeの上限値として使用されます。 この値はTime.timeに加算される為、Time.timeを観測している限りでは処理落ちが発生しても上限はTime.maximumDeltaTimeの値となっているように見えます。(リアル時間とは異なります) また、deltaTimeはFixedUpdateが実行される回数に影響を与える為、FixedUpdateの実行回数が減ることによりパフォーマンスの改善を行います。

解説

UnityはPlayerLoopの先頭で*1を行います。

  1. 最後のフレームからの経過時間をdeltaTimeとする
  2. deltaTimeがTime.maximumeDeltaTimeより大きい場合、deltaTimeの値をTime.maximumDeltaTimeとする。
  3. Time.timeにdeltaTimeを加算する
  4. Time.fixedTime <= Time.timeの場合、Time.fixedTimeへTime.fixedDeltaTimeを加算しFixedUpdate()を実行し、再び4を繰り返す
  5. Update()を実行する

Step2でTime.maximumeDeltaTimeを使用しています。 例えば、Time.maximumeDeltaTimeの値が0.032の場合、前のフレームに1秒かかっていたとしてもdeltaTimeは0.032となります。 仮にTime.maximumeDeltaTimeが存在しない場合のケースについて考えてみましょう。 Time.fixedTimeの値が初期値の0.02で、最後のフレームからの経過時間が1秒の場合、1 ÷ 0.02 = 50回のFixedUpdateが実行されることになります。

これは、処理落ちしてしまった時間分、Game時間(Time.time)にPhysicsの時間(Time.fixedTime)を追いつかせる為のやむなき処理なのですが、これによって1フレーム期間中に実行されるFixedUpdateの回数が増えることによって処理負荷が増加するという負のスパイラルが発生します。 その為、一定期間以上の処理落ちに関しては無かった事にしましょうというのがTime.maximumeDeltaTimeです。

GameObjectの移動にTransformにTime.deltaTimeを係数として使用するというコードを書くことがあると思いますが、大きな処理落ちが発生しTime.deltaTimeの値があまりにも大きいとワープして見えたり壁を突き抜けてしまったりというケースが想像出来ますが、Time.maximumeDeltaTimeの範囲内が最大移動距離と考える事が出来ます。この値が小さいと処理落ちした際にスローモーションで移動して見えるので、アプリ毎に良い塩梅で調整する必要があります。

つまり処理落ちした際の移動制限をユーザー側が独自にやっている場合はPhysicsとの整合性が取れなくなる可能性がある為注意が必要です独自にやるのではなく、Time.maximumeDeltaTimeで制限をかけることでアプリ全体で整合性を取る方が良いでしょう。

もしアプリケーションの1フレームにかかる処理時間をTime.deltaTimeで計測しているのであればそれは間違いです。上記で述べた通りTime.deltaTimeはTime.maximumeDeltaTimeでキャップされている為、実際にかかった処理時間を返しません。1フレームに掛った処理時間を求めるのであればTime.unscaledDeltaTimeを使用する必要があります。

まとめ

  • Unityは処理落ちが発生した場合、実際にかかった時間分処理をすすめようとしますが、そこに制限をかけるのがTime.maximumeDeltaTimeです。
  • 処理落ちが発生してもTime.maximumeDeltaTime以上アプリ内時間が進むことはありません。
  • 処理落ちが発生した場合、落ちた時間の長さに応じてFixedUpdateが実行される回数が増える為、さらに処理負荷が増加するが処理落ち時間を制限することによってFixedUpdateの回数を抑えることが可能です。
  • FixedUpdateが複数回実行されることによる処理落ちを改善する効果は期待できます。

関連記事

unityletsgo.hatenablog.com

*1:下記の処理