WisdomSoft - for your serial experiences.

プラットフォームの確認

Windows PC、Xbox 360、Windows Phone など、XNA Framework ゲームが実行される環境に応じてコードを選択する方法を説明します。

コードを切り替える

XNA Framework ゲームは、Windows PC、Xbox 360、Windows Phone など多様なデバイスで動作するクロスプラットフォーム環境であることが最大のメリットですが、ウィンドウの制御や、利用できる .NET Framework の機能など、プラットフォームによって制限があったり、動作が異なったりすることがあります。しかし、こうした一部の違いのために、大部分が同じソースコードを個別のプラットフォームごとに用意するのは効率的ではありません。この場では、同じソースコードの中でプラットフォーム固有のコードを書く方法について説明します。

プラットフォーム専用のコードを書く方法は、コンパイル時と実行時によって異なります。コンパイル時に、コンパイルするコードを対象のプラットフォームによって切り替えたい場合は、プリプロセッサディレクティブを用いた条件付きコンパイルを応用します。多くの場合は、この方法でコードを分けることができます。特に、Xbox 360 や Windows Phone 7 の .NET Compact Framework でサポートされていない API を利用する場合、コンパイル時に Windows PC 用のコードと分離しなければコンパイルそのものができません。

実行時に処理を分ける方法は、ゲームを実行しているシステムのプラットフォームを調べ、if 文などを使って切り替えることになります。これは、XNA Framework ではなく .NET Framework でサポートされる、プラットフォームの検出機能を利用します。

コンパイル時の分離

まずは、同一のソースコード内でプラットフォームごとにコードを分離する方法から試してみましょう。Windows 用のプロジェクトと Xbox 360 用のプロジェクトで、コンパイルするコードが自動的に切り替わるように、プリプロセッサディレクティブを使います。

XNA Game Studio のテンプレートから生成されたプロジェクトは、あらかじめ表1のような条件付きコンパイル用のシンボルが定められています。

表1 プロジェクトに応じて定義されるシンボル
プロジェクト シンボル
Windows ゲーム WINDOWS
Xbox 360 ゲーム XBOX, XBOX360
Windows Phone ゲーム WINDOWS_PHONE
Zune ゲーム(4.0以降廃止) ZUNE

Windows ゲームであれば WINDOWS というシンボルが、Xbox 360 用のプロジェクトでは XBOX 及び XBOX360 というシンボルが定義されています。例えば #if ディレクティブを用いて XBOX というシンボルが定義されていれば Xbox 360 用のプロジェクトであると判断してコンパイルすることができます。

コード1
using System.Diagnostics;
using Microsoft.Xna.Framework;

class Test
{
    static void Main(string[] args)
    {
#if WINDOWS
        Debug.WriteLine("Windows project.");
#elif XBOX360
        Debug.WriteLine("Xbox 360 project.");
#endif
    }
}
実行結果
コード2 実行結果

コード1は #if ディレクティブを使って Windowns PC 用のプロジェクトと Xbox 360 用のプロジェクトで出力するテキストを分けています。Debug クラスの WriteLine() メソッドで出力する文字列は、シンボル WINDOWS または XBOX360 が定義されているかどうかでコンパイル時に分けられます。これによって、Windows PC 用のプロジェクトとしてビルドした場合は "Windows project." という文字列の行が、Xbox 360 用のプロジェクトとしてビルドした場合は "Xbox 360 project." という文字列の行がコンパイルされます。

Windows フォームのメニューを付けるなど、フルセットの .NET Framework の機能を使う場合、Xbox 360 や Windows Phone などの端末でソースコードをコンパイルできないので、このようにプリプロセッサディレクティブを用いて、コンパイルする部分コードを選択します。もちろん、コード全体が大きく異なるのであれば、各プラットフォーム用のソースファイルを個別に用意するべきです。

実行時の判定

もう一つの方法として、実行時にシステムの情報を取得し、処理を if 文などで切り替えるという方法があります。この場合、コンパイルするコードは同じなので、Xbox 360 で実装されている .NET Compact Framework の範囲でコードを書かなければなりません。前述したプリプロセッサディレクティブを使ったコンパイル時の分離と組み合わせてもよいでしょう。

プログラムの実行環境に関する情報は、.NET Framework の System.Environment クラスから得られます。

System.Environment クラス
[ComVisibleAttribute(true)] 
public static class Environment

現在のゲームを実行しているシステムの種類やバージョンの詳細は静的な OSVersion プロパティから取得できます。

Environment クラス OSVersion プロパティ
public static OperatingSystem OSVersion { get; }

このプロパティは、プラットフォームの種類やバージョンなどの情報を提供する System.OperatingSystem クラスのオブジェクトを返します。

System.OperatingSystem クラス
[SerializableAttribute] 
[ComVisibleAttribute(true)] 
public sealed class OperatingSystem : ICloneable, ISerializable

OperatingSystem クラスには、プラットフォームの種類を返す Platform プロパティ、バージョンを返す Version プロパティなどが含まれています。

OperatingSystem クラス Platform プロパティ
public PlatformID Platform { get; }
OperatingSystem クラス Version プロパティ
public Version Version { get; }

ゲームを実行しているシステムが Windows なのか Xbox 360 なのかを実行時に識別するには Platform プロパティが返した System.PlatformID 列挙型の値を比較します。

System.PlatformID 列挙型
[SerializableAttribute]
[ComVisibleAttribute(true)]
public enum PlatformID
表2 PlayformID 列挙型のメンバ
メンバ プラットフォーム
Win32S 16 ビット版Windows上の 32 ビット互換環境。Windows 3.1 を表す。
Win32Windows Windows 9x シリーズ。Windows 95、Windows 98、Windows 98 Second Edition、Windows ME を表す。
Win32NT Windows NT 以降。Windows 2000、Windows XP、Windows Vista、Windows 7 などを表す。
WinCE 組み込み用の Windows CE を表す。Windows Mobile や Windows Phone などを表す。
Unix Unix 系のシステムを表す。
Xbox Xbox 360 を表す。
MacOSX Mac OS を表す。

表2のうち、XNA Framework ゲームが動作できる環境で得られる値は限られています。Windows PC 上で実行されるゲームであれば Win32NT メンバ、Xbox 360 上で実行されるゲームであれば Xbox メンバ、Windows Phone 上で実行されるゲームであれば WinCE に一致します。

コード2
using System;
using System.Diagnostics;
using Microsoft.Xna.Framework;

class Test
{
    static void Main(string[] args)
    {
        OperatingSystem os = Environment.OSVersion;
        Debug.WriteLine("PlatformID=" + os.Platform);
        Debug.WriteLine("Version=" + os.Version);
    }
}
実行結果
コード2 実行結果

コード2はゲームを実行しているシステムを表す PlatformID の値とバージョンを出力します。ゲームの実行環境によって、出力される PlatformID やバージョンの値が異なります。これらの値を比較し、if 文などで分岐させることで、プラットフォームごとに処理を切り替えることができます。