WWDC Quick Look 💓 By SwiftGGTeam
Plug-in and play: Add Apple frameworks to your Unity game projects

Plug-in and play: Add Apple frameworks to your Unity game projects

元の動画を見る

ハイライト

Apple は WWDC 2022 でオープンソースの Unity プラグインのコレクションをリリースし、Unity ゲームが C# を通じて Game Center、ゲーム コントローラー、アクセシビリティ、コア ハプティクス、PHASE、Apple.Core ビルド機能にアクセスできるようにしました。

主要内容

Unity ゲームが Apple プラットフォームの機能を統合する場合、共通の困難はコンセプト自体にあるのではなく、ブリッジングにあります。チームは、C# ゲーム ロジック、Unity エディターのワークフロー、Xcode プロジェクト設定、およびネイティブ フレームワークを接続する必要があります。 Game Center、コントローラー、触覚、空間オーディオ、アクセシビリティは、それぞれ別個のグルー コードのセットになる場合があります。

このセッションで与えられる答えは、公式の Unity パッケージのセットです。各プラグインは、基礎となる Apple フレームワークに対応します。 C# スクリプトはフレームワーク API を直接マッピングしようとし、ネイティブ ライブラリは C# とシステム フレームワークの接続を担当します。 Unity 開発者は、最初にゲーム全体をネイティブ アプリとして書き直すことなく、既存のプロジェクトにプラットフォーム機能を追加できます。

この設計では、Unity の使用習慣も維持されています。プラグインはパッケージ マネージャーを介して tarball からインポートされ、エディターにはプロジェクト設定、インスペクター、アセット作成メニュー、およびカスタム編集ウィンドウがあります。開発者は今でもシーン、コンポーネント、リソースを Unity で整理しています。 Xcode を入力する必要がある場合は、主に機能の構成と最終的なプロジェクトの統合に重点を置きます。

詳細

1. Apple.Core は最初にビルドを管理し、次に他のプラグインをサポートします (05:01)

Apple.Core は、すべての Apple Unity プラグインの基本依存関係です。 Apple Build 設定を Unity のプロジェクト設定に追加し、各プラグインのビルド オプションを同じ設定パネルに配置します。また、インポート時にネイティブ ライブラリが正しいプラットフォームに設定されるようにするアセット プロセッサも含まれています。ビルド時に、ネイティブ ライブラリはポストプロセス スクリプトを通じて中間 Xcode プロジェクトを正しく参照します。

インポート順序も明確です。最初に Apple.Core、次に GameKit、ゲーム コントローラー、アクセシビリティ、コア ハプティクス、または PHASE が続きます。セッションのデモでは、Unity Package Manager を使用して「tarball からパッケージを追加」を選択し、コンパイルされたプラグイン パッケージをインポートします。 Apple.Core の準備が完了すると、最小システム バージョン、セキュリティ設定、ポストプロセス スイッチがすべて統合設定ページに表示されます。

1. clone Apple Unity Plug-Ins repository
2. run build.py to build native libraries and package plug-ins
3. import Apple.Core tarball with Unity Package Manager
4. configure Apple Build Settings in Project Settings
5. import the feature plug-ins needed by the game

キーポイント:

  • build.pyリポジトリのルート ディレクトリにあり、ネイティブ ライブラリの構築、Unity メタ ファイルの更新、tarball のパッケージ化、プラグイン テストの構築を担当します。
  • 完全なビルドには Xcode、Python 3、npm、Unity が必要です。
  • Apple.Core 設定は中間 Xcode プロジェクトに伝播され、最小システム バージョンとセキュリティ オプションの集中管理に適しています。
  • 他のプラグインは Apple.Core に依存しているため、プロジェクトに最初に入力する必要があります。

2. プレーヤー認証に GameKit プラグインを使用する (09:02)

Game Centerへの入り口はプレイヤー認証です。 session は、認証はゲームのライフサイクルで 1 回だけ行う必要があることを強調しています。認証が成功すると、ゲームはローカル プレーヤーの制限ステータスを照会し、アダルト コンテンツを非表示にするか、マルチプレーヤー プレイをオフにするか、ゲーム内通信 UI をオフにするかを決定できます。

using Apple.GameKit;

public class GameManager : MonoBehaviour
{
    private GKLocalPlayer _localPlayer;

    private async Task Start()
    {
        try
        {
            _localPlayer = await GKLocalPlayer.Authenticate();
        }
        catch (Exception exception)
        {
            // Handle exception...
        }
    }
}

キーポイント:

  • using Apple.GameKit;GameKit Unity プラグインによって公開される C# API の紹介。 -GameManagerこれは Unity コンポーネントであり、ゲームの起動フェーズでの配置に適しています。 -_localPlayerキャッシュされた認証済みGKLocalPlayer、その後の Game Center の操作はこれに基づいて行うことができます。 -GKLocalPlayer.Authenticate()これは、ローカル プレーヤー インスタンスを返す非同期静的メソッドです。 -catchブランチは、オフライン モードで続行するかプロンプトを表示するなど、ゲーム独自のプロセスに従って認証失敗を処理する必要があります。

認証後の制限チェックは、いくつかのブール テストだけです。

try
{
    _localPlayer = await GKLocalPlayer.Authenticate();

    if (_localPlayer.IsUnderage)
    {
        // Hide explicit game content.
    }

    if (_localPlayer.IsMultiplayerGamingRestricted)
    {
        // Disable multiplayer game features.
    }

    if (_localPlayer.IsPersonalizedCommunicationRestricted)
    {
        // Disable in-game communication UI.
    }
}

キーポイント:

  • IsUnderagetrue の場合、ゲームはアダルトまたは露骨なコンテンツを制限する必要があります。 -IsMultiplayerGamingRestrictedtrue の場合、ゲームはマルチプレイヤー エクスペリエンスをオフにするか、調整する必要があります。 -IsPersonalizedCommunicationRestrictedtrue の場合、ゲームはゲーム内通信 UI をオフにする必要があります。
  • このセッションでは、中間 Xcode プロジェクトに Game Center 機能を追加することと、App Store Connect で Game Center 機能を設定することという、作業を終了するための 2 つのステップも思い出させます。

3. ゲーム コントローラー プラグインを使用して、接続と入力を均一に処理します (13:11)

ゲーム コントローラー プラグインは、MFi コントローラーおよび一部の Sony および Microsoft サードパーティ コントローラー用です。コントローラーのカスタマイズ、ボタンのグリフ、入力アクセスが提供されます。セッション 現在接続されているコントローラーの保存、開始時のサービスの初期化、更新ループでの入力のポーリングの 3 つのことを行うには、InputManager コンポーネントを使用することをお勧めします。

using Apple.GameController;

public class InputManager : MonoBehaviour
{
    void Start()
    {
        // Initialize the Game Controller service
        GCControllerService.Initialize();

        // Check for connected controllers
        var controllers = GCControllerService.GetConnectedControllers();
        foreach (GCController controller in controllers)
        {
            // Handle controllers
        }

        // Set up callbacks to handle connected/disconnected controllers
        GCControllerService.ControllerConnected    += _onControllerConnected;
        GCControllerService.ControllerDisconnected += _onControllerDisconnected;
    }
}

キーポイント:

  • GCControllerService.Initialize()これは 1 回限りの初期化エントリです。 -GetConnectedControllers()現在接続されているコントローラーのコレクションを返します。 -GCControllerプラグイン内のコントローラー オブジェクトを表します。 -ControllerConnectedそしてControllerDisconnectedゲームの実行中にコントローラーが挿入または切断された場合の状況に対処します。

読み取られた入力を更新ループに入れる方が自然です。セッション内の例では、最初にポーリングを行ってから、特定のボタンを読み取ります。

foreach (GCController controller in _myConnectedControllers)
{
    controller.Poll();

    // Check the 'South' button ('A' button on most controllers)
    if (controller.GetButton(GCControllerInputName.ButtonSouth))
    {
        //Handle button pressed
    }

    // Check other controller inputs…
}

キーポイント:

  • controller.Poll()最新のコントローラのステータスを取得します。 -GCControllerInputName.ButtonSouthほとんどのコントローラーの A キーの位置に対応します。
  • 各ポーリング後にボタンやジョイスティックなどの入力を読み取ることで、ゲーム ロジックが現在のフレームのコントローラー ステータスを取得できるようになります。
  • ポーリング頻度はゲームによって決定され、Unity の定期的な更新ループからセッションを開始することをお勧めします。

4. Accessibility プラグインは、支援技術を Unity シーンに組み込みます (14:27)

アクセシビリティ プラグインを使用すると、Unity ゲームが VoiceOver、スイッチ コントロール、ダイナミック タイプ、およびシステム全体の UI 対応設定にアクセスできるようになります。 VoiceOver はプログラムでタグ付けされたコンテンツを読み取り、Switch Control は補助入力デバイスをサポートし、Dynamic Type はゲーム UI をユーザーのテキスト サイズの好みに適応させます。

このセッションではコードの拡張は行われませんでしたが、コードをプラグイン コレクションの主要モジュールとして位置付け、専用の「Unity ゲームへのアクセシビリティの追加」を指摘しました。既存の Unity プロジェクトを改修しているチームにとって、実際的な道筋は明確です。プレイヤーが理解または操作する必要があるオブジェクトを特定し、プラグインによって提供されるアクセシビリティ コンポーネントとプロパティを使用して、これらのオブジェクトをシステム支援テクノロジに公開します。

Unity scene object
  -> add accessibility component
  -> provide label, traits, value, or preferred text behavior
  -> test with VoiceOver, Switch Control, Dynamic Type, and system settings

キーポイント:

  • VoiceOver には読み取り可能なプログラム コンテンツが必要であり、ゲーム オブジェクトはビジュアル レイヤーにだけ留まることはできません。
  • スイッチ コントロールにより、より多くの入力デバイスでゲームを操作できるようになります。
  • ダイナミック タイプは、ゲーム メニュー、プロンプト、設定ページなどのテキストを多用するインターフェイスに適しています。
  • この部分の能力は、Game Center のプレイヤー制限とは異なります。プレイヤーがゲームを理解して操作できるかどうかが問題となります。

5. Core Haptics プラグインは、AHAP アセットを C# コンポーネントに接続します (20:30)

Core Haptics はデータ駆動型 API です。セッションはそれを 4 つのオブジェクトに分割します。CHHapticEngineデバイス上の触覚サーバーに接続し、CHHapticPatternPlayer再生を制御し、CHHapticPattern1 つ以上の触覚イベントや音声イベントを企画し、CHHapticEventそれは触覚体験の基本単位です。

Unity プラグインは AHAP アセットも提供します。開発者は、Unity の [アセット] メニューで AHAP を作成し、インスペクターを使用して一時的または継続的なイベントを調整し、AHAP ファイルをインポートおよびエクスポートして、ゲーム オブジェクト上の Haptics コンポーネントへのアセットを参照できます。

using Apple.CoreHaptics;

public class Haptics : MonoBehaviour
{
    private CHHapticEngine _hapticEngine;
    private CHHapticPatternPlayer _hapticPlayer;
    [SerializeField] private AHAPAsset _hapticAsset;

    private void PrepareHaptics()
    {
        _hapticEngine = new CHHapticEngine();
        _hapticEngine.Start();
        _hapticPlayer = _hapticEngine.MakePlayer(_hapticAsset.GetPattern());
    }

    private void Play()
    {
        _hapticPlayer.Start();
    }
}

キーポイント:

  • CHHapticEngineこれは触覚パターンを再生するための前提条件です。 -_hapticEngine.Start()エンジンを始動します。 -[SerializeField] private AHAPAsset _hapticAsset;Unity Inspector で AHAP アセットを指定できるようにします。 -_hapticAsset.GetPattern()AHAP アセットから触覚パターンを取得します。 -MakePlayer(...)プレーヤーを作成し、_hapticPlayer.Start()プレイを開始します。

6. PHASE プラグインはコンポーネントを使用して空間オーディオを整理します (22:13)

PHASE は、ジオメトリを認識した空間オーディオを処理します。シーン内のメッシュからサウンドが発せられ、建物などの幾何学的なオブジェクトに遭遇すると、オクルージョン、反射、残響が発生します。 Unity プラグインは、共通の役割をコンポーネントにします。PHASEListener現場の耳です、PHASEOccluder幾何学的データを持つオブジェクトにアタッチし、遮蔽された音を減衰させます。PHASESourceゲーム オブジェクトの変換を使用して、ワールド内にサウンドを配置します。

セッションのデモにはスクリプトは含まれていません。飛行機、建物、カメラを含むプロジェクトでは、リスナーをカメラに、オクルーダーを建物に、ソースを飛行機に追加します。そして作成しますSoundEventアセット、PHASE サウンド イベント コンポーザーにサンプラー ノードを追加し、航空機のアイドル オーディオを参照し、ループを維持して、出力をミキサーに接続します。最後に、SoundEvent をプレーン上の PHASESource にバインドします。

Camera   -> PHASEListener
Building -> PHASEOccluder
Airplane -> PHASESource -> SoundEvent -> sampler node -> mixer

キーポイント:

  • リスナーは、位置、方向、リバーブのプリセットに基づいてシーンのオーディオを処理します。
  • オクルーダーは、シーンのジオメトリに依存して、音源とリスナーの間で音を減衰します。
  • ソースはゲーム オブジェクトの変換を使用して、サウンドがオブジェクトの動きに追従するようにします。
  • SoundEvent は特定の再生イベントを記述し、composer はノード グラフを使用してサンプラーとミキサーを作成します。
  • このワークフローは、最初に空間オーディオをシーンに接続し、次にサウンド イベントと残響パラメータを徐々に調整する場合に適しています。

重要ポイント

  1. Game Center の安全な起動プロセスを作成する

    • やるべきこと: Unity ゲームのタイトル画面から Game Center 認証を完了し、プレイヤーの制限に基づいてコンテンツ、マルチプレイヤー、通信機能を切り替えます。
    • 実行する価値がある理由: セッション記述認証は 1 回だけ行う必要があり、制限ステータスは次から直接取得できます。GKLocalPlayerクエリ。
    • 開始方法: 作成するGameManagerコンポーネント、呼び出しGKLocalPlayer.Authenticate()、その後処理しますIsUnderageIsMultiplayerGamingRestrictedIsPersonalizedCommunicationRestricted
  2. ホットスワップ可能なコントローラー入力レイヤーを作成します

    • 内容: すべてのコントローラーの接続、切断、ポーリング、ボタン マッピングを Unity に一元管理します。InputManager
    • 実行する価値がある理由: ゲーム コントローラー プラグインによって提供されますGCControllerService、接続イベントおよびGCController入力読み取り。
    • 起動方法: 起動時に呼び出されますGCControllerService.Initialize()、保存GetConnectedControllers()返されたオブジェクトは、更新ループ内の各コントローラーに対して呼び出されます。Poll()
  3. ゲームの重要な瞬間に調整可能な触覚アセットを追加します

    • やるべきこと: 衝突、加速、衝突、傷害、その他のイベントを AHAP アセットに作成します。これは、Unity Inspector でデザインまたはオーディオ担当者が調整できます。
    • 実行する価値がある理由: Core Haptics プラグインは、AHAP のインポート、エクスポート、および Inspector パラメーターの調整をサポートしています。このコードは、エンジンの作成とプレーヤーの再生のみを担当します。
    • 開始方法: 作成するAHAPAsset、コンポーネントに保存されます[SerializeField]引用、使用CHHapticEngineそしてMakePlayer(_hapticAsset.GetPattern())遊ぶ。
  4. 3D シーンのオーディオ オクルージョンをコンポーネント構成にします

    • 何をすべきか: 左右のチャンネルを再生するだけでなく、建物、壁、車両、その他のシーン オブジェクトが音の伝播に影響を与えるようにします。
    • 実行する価値がある理由: PHASE プラグインによって提供されますPHASEListenerPHASEOccluderPHASESourceそしてSoundEvent, 基本的な構築はUnityエディターから完了できます。
    • 開始方法: カメラにリスナー、障害物にオクルーダー、音を発するオブジェクトにソースを配置し、SoundEvent コンポーザーを使用してサンプラーとミキサーを接続します。
  5. Unity メニューと HUD 用の完全な支援技術ポータル

    • やるべきこと: メイン メニュー、設定ページ、カード、プロンプト テキスト、およびその他の UI を VoiceOver で読み取れるようにし、ダイナミック タイプに応答します。
    • 価値がある理由: アクセシビリティ プラグインは、VoiceOver、スイッチ コントロール、ダイナミック タイプ、およびシステム UI の調整を Unity ゲームにもたらします。
    • 開始方法: プレーヤーがクリックするか理解する必要があるオブジェクトから開始し、それらにアクセシビリティ マーカーを追加して、実際のデバイスでのアクセシビリティ テストを有効にします。

関連セッション

コメント

GitHub Issues · utterances