次の方法で共有



Special Windows 10 issue 2015

Volume 30 Number 11

ゲーム開発 - Unity によるユニバーサル Windows プラットフォーム向けゲーム開発

Jaime Rodriguez | Windows 2015

Windows 10 には、ゲーム開発者やゲーマー向けの新機能が数多くあります。ユニバーサル Windows プラットフォーム (UWP) により、開発者は 1 つのコード ベースで、Windows 10 タブレットと PC、Windows 10 モバイル搭載のデバイス (スマートフォン)、Xbox One、HoloLens をターゲットにできます。また、Windows ストアが 1 つのストアにまとめられ、マイクロソフトは、Xbox Live サービスと Xbox アプリを Windows 10 に持ち込み、すべての Windows デバイス ファミリでゲーマーを楽しませようとしています。

ゲーム開発者にとっては、Unity が最も普及しているゲーム開発エンジンの 1 つです。Unity は 21 種類のプラットフォームに対応しているため、現在利用できるミドルウェアの中で、クロスプラットフォーム開発のサポートは随一です。さらに、Unity のエディターは C# スクリプティングのサポートと組み合わせて、非常に生産性の高いゲーム開発環境になります。Asset Store や Unity のコミュニティに加え、広告、ユーザー参加、分析により Unity の機能が拡張されたことで、今までにないほど簡単に没入型ゲームを開発できるようになっています。

Unity についてのコラムを書くなら、今でしょう。ここでは、Unity ゲームを Windows 10 で快適に実行するために必要な情報をすべて示します。ただし、Unity や UWP アプリを紹介するものではありません。ここでは、この 2 つのトピックの知識が十分あることを前提として、Windows 10 によって変わることと、優れたユニバーサル Windows ゲーム (UWG) を作成するのに「知っておくべき」ヒントに注目します。今回は、Chomp というサンプル ゲーム (図 1 参照) にいくつか変更を加えて Windows 10 向けに最適化する実際のアプローチに沿って説明します。

Chomp
図 1 Chomp

Chomp は、元々 Unity で開発された Windows 8.1 ゲームです。このゲームは、図 1 のスクリーンショットの通り、パックマンに似た、非常にシンプルなダンジョン ゲームです。このサンプルは、Unity によるゲーム開発方法を開発者にデモするためのガイドとして作成されたため、シンプルさが重視されています。しかし、Windows 10 が登場し、Unity がこの新 OS をサポートするようになったため、Chomp を更新する必要があります。Chomp のソース コードは bit.ly/UnityChomp で入手できます。ソース コードをダウンロードして、このコラムをお読みください。

Unity で Windows 10 プロファイルを使用してゲームをエクスポートすれば、簡単にゲームを UWP 版にできますが、それでは Windows 10 の機能に最適化されたゲームにはなりません。ウィンドウでの実行、全画面モード、タッチ操作などが処理されません。そこで、このゲームを Windows 8.1 から Windows 10 に対応させる手順を見ていきます。

はじめに (前提条件)

UMP アプリ (および UWG) は、Windows 10 と Visual Studio 2015 を使って開発し、テストする必要があります。ゲーム開発に必要なものは、無料の Visual Studio Community 2015 も含め、Visual Studio 2015 のすべてのエディションに含まれています。

一方 Unity は、Unity 5.2.1p2 以上が必要です。Unity 5.2 では Visual Studio Community 2015 と Visual Studio 2015 Tools for Unity (VSTU) をインストールするようになったので、ゲーム開発の着手に必要なのは、Unity をインストールし、その途中で適切なオプションのチェック ボックスをオンにするだけです。詳細については、図 2 を参照してください。

開発の着手に必要なものを入手するための Unity インストール時オプションの指定
図 2 開発の着手に必要なものを入手するための Unity インストール時オプションの指定

注: Mac を使っている開発者の場合は、Unity プロジェクトに Visual Studio Code エディターを使用する新しい選択肢もあります。このオプションの詳細については、bit.ly/UnityVSCode (英語) を参照してください。

Windows 10 向けのビルド

Windows 10 向けのビルドは、これまで使い慣れたプロセスと何も変わりません。Windows ストア プラットフォームには UWP アプリをターゲットにする新しい SDK があります (図 3 参照)。これはゲームを UWP アプリとしてエクスポートします。

Unity から Windows 10 をターゲットに指定
図 3 Unity から Windows 10 をターゲットに指定

以下は、Windows 10 と UWP 開発向けにエクスポート時に生じる重要な項目の一部を示しています。

  • UNITY_UWP と UNITY_WSA_10_0 という新しいプリプロセッサがあります。これで、ゲームのロジックとエクスペリエンスを UWP 向けに調整できます。
  • Unity 5.2 からは、以前のバーションよりも含まれる型が少なくなるよう新しく効率化された WinRTLegacy DLL が導入されます。Windows 10 では、マイクロソフトが一部の型を .NET Core プロファイルに復活させたことで、WinRTLegacy に含まれていた回避策の一部が必要なくなります。
  • Unity 5.2 では Unity 5 から導入された新しいプラグイン モデルを使用して、ワークフローに使用するプラグインをかなりシンプルにしています。これについては、後ほど取り上げます。
  • Unity 5.2 では、Windows 10 に同梱されている DirectX 12 への実験的なサポートが含まれています。この実験的なサポートを試すには、Unity で [Edit]、[Project Settings]、[Player] の順で開き、[Auto Graphics API] オプションのチェック ボックスをオフにして、Direct3D12 へのサポートを手動で含めます。

新しいプロジェクト テンプレート

Unity のビルド プロセスでは、UWP と互換性のある Visual Studio 2015 プロジェクトが生成されるようになります。この新しいプロジェクト システムには、大きな変更がいくつか加えられています。

たとえば、各 UWP アプリには、.NET Core のアプリ独自のコピーが同梱されるようになるため、テストに使用したバージョンの .NET が必ず利用されます。これに合わせて、Unity は NuGet を使用して正しいバージョンの .NET の機能を取り込む、適切な project.json ファイルを生成します。

UMP アプリは .Net ネイティブも使用します。これにより、アプリがユーザーのコンピューターにダウンロードされる前に最適化済みのネイティブ マシンコードが生成され、ゲームが迅速に起動され、バッテリーの消費量が抑えられます。このような最適化の効果はゲームの複雑さによって異なりますが、パフォーマンスに悪影響を及ぼすことはまったくありません。.NET ネイティブ唯一の注意点は、Visual Studio でのコンパイル時間が (非常に) 長くなることです。通常のアプリの場合、Visual Studio はプロジェクトが "リリース" 構成の場合のみ .NET ネイティブを使用してコンパイルします。Unity が生成するプロジェクト ファイルでも、同様のアプローチが取られ、"Master" 構成の場合のみ、.NET ネイティブを使ってコンパイルされます。Unity の構成ターゲットには次の 3 種類があります。

  • "Debug" は、完全なデバッグ プロジェクトで、最適化は一切行われません。
  • "Release" は、最適化を行ってコンパイルされたプロジェクトですが、プロファイラー サポートが含まれます。
  • "Master" は、ストアに公開する構成で、デバッグ コードを含まず、完全な最適化が行われ、プロファイリング サポートが取り除かれます。

開発サイクルの早い段階で、.NET ネイティブによるコンパイルとテストを行うことを強くお勧めします。Unity は高度な中間言語 (IL) が多数組み込まれるため、Unity ゲームは .NET ネイティブの影響を最も受けやすい種類のアプリといえます。想定通りに動作していることを確認するには、.NET ネイティブのコンパイル中に出力ウィンドウに表示される警告を監視します。

上記の構成の違いは実行時に大きな影響を与えますが、新しい Unity テンプレートは構成の変更を開発者に意識させることなく内部で行うため、開発者はゲームを Windows 10 向けに調整して洗練することに専念できます。

Windows 10 向けのゲームの調整と洗練

1 つのコード ベースを多くのフォーム ファクターで使えることが UWP の重要な特徴ですが、ゲームについては、一般に、特定のフォーム ファクターに対してある程度の調整や最適化が依然として必要です。多くの場合、入力メカニズム (タッチ、キーボード、マウス、ゲームパッドなど)、ウィンドウのサイズ変更、リソースやアセットの最適化、特定フォームファクターとネイティブ プラットフォームとの統合 (ライブ タイル、通知、Cortana など) を調整します。ここからは、UWG でのこのような調整についてみていきます。

ウィンドウ化: ユニバーサル Windows アプリは、Windows 8 や 8.1 の全画面アプリではなく、サイズ変更可能なウィンドウ内でホストされるアプリになるため、開発するゲームやアプリではウィンドウ化を考慮することになります。ただし、Screen.height プロパティと Screen.width プロパティで利用可能な領域がネイティブ (ピクセル) サイズでわかるので、Unity 開発者は Windows 8 や 8.1 との違いの大半を意識することはありません。

Windows 10 には、全画面表示とウィンドウ表示を切り替える新しい API も導入されるため、Screen.fullScreen プロパティを設定することで、Unity Screen クラスによってこの API が公開されます。ウィンドウ化に関するベスト プラクティスは、全画面表示の切り替えを行う標準キー アクセラレーターを実装することです。アクセラレーターはその機能を公開するアプリによって大きく異なりますが、切り替えの共通アクセラレーターは F11 キーまたは Alt + Enter キーです。Chomp ではプレイヤーが全画面プレイを選択できるように、次のようにして全画面モードに切り替えられるようにします。

if (Input.GetKeyUp (KeyCode.F11))
{
  Screen.fullScreen = !Screen.fullScreen;
}
if (Input.GetKeyUp (KeyCode.F11))
{
  Screen.fullScreen = !Screen.fullScreen;
}

デスクトップがマルチウィンドウになることで、Windows 10 ゲームにはもう 1 つ変更が必要になります。それはフォーカスの変化に伴う処理です。マルチウィンドウ デスクトップでは、ユーザーが別のウィンドウを操作してゲーム ウィンドウからフォーカスが失われた場合に、ゲームと音楽を一時停止すべきです。Unity は、他のプラットフォームで公開されているのと同じ API、OnApplicationPause メソッドを使って一時停止の操作を抽象化します。フォーカスが変化するとき、すべてのアクティブな MonoBehaviour でこのメソッドを呼び出します。Chomp では、このメソッドを図 4 のように処理します。

図 4 フォーカス変化時のゲームの一時停止

public void OnApplicationPause(bool pause)
{
  FocusChanged(!pause);
}
public void FocusChanged(bool isFocused)
{
  if (isFocused)
    musicSource.UnPause();
  else
  {
    musicSource.Pause();
    GameState.Instance.SetState(GameState.GameStatus.Paused);
  }
}

当然、正反対の処理も必要になります。ゲームのフォーカスが失われたときは、ゲームとオーディオを一時停止しますが、ゲームがフォーカスを受け取ったときは、オーディオだけを再生します。その理由は、ゲームの一時停止時は、ゲーム自体の内部で停止状態を示すダイアログ ボックスを表示し、フォーカスが戻っても、ユーザーがプレイの再開を決定するまでゲームを待機させようと考えているためです。ダイアログでは、ゲームの状態を一時停止から実行中に戻す処理を行います。

上記 2 つの変更を適切に行うことで、全画面表示の切り替えや、ウィンドウがフォーカスを失ったときのゲームの一時停止を正しく処理できます。

入力: Unity のこれまでのリリースでは Windows ゲームでの入力に優れたサポートを提供してきましたが、Windows 10 でもこれは変わりません。Unity では、マウス、タッチ、ゲームパッドの操作はこれまでどおり、Input クラスと Input Manager によって適切に抽象化されます。

入力に関して覚えておくべき最も重要な点は、実装する入力メカニズムの数を開発するゲームに適した数にすることです。Chomp ではキーボード、ゲームパッド、タッチをサポートします。UWG は動作する場所を選ばないので、できる限り最適な入力とゲーム エクスペリエンスをプレイヤーに提供するようにします。スマートフォンなどのタッチ デバイスでプレイする際、タッチ コントロール (仮想ジョイスティックや方向パッド) を表示する必要があるかどうかを検出する方法が最も問題になります。

タッチ ジョイスティックを表示するかどうかを決める方法の 1 つに、ゲームがスマートフォン上で実行されているかどうかを判断するやり方があります。スマートフォンで実行されている場合は、ジョイスティックを既定で表示して操作できるようにします。ゲームが特定のプラットフォーム (スマートフォンや Xbox など) で実行されているかどうかを判断するには、適切なコントラクトが実装されているかどうかをチェックします。Chomp では、ゲームが Windows 10 モバイルで実行されているどうかを次のように検出しています。

public static bool IsWindowsMobile
{
  get
  {
    #if UNITY_WSA_10_0 && NETFX_CORE
      return Windows.Foundation.Metadata.ApiInformation.
        IsApiContractPresent ("Windows.Phone.PhoneContract", 1);
    #else
      return false;
    #endif
  }
}

上記のコードでは、UNITY_WSA_10_0 プリプロセッサを使用して、Windows 10 向けにコンパイルしているかどうかを切り分けています。このチェックを行わないと、Windows 10 以外のビルドでコンパイルに失敗します。

常に仮想ジョイスティックを表示したままにすることもできますが、ユーザーが実際にデバイスに触れているときだけジョイスティックを表示する方が適切です。Windows 10 には、Windows 10 がタブレット モード (タッチ) と従来のデスクトップ モード (マウス/キーボード) のどちらで実行されているかを判断する、Windows.UI.ViewManagement.UIViewSettings.UserInteractionMode という新しい API があります。この API はWindows の UI スレッド上で実行する必要があるため、Unity 内からの呼び出しを UI スレッドにマーシャリングしなければなりません。そのため、Chomp に図 5 のコードを追加して、ユーザーがタッチを使ってアプリを操作しているかどうかを判断しています。

図 5 ユーザーがタッチを使っているかどうかを判断するコード

public static bool IsWindows10UserInteractionModeTouch
{
  get
  {
    bool isInTouchMode = false;
#if UNITY_WSA_10_0 && NETFX_CORE
    UnityEngine.WSA.Application.InvokeOnUIThread(() =>
    {
      isInTouchMode =
        UIViewSettings.GetForCurrentView().UserInteractionMode ==
        UserInteractionMode.Touch;
    }, true);        
#endif
    return isInTouchMode;
  }
}

ここまでに実装した 2 つのメソッドにより、ジョイスティックを表示するタイミングに目星が付けられるように Chomp を更新しました。ゲームをモバイル デバイスで実行している場合、またはユーザーの対話モードがタッチになっている場合は、UseJoystick が true を返すので、ジョイスティックを表示します。

public static bool UseJoystick
{
  get
  {
    return (IsWindowsMobile || IsWindows10UserInteractionModeTouch) ; 
  }
}

ウィンドウ化と入力を処理したら、今度は新しいネイティブ Windows API を利用して、ゲームに多くの機能を追加します。

Windows 10 とのネイティブ統合: プラットフォームの特徴を活かす: Unity ゲーム内部からの OS とのネイティブ統合は、以前と同じように処理します。Unity で .NET Core コンパイル オプションを使用してコンパイルを行っている (NETFX_CORE プリプロセッサを使用している) 場合、ネイティブ コードをインライン化することができます。

追加予定のコードがインラインにするには多すぎる場合、または動作を (プラットフォーム間で) 抽象化する必要がある場合は、プラグインを使用できます。Windows 10 では、マイクロソフトの Developer Experience Games Evangelism チーム (筆者 2 人が所属) は、Windows 10 との統合が容易になるように、新しいプラグインのオープン ソース化を進めています。このようなプラグインは bit.ly/Win10UnityPlugins (英語) から入手できます。本記事執筆時点では、次のプラグインが公開されています。

  • Store: Store プラグインは、アプリ シミュレーター、期間限定利用、無期限使用、領収書をサポートするアプリ内購入用プラグインです。このプラグインには、Windows ストアで取引するために必要なものがすべて揃っています。
  • AzureMobile: Azure Storage に対する基本操作、作成、読み取り、更新、削除 (CRUD) を行う Microsoft Azure プラグインです。
  • Core: "Core" プラグインは、ライブ タイル、ローカル通知、プッシュ通知、Cortana などのコア OS 機能とのネイティブ統合を提供します。
  • Ads: 新しい Windows 10 Microsoft Advertising SDK をラップするプラグインで、動画のすきま広告をサポートできるようにします。

以前の Chomp にはアプリ内購入機能がなかったので、Store プラグインを使用してゲームにアプリ内購入を追加することにします。Chomp では、期間限定の商品 (ブースター) と使用無制限の商品 (ダンジョン) の購入をサポートするようにします。

このようなプラグインを使用する最も簡単な方法としては、GitHub から Unity パッケージをダウンロードして、Unity Editor で [Assets]、[Import Package]、[Custom Package...] の順でクリックし、そのパッケージをインポートします。パッケージのインポートが完了すると、Unity Plugins フォルダーに適切なバイナリが配置されます。インストール後のバイナリは Plugins\WSA ディレクトリにあります。Unity ではエディター中で使用するプレースホルダー アセンブリ (Microsoft .NET Framework 3.5 との互換のため) が必要なので、プレースホルダー アセンブリも Plugins フォルダーにコピーされています。

パッケージをインポートした後は、Store API を Chomp から参照できるようになります。まず、完了時に実行されるメソッドを指定して Store.LoadListingInformation を呼び出し、購入可能なすべての商品の一覧を取得します。呼び出しが成功すると、返された ProductListing の商品を反復し、商品ごとに UI に表示する価格を設定します (図 6 参照)。

図 6 アプリ内購入用に利用可能な商品の一覧

void Start()
{   
  Store.LoadListingInformation(OnListingInformationCompleted);
  ...
}
void OnListingInformationCompleted(
  CallbackResponse<ListingInformation> response)
{
  if (response.Status == CallbackStatus.Success)
  {
    ListingInformation result = response.Result;
    PopulatePrices(result.ProductListings);
  }
}

ユーザーが購入する商品を選択したら、ほんの数行のコードで取引を実行します。図 7 に、使用無制限の商品 (ゲームの新しいダンジョン) を購入できるようにするコードを示します。

図 7 アプリ内購入の実行

public void OnDurablePurchase(GameObject buttonClicked)
{
  string productId = GetProductId(buttonClicked.name);
  if (!string.IsNullOrEmpty (productId))
  {
    Store.RequestProductPurchase(productId, (response) =>
    {               
      if (response.Status == CallbackStatus.Success)
      {
        // response.Status just tells us if callback was successful.
        // The CallbackResponse tells us the actual Status
        // as returned from store.
        // Check both.
        if (response.Result.Status == ProductPurchaseStatus.Succeeded)
        {
          EnableLevels(productId);
          return;
        }                 
      }
    });
  }
}

ご覧のように、新しいプラグインを使用して、ネイティブ機能を簡単に実装できます。

ストアへの公開

Windows ストアへの公開は、以前より容易になっています。すべてのバイナリを含む 1 つのパッケージを提出することも、プラットフォーム/アーキテクチャごとに 1 つずつパッケージを提出することもできるようになりました。

パッケージを分割する場合や、特定のプラットフォームだけをサポートする場合は、手動で package.appxmanifest ファイルを編集して TargetDeviceFamily 要素を調整します。

<Dependencies>
  <TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.10240.0" 
    MaxVersionTested="10.0.10240.0" />
</Dependencies>

調整できるデバイス ファミリには次の 3 つがあります。

  • Windows.Universal: ハードウェア要件を満たすすべてのデバイスにバイナリを配置できるようにします。
  • Windows.Mobile: Windows 10 モバイルの SKU (Windows Phone) にインストールするバイナリに使用します。ただし、将来的にはスマートフォン以外でこの SKU を実行する (6 インチ以下の) 小型デバイスが現れる可能性があるため、対象をスマートフォンには限定していません。
  • Windows.Desktop: デスクトップやタブレットのみでプレイされるゲームに使用します。

ターゲットをモバイルとデスクトップにして、コンソールや今後の Windows ファミリは考えない場合、次のようにマニフェスト内のデバイス ファミリを 2 つにすることができます ("x" と "y" は適宜置き換えてください)。

<Dependencies>
  <TargetDeviceFamily Name="Windows.Mobile" MinVersion="10.0.x.0"
    MaxVersionTested="10.0.y.0"/>
  <TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.x.0"
    MaxVersionTested="10.0.y.0"/>
</Dependencies>

デバイス ファミリごとに MinVersion と MaxVersions に別の値を設定できます。Windows 10 デスクトップよりも Windows 10 モバイルのバージョン番号の方が大きくなる将来に備えてこの機能を用意しています。ただし、現在のところは、既定のバージョン (10.0.10240.0) のままにすることをお勧めします。

.NET ネイティブで説明したように、パッケージを公開するときは必ず Master 構成を提出します。クラッシュ分析のため、完全なプログラム データベース (PDB) シンボル ファイルも含めることをお勧めします。新しいストアには、クラッシュをローカルに分析できる cab ファイルをダウンロードするオプションはありません。代わりに、Windows ストアに PDB を提出する必要があります。その結果、ストアが分析を行い、クラッシュのスタック トレースを返します (図 8 参照)。

プログラム データベース シンボル ファイルの追加
図 8 プログラム データベース シンボル ファイルの追加

最後に、開発者ポータルから Windows ストアに提出するとき、正しいハードウェア構成を選択するようにします。ストアでは、タッチやキーボードなどのハードウェア要件を指定できるようになったため、適切なデバイスにのみゲームがインストールされます (図 9 参照)。

開発者ポータルで利用可能なハードウェアの基本設定
図 9 開発者ポータルで利用可能なハードウェアの基本設定

その他

今回は、シンプルなゲームを Windows 10 向けに移植して、新機能をいくつか追加する方法を示すことで、Unity の開発者が利用できる新たな機能について簡単に説明しました。スペースが限られているため、Windows 10 プラットフォームの新機能をすべて取り上げることができず、基礎とゲームに「必須」の機能に注目しました。優れた没入型ゲームを開発する場合は、デスクトップの新しい通知センター (没入感を高めるため)、Cortana、新しいライブ タイル テンプレート、新しい Xbox Live サービス API などの機能を利用することを検討します。マイクロソフトは、Windows 10 により Xbox Live サービスへの間口を徐々に広げています。必要なのはコンソール ゲームを開発することではなく、Windows 10 で動作するすばらしいゲームを作り、ランキング、実績、クロスデバイス プレイなどのサービスを活用することです。それらのサービスを利用するには、xbox.com/id で ID@Xbox に登録してください。

Visual Studio 2015 Tools for Unity

バージョン 5.2 のリリースから、Unity には Visual Studio 2015 Tools for Unity (VSTU) が導入され、Windows では Visual Studio が Unity プロジェクトの新しい既定のコード エディターになります。この変更により、強化された IntelliSense、エディターでの構文の色分け表示、優秀な C# デバッガーを利用できるようになります。既定のスクリプト エディターを構成するには、Unity Editor で [Edit]、[Preferences] メニュー オプションの順に選択します。MonoDevelop (組み込み)、Visual Studio 2015、Visual Studio 2013 など、さまざまなオプションを選択できます。

VSTU には Unity 向けのコーディングを簡単にするショートカットがいくつかあります。たとえば、MonoBehaviour クラス内で右クリックすると、[Implement MonoBehaviours entry] という新たなエントリがコンテキスト メニューが表示されます。このエントリにより、クラスに MonoBehaviour メソッド シグネチャを簡単に挿入できるようになります。

同じコンテキスト メニューには、[Quick MonoBehaviours] エントリもあります。このエントリも似た機能を実行しますが、操作の邪魔にならないダイアログを表示して、検索するメソッド名を入力してからそのシグネチャを挿入できるようにします。どちらの方法も、ショートカット キー アクセラレーター (Ctrl + Shift + M キーと Ctrl + Shift + Q キー) を使ってすばやくアクセスすることができます。

エディターの強化点以外にも、VSTU を使用するのが最適な特性の 1 つに、効率が向上した Unity Editor とのデバッガー統合があります。Unity プロジェクトを Visual Studio で開くと、通常のデバッグ ツールバーでデバッグを行える、[Unity にアタッチ] ボタンが自動的に表示されます。このボタンをクリックすると、Unity Editor のプロセスを自動的に見つけ、アタッチします。そこからはブレークポイントの設定、変数値の分析など、Visual Studio で行う作業のほとんどをいつものように実行できます。VSTU には、例外による実行停止に対する実験的なサポートもあります。VSTU 2.0 の機能の詳細については、「Visual Studio Tools for Unity 2.0」(英語、bit.ly/VSTUInfo) のブログを参照してください。

注: Visual Studio 2013 を使用していて、 Windows 10 をターゲットにしない場合は、本稿で Visual Studio 2013 Community エディション ユーザー向けに説明した便利な機能をすべて利用できるパッケージをダウンロードできます。この拡張機能は、bit.ly/VSTU2013 からダウンロードできます。


Jamie Rodriguezは、マイクロソフトの Developer Experience Games Evangelism チームのリーダーです。Twitter (@jaimerodriguez、英語) で彼をフォローしたりjaimerodriguez.com (英語) で公開されている彼のブログを読むことができます。

Brian Peekは、マイクロソフトのシニア ゲーム開発エバンジェリストです。彼は熱狂的なゲーマーで、Windows、コンソールなど思いつく限りのプログラミング可能な媒体にゲームを開発してきた経験があります。さまざまな国の開発者カンファレンスで講演する彼を目にすることができます。Twitter* (@BrianPeek、英語) で彼をフォローしたり、brianpeek.com (英語) で公開されている彼のブログを読むことができます。*

この記事のレビューに協力してくれたマイクロソフト技術スタッフの Sanjeev Dwivedi および Adam Tuliper に心より感謝いたします。
Sanjeev Dwivedi は、マイクロソフトのシニア ゲーム開発エバンジェリストです。sanjeev.dwivedi.net (英語) で公開されている彼のブログを読むことができます。

Adam Tuliper は、マイクロソフトのシニア テクニカル エバンジェリストです。Twitter は @AdamTuliper (英語) からフォローできます。