WisdomSoft - for your serial experiences.

9.5 ゲーマー情報

ゲームにサインインしているユーザー情報はゲーマータグによって管理されています。ゲーマータグを調べることで、ユーザーを一意に識別できます。

9.5.1 ゲーマータグの取得

サインインしているプレイヤーのアカウントは、一意のゲーマータグを持っています。ゲーマータグは、一種のハンドルネームとして用いられるため、オンライン対戦やフォーラムなどで表示に使われます。LIVE に接続するアカウントであれば、ゲーマータグが他のアカウントと重複することはありません。よって、ゲーマータグを使ってプレイヤーを一意に識別できます。

図1 ゲーマーのプロフィール
図1 ゲーマーのプロフィール

XNA Framework では、ゲーマータグを持つすべてのプレイヤーをゲーマーとして Microsoft.Xna.Framework.GamerServices.Gamer クラスで表します。ゲーマーは、システムにサインインしているゲーマーに加えて、フレンドやネットワーク上の対戦相手など、いくつかの種類に分かれます。Gamer クラスは、こうしたゲーマーを表す抽象基底クラスとなります。

Microsoft.Xna.Framework.GamerServices.Gamer クラス
public abstract class Gamer

ローカルシステムにサインインしているゲーマーは、静的な SignedInGamers プロパティが返すコレクションから取得できます。

Gamer クラス SignedInGamers プロパティ
public static SignedInGamerCollection SignedInGamers { get; }

このプロパティは、サインインしているゲーマーのコレクションを提供する Microsoft.Xna.Framework.GamerServices.SignedInGamerCollection クラスのオブジェクトを返します。

Microsoft.Xna.Framework.GamerServices.SignedInGamerCollection クラス
public sealed class SignedInGamerCollection : GamerCollection<SignedInGamer>

このクラスの基底クラスとなっている GamerCollection クラスは、ReadOnlyCollection クラスを継承する任意の数のゲーマーを管理するためのコレクションです。型パラメータは Gamer 型に制約されていることを除けば、基本的には ReadOnlyCollection クラスの機能を踏襲しています。foreach 文を使えば、サインインしているすべてのゲーマーを取得できます。

foreach (SignedInGamer gamer in Gamer.SignedInGamers)
{
	//サインインゲーマーに対する処理
}

他の一般的なコレクションと同じように、インデクサから個別の要素をインデックスで取り出すことができますが、加えて PlayerIndex 列挙型を使ってサインインしているゲーマーを指定するこもできます。ローカルシステムにサインインできるプレイヤー数は最大で 4 人までなので、反復処理を行わないのであれば PlayerIndex 列挙型を使ってプレイヤー番号を指定する方法が確実です。

SignedInGamerCollection クラスのインデクサ
public SignedInGamer this [
         PlayerIndex index
] { get; }

index パラメータには、サインインしているプレイヤーのインデックスを指定します。インデクサは、指定したプレイヤーに対応する Microsoft.Xna.Framework.GamerServices.SignedInGamer クラスのオブジェクトを返します。プレイヤーがサインインしていなければ null を返します。第1プレイヤーを取得するコードは、次のようになるでしょう。

SignedInGamer gamer = Gamer.SignedInGamers[PlayerIndex.One];

SignedInGamer クラスは Gamer クラスを継承するゲーマーの具現クラスの 1 つで、サインインしているプレイヤーを表します。

Microsoft.Xna.Framework.GamerServices.SignedInGamer クラス
public sealed class SignedInGamer : Gamer

ゲーマータグは Gamertag プロパティから取得できます。このプロパティは Gamer クラスで宣言されているものなので、Gamer の派生クラスは必ずゲーマータグを持ちます。

Gamer クラス Gamertag プロパティ
public string Gamertag { get; }

このプロパティは、ゲーマータグを表す文字列を返します。ゲーマータグをどのように利用するかは自由ですが、ネットワーク対戦ゲームなどで、それぞれのプレイヤーを識別するテキストとして表示するといった使い方ができるでしょう。ゲーマータグには英数字しか使えないため、特殊な文字が紛れ込むこともありません。

コード1 (Win, Xbox 360, Zune)
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.GamerServices;

public class Test : Game
{
    public static void Main(string[] args)
    {
        using (Game game = new Test()) game.Run();
    }

    private GraphicsDeviceManager graphicsDeviceManager;
    private SpriteBatch sprite;
    private SpriteFont font;
    private string text;

    public Test()
    {
        graphicsDeviceManager = new GraphicsDeviceManager(this);
        Components.Add(new GamerServicesComponent(this));
    }

    protected override void LoadContent()
    {
        sprite = new SpriteBatch(GraphicsDevice);
        font = Content.Load<SpriteFont>("Content/TestFont");
        base.LoadContent();
    }

    protected override void Update(GameTime gameTime)
    {
        text = "Please sign in...\n";
        foreach (SignedInGamer gamer in Gamer.SignedInGamers)
            text += gamer.PlayerIndex + "=" + gamer.Gamertag + "\n";

        base.Update(gameTime);
    }

    protected override void Draw(GameTime gameTime)
    {
        GraphicsDevice.Clear(Color.White);

        sprite.Begin();
        sprite.DrawString(font, text, Vector2.Zero, Color.Black);
        sprite.End();
        
        base.Draw(gameTime);
    }
}
実行結果
コード1 実行結果

コード1は、サインインしているプレイヤーのゲーマータグを表示するプログラムです。Update() メソッドで SignedInGamers プロパティが返すコレクションを foreach 文で処理し、プレイヤー番号とゲーマータグを組み合わせた文字列を text フィールドに加えています。プレイヤー番号は、PlayerIndex プロパティから取得しています。

SignedInGamer クラス PlayerIndex プロパティ
public PlayerIndex PlayerIndex { get; }

このプロパティは、サインインしているゲーマーのプレイヤー番号を返します。

9.5.2 ゲーマープロフィール

ゲーマーの詳細情報はゲーマープロフィールに保存されています。ゲーマープロフィールは、Web の Xbox 公式ページや Xbox 360 で表示や変更が可能なゲーマーに関する情報です。よく、ゲーマータグと合わせて表示されているゲーマーのアイコン、評判、スコア、ゾーンといった情報を取得できます。オンライン対戦ゲームで、ゲーマープロファイルからアイコンを取得してゲームで使うというような応用が可能です。

プロフィールを取得するには GetPfoile() メソッドを使います。

Gamer クラス GetProfile() メソッド
public GamerProfile GetProfile ()

このメソッドは、ゲーマーのプロフィールを提供する Microsoft.Xna.Framework.GamerServices.GamerProfile クラスのオブジェクトを返します。

Microsoft.Xna.Framework.GamerServices.GamerProfile クラス
public sealed class GamerProfile : IDisposable

このクラスのプロパティから、プロフィールに関する情報を細かく得ることができます。

ゲーマーのアイコンは GamerPicture プロパティから取得します。

GamerProfile クラス GamerPicture プロパティ
public Texture2D GamerPicture { get; }

アイコンは 64 × 64 ピクセル Texture2D オブジェクトとして返されるため、テクスチャとして描画できます。

Xbox 360 の魅力的な機能の 1 つに実績があります。実績は、個々のゲームタイトルごとに定められた条件を満たすと解除され、ゲーマープロフィールに数値として加算されていきます。この値をゲーマースコアと呼びます。プレイヤーが、どれほどゲームをプレイしているかの指標として使えます。ゲーマースコアを取得するには GamerScore プロパティを使います。

GamerProfile クラス GamerScore プロパティ
public int GamerScore { get; }

このプロパティは、ゲーマースコアを表す整数を返します。

ゲーマープロフィールは、モットーと呼ばれる自由入力による行動指針を表すテキストを持ちます。モットは最大で 21 文字までの任意の文字列で、簡単な自己紹介文などが入力されています。モットーを取得するには Motto プロパティを使います。

GamerProfile クラス Motto プロパティ
public string Motto { get; }

このプロパティは、モットーを表す文字列を返します。モットーには英数字以外も入力できるため、SpriteFont で描画する場合には注意が必要です。

自分自身のゲームスタイルを表すゲーマーゾーンと呼ばれる設定も存在します。ゲーマーゾーンを取得するには GamerZone プロパティを使います。

GamerProfile クラス GamerZone プロパティ
public GamerZone GamerZone { get; }

このプロパティは、ゲーマーゾーンを表す Microsoft.Xna.Framework.GamerServices.GamerZone 列挙型の値を返します。

Microsoft.Xna.Framework.GamerServices.GamerZone 列挙型
public enum GamerZone

この列挙型には、勝ち負けを重視し全力でゲームに打ち込む Pro メンバ、勝ち負けにはこだわらず楽しむことを優先する Recreation メンバ、子供や家庭向けを表す Family メンバ、自由なプレイスタイルでスリルを求める Underground メンバ、そして、ゾーンが不明であることを表す Unknown メンバが定義されています。

ゲーマーが所属する地域の情報は Region プロパティから取得できます。地域情報に従って表示する言語を変更するなどの応用が可能です。

GamerProfile クラス Region プロパティ
public RegionInfo Region { get; }

このプロパティは、地域情報を提供する RegionInfo クラスのオブジェクトを返します。地域情報の詳細は .NET Framework の System.Globalization 名前空間の管轄となるため、本書では割愛させていただきます。

LIVE ネットワークと通して一緒に遊んだプレイヤーからの評価によって、ゲーマーの評判が設定されます。評判は 5 段階の星マークとして表示されているもので、他のプレイヤーから好ましいプレイヤーと判断されれば評価が上がります。ゲーマーの評判は Reputation プロパティから取得できます。

GamerProfile クラス Reputation プロパティ
public float Reputation { get; }

このプロパティは、0 ~ 5 までの範囲で評価を表す値を返します。

コード2 (Win, Xbox 360, Zune)
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.GamerServices;

public class Test : Game
{
    public static void Main(string[] args)
    {
        using (Game game = new Test()) game.Run();
    }

    private GraphicsDeviceManager graphicsDeviceManager;
    private SpriteBatch sprite;
    private SpriteFont font;
    private GamerProfile profile;
    private string text;

    public Test()
    {
        graphicsDeviceManager = new GraphicsDeviceManager(this);
        Components.Add(new GamerServicesComponent(this));
    }

    protected override void LoadContent()
    {
        sprite = new SpriteBatch(GraphicsDevice);
        font = Content.Load<SpriteFont>("Content/TestFont");
        base.LoadContent();
    }

    protected override void Update(GameTime gameTime)
    {
        SignedInGamer gamer = Gamer.SignedInGamers[PlayerIndex.One];
        if (gamer != null)
        {
            if (profile == null) profile = gamer.GetProfile();

            string stars = "";
            for (int i = 0; i < profile.Reputation; i++) stars += "★";

            text = gamer.Gamertag + " " + stars + "\n";
            text += "Score=" + profile.GamerScore + "\n";
            text += "Region=" + profile.Region + "\n";
            text += "Zone=" + profile.GamerZone;
        }
        else
        {
            profile = null;
            text = "";
        }

        base.Update(gameTime);
    }

    protected override void Draw(GameTime gameTime)
    {
        GraphicsDevice.Clear(Color.White);

        if (profile != null)
        {
            sprite.Begin();
            sprite.Draw(profile.GamerPicture, Vector2.Zero, Color.White);
            sprite.DrawString(
                font, text,
                new Vector2(0, profile.GamerPicture.Height), Color.Black
            );
            sprite.End();
        }
        
        base.Draw(gameTime);
    }
}
実行結果
コード2 実行結果

コード2は、サインインしている第 1 プレイヤーのゲーマープロフィールを表示するプログラムです。ゲーマータグに加えて、アイコン、ゲーマーの評判、スコア、地域、ゾーンを表示します。ゲーマーの評判を表す Reputation プロパティの値は float 型ですが、この場では簡単にテキストで星マークを表示するため小数点以下は無視するものとします。

9.5.3 ゲームの初期設定

ゲーマーは、ゲームの初期設定と呼ばれる新しくプレイするゲームに望ましい初期設定を持っています。一般的なゲームタイトルは、そのゲームの内容に従って難易度などプレイヤーが選択可能なオプションを持ちます。プレイヤーが設定した情報は、もちろんゲームが独自に設定データとしてストレージに保存しますが、最初にゲームをプレイするときに望むデフォルトの設定がゲームの初期設定となります。ゲームの種類によっても、この情報が使えるかどうか異なりますが、ゲームは可能な限りゲームの初期設定を利用するべきです。

ゲームの初期設定を取得するには GameDefaults プロパティを使います。

SignedInGamer クラス GameDefaults プロパティ
public GameDefaults GameDefaults { get; }

このプロパティは、ゲームの初期設定を表す Microsoft.Xna.Framework.GamerServices.GameDefaults クラスのオブジェクトを返します。このクラスのプロパティから、いくつかの設定項目に関連する初期設定とするべき値を取得できます。

Microsoft.Xna.Framework.GamerServices.GameDefaults クラス
public sealed class GameDefaults

ゲーマーが推奨する初期設定の項目は、大きく分けて「共通」「アクション」「レーシング」に分類されています。ゲーム全般に使える共通設定には、難易度や色、コントローラの感度などがあります。アクションゲーム向けでは Y 軸反転や自動照準に関する設定などがあり、レーシングゲーム向けにはマニュアル変速かどうかや、好ましいカメラアングルなどの設定が用意されています。

ゲームのジャンルに関係なく、多くのゲームが共通して持つ設定項目に難易度が考えられるでしょう。ゲームの難易度に関するデフォルト値は GameDifficulty プロパティから取得できます。

GameDefaults クラス GameDifficulty プロパティ
public GameDifficulty GameDifficulty { get; }

このプロパティは、ゲームの難易度を表す Microsoft.Xna.Framework.GamerServices.GameDifficulty 列挙型の値を返します。

Microsoft.Xna.Framework.GamerServices.GameDifficulty 列挙型
public enum GameDifficulty

この列挙型は、平均よりもやさしい難易度を表す Easy メンバ、平均的な難易度を表す Normal メンバ、平均よりも難しい難易度を表す Hard メンバを定義しています。ゲームが、これ以外の難易度を持つことは自由ですが、これらのメンバが表す意味に相応しい難易度を選択してください。

プレイヤーが好む色を取得することもできます。この色をどのように使うかはゲームの自由ですが、対戦型のテーブルゲームなどで、優先的にプレイヤーを識別する色に割り当てるなどの応用が可能でしょう。プレイヤーがもっとも好む色は  PrimaryColor プロパティから、2 番目に好む色は SecondaryColor プロパティから取得できます。

GameDefaults クラス PrimaryColor プロパティ
public Nullable<Color> PrimaryColor { get; }
GameDefaults クラス SecondaryColor プロパティ
public Nullable<Color> SecondaryColor { get; }

これらのプロパティは、プレイヤーが好む色を表す Color 構造体の値を返します。色が「なし」に設定されている場合は null が返されます。

コントローラの感度は ControllerSensitivity プロパティから取得できます。

GameDefaults クラス ControllerSensitivity プロパティ
public ControllerSensitivity ControllerSensitivity { get; }

このプロパティは、コントローラの感度を表す Microsoft.Xna.Framework.GamerServices.ControllerSensitivity 列挙型の値を返します。スティック入力で操作できる視点の移動速度などに応用できます。

Microsoft.Xna.Framework.GamerServices.ControllerSensitivity 列挙型
public enum ControllerSensitivity

この列挙型には、平均以下の感度を表す Low メンバ、平均的なコントローラの感度を表す Medium メンバ、平均以上の感度を表す High メンバが定義されています。

コード3 (Win, Xbox 360, Zune)
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.GamerServices;

public class Test : Game
{
    public static void Main(string[] args)
    {
        using (Game game = new Test()) game.Run();
    }

    private GraphicsDeviceManager graphicsDeviceManager;
    private SpriteBatch sprite;
    private SpriteFont font;
    private Color backgroundColor, textColor;
    private string text;

    public Test()
    {
        graphicsDeviceManager = new GraphicsDeviceManager(this);
        Components.Add(new GamerServicesComponent(this));
        backgroundColor = Color.White;
        textColor = Color.Black;
    }

    protected override void LoadContent()
    {
        sprite = new SpriteBatch(GraphicsDevice);
        font = Content.Load<SpriteFont>("Content/TestFont");
        base.LoadContent();
    }

    protected override void Update(GameTime gameTime)
    {
        SignedInGamer gamer = Gamer.SignedInGamers[PlayerIndex.One];
        if (gamer != null)
        {
            text = gamer.Gamertag + "\n";
            text += "Difficulty:" + gamer.GameDefaults.GameDifficulty + "\n";
            text += "ControllerSensitivity:" + gamer.GameDefaults.ControllerSensitivity;

            if (gamer.GameDefaults.PrimaryColor != null)
                backgroundColor = gamer.GameDefaults.PrimaryColor.Value;
            if (gamer.GameDefaults.SecondaryColor != null)
                textColor = gamer.GameDefaults.SecondaryColor.Value;
        }
        else text = "Please sign in...";

        base.Update(gameTime);
    }

    protected override void Draw(GameTime gameTime)
    {
        GraphicsDevice.Clear(backgroundColor);

        sprite.Begin();
        sprite.DrawString(font, text, Vector2.Zero, textColor);
        sprite.End();

        base.Draw(gameTime);
    }
}
実行結果
コード3 実行結果

コード3は、サインインしている第1プレイヤーのゲーマータグに設定されている初期設定を表示するプログラムです。テキストでゲーマータグと難易度、コントローラの感度が表示されます。また、プレイヤーが好む色を背景とテキストの色として利用しています。