Welcome to MSDN Blogs Sign in | Join | Help

コミュニティゲームへのゲーム投稿 その3

今回は投稿されたゲームのピアレビューの詳細を説明します。ピアレビュー(Peer Review)のピアとは日本では聞き慣れない言葉ですが、仲間、同僚といった意味があります。ちなみにネットワーク形態の1つでP2Pと呼ばれているピア・ツー・ピア(Peer-to-Peer)のピアも同じ意味です。

 

ピアレビューでは大まかに分けて以下の4つについてレビューをします。

  • 投稿されたゲームの情報が正しいものか
  • ゲームが正常動作するか
  • 禁止事項に反していないか
  • ゲーム投稿者のClassfication(分類)が妥当なものか

 

クリエータークラブオンラインにプレミアムアカウントでログインしている場合、ゲームカタログにはレビュー中のゲームが以下の様にIn Review状態で表示されます。

image

ここで、review this gameをクリックすることで、以下のレビュー規約画面が表示されます。

image

実際にピアレビューをするには以下の条件が整っていることが要求されます。

  • このゲームを評価できる年齢であること
  • ゲーム中に表示されている文字、台詞等が理解できること
  • レビューするゲームの開発に携わっていないこと
  • 真実のみを記載すること
  • このレビューをすることによって、賄賂や贈り物など、利益になるようなものを受けとらないこと
  • ゲーム投稿者にとって有益なコメントをすること
  • 例え嫌いなゲームであっても、公平なレビューをすること

 

これらの規約を読んだ上で同意することを示す「I have read and accept the peer review agreement」のチェックボタンをチェックしてから、START REVIEWボタンを押すと、最初のピアレビュー画面が表示されます。

ここでは、ゲームの情報、ダウンロード、スクリーンショットや動画、そしてゲームの不具合を報告する項目が表示されます。

 

image 
クリックすると元の大きさで表示されます。

 

この画面で最初にすることは、ダウンロードセクションのDOWNLOADボタンを押してccgameファイルをダウンロードすることです。Xbox 360用のゲームの場合、ccgameファイルを展開するときにXbox 360上でXNA Game Studio Connectを起動して接続待機画面にするのを忘れないでください。

image

 

ダウンロードした後、Xbox 360用ゲームの場合はゲームライブラリ画面に移動して、そこに表示されているサムネイルや、ゲーム情報が正しいものか確認します。もし、ゲームライブラリ画面に表示されているもと、ウェブブラウザ上に表示されている情報に食い違いがある場合は下のセクションの「Game info or description is inaaproriate for Xbox LIVE marketplace」をチェックします。

image

次に実際にゲームをプレイして、ゲームが正しく動作するかを確認します。ゲームがクラッシュしたり固まったり、もしくはゲームをプレイできる状態ではない場合、「This game crashes or freezes; the game is unplayable」の項目をチェックします。そして、実際のゲーム内容がゲーム情報や、スクリーンショット、動画などと違う場合は「The info in the Game Infor section does not correctly describe this game」をチェックします。その場合、ゲーム投稿者に問題箇所を説明するコメントを書く必要があります。

image

 

以上の項目を入力したら、画面下にあるNEXTボタンを押して、禁止事項の確認画面に移動します。以下の禁止事項に反している場合は、該当する項目をチェックしてコメントを入力します。

image

 

原文
個人情報の収集 Collecting personal information
全裸 Nudity
強すぎる性表現 Strong sexual content
児童ポルノ Child pornography
実在する個人、または団体への誹謗中傷など Direct threats to a person or groups of people in the physical world
実社会での違法行為を直接的に奨励、勧誘するもの Direct encouragement/solicitation of illegal behavior in the physical world
人道に反する犯罪、激しい不快を与える画像や、暴力 Crimes against humanity and/or intense and distasteful graphical violence
承認されていないコンテントの使用 Unauthorized content use

 

最後にClassification画面で、ゲーム投稿者の自己評価が実際のゲーム内容と食い違っていないかを確認します。これらの項目の詳細は前回と同じものです。もし、ゲーム投稿者の自己評価と違う場合は、スライダーを動かして評価を変更します。

image

全ての項目を入力し終わり、画面下のNEXTボタンを押すと、Classification画面での評価結果が表示されます。ここでゲームを実際にプレイして、正しい評価をしましたよという意味の「I confirm that i have played this game and that this review is accurate」をチェックしてSUBMIT REVIEWボタンを押してレビュー内容を投稿します。

image

 

投稿されたゲームは、こうやってレビューされ、一定のレビュー数を通過した後に合格となり、その約48時間後にマーケットプレースに配信されるようになります。

コミュニティゲームへのゲーム投稿 その2

今回は作成したゲームの投稿の仕方を紹介します。投稿できる形式はccgameファイル形式で、これはVisual Studio上のメニューからビルド/Package {プロジェクト名} as XNA Creators Club Gamesを選択することで生成されます。

 

XNA Creators Club Onlineのトップ画面の上方にあるメニューからGames/submit gameを選択します。

image

この時に下の様なプロジェクト編集画面になります。もし、この画面が表示されなかった場合は、プレミアムアカウントでサインインしていない可能性があります。

image

画面の右上にはクリエータータグが表示されるので、正しいタグじゃない場合(Hi Visitorと表示されるので)はSign Inのボタンを押して正しいアカウントでサインインする必要があります。もし、正しいタグが表示されているけど投稿できない場合は、プレミアムアカウントとして設定されていない可能性があるので、前回の記事を参考にしてプレミアムアカウントを作る必要があります。

 image

 

 

プロジェクトとリリースの追加

プロジェクト編集画面では、プロジェクトとリリースの追加ができます。プロジェクトとリリースの違いですが、プロジェクトはゲーム自体を表し、リリースは複数の地域、プラットフォームを表します。例えば、同じゲームでも北米版、日本語版といった地域別のリリースがあったり、Xbox 360版、Windows版といったプラットフォーム別にリリースできるように設計されています。現在は北米地域、Xbox 360版のみのリリースができますが、将来的には複数の地域、プラットフォームでリリースできる予定です。

また、現在は実装されていませんが、バグフィックスなどによるゲームの更新もここで行えるようになります。

プロジェクト編集画面でADD PROJECTボタンを押すと以下のようにプロジェクトの詳細編集画面が表示されます。

 image

ここで設定できる項目は以下の4項目です。

  • Project
    • プロジェクト名
  • genre
    • ゲームのジャンル
  • default language
    • デフォルトの言語(現在は英語のみ)
  • default description
    • ゲームの詳細説明

これらの項目を入力してからDONEボタンを押すことでプロジェクトを追加することができます。

 image

表示されているプロジェクトのADD RELEASEボタンを押すことでリリース編集画面に変わります。

リリース編集画面では、以下の4つのセクションに分かれています。

  • Game Info
    • 配信先とプラットフォームの指定
  • Classification
    • ゲーム内表現の分類
  • Media
    • ゲームのスクリーンショットや動画のアップロード
  • Game Upload
    • ゲームパッケージのアップロード

 

image 
クリックすると別ウィンドウで表示されます。

 

Game Infoセクションでは、ゲームの配信先地域の指定や、プラットフォームの指定ができます。ベータ版では地域は米国のみ、プラットフォームはXbox 360となっています。

Classificationセクションでは、ゲーム内での表現についての分類を設定します。CEROレーティングを自己申告するようなものですが、この分類方法は配信先の国の法律によって変わることに注意が必要です。日本地域の場合はCERO、北米地域の場合はESRB、ヨーロッパ圏でのPEGIを基準にしたものになると思われます。ここでは、北米地域への配信するための分類を紹介します。

 

image

分類は暴力表現、性的表現、成人向け表現の3つカテゴリがあり、合計11項目あります。それぞはスライダーバーで0~3までの4段階評価になっています。

以下は、それぞれの項目の訳文と原文です。

 

暴力表現

ここでは出血、殺傷、敵対、そして残虐の4項目があります。

 

出血表現(Blood)

  訳文 原文
0 血の表現はゲーム中にはありません。 No blood appears in the game at all.
1 血の表現はゲームの背景にたまにある程度ですか、傷害等による流血表現はありません。 Occasionally blood appears in the background, but no blood is visible as a result of injuries.
2 怪我による人間、またはそれ以外の生物の流血表現がありますが、その量はゲーム全体の40%以下です。 Injuries cause the shedding of human or non-human blood, but it is less than 40% of the in-game experience.
3 ゲーム中、常に血しぶきや血だまりといった血の表現があります。 The game consistently display bloody imagery such as blood splattering or pools of blood.

 

殺傷表現(Injuries)

  訳文 原文
0 ゲーム中のキャラクターや生物等が傷害を受けることはありません。 No character or creature of any kind is injured during game play.
1 ゲーム中のキャラクター、または生物等が、死に至らない傷害を受けるが、その表現は控えめなものです。 Characters or creatures sustain non-life-threatening wounds without excessive or graphic description.
2 ゲーム中のキャラクターや生物等が負傷し、その負傷による明らかな痛みが発生し、そして死に至る場合もあります。もし、人間型のキャラクターが負傷によって死に至る表現がある場合は、この項目の評価は最低でも2以上にする必要があります。 Characters or creatures sustain wounds. These wounds clearly cause of pain or death. If a humanoid character's death from injuries is visually depicted in this game, you must rate this game at least a 2.
3 ゲーム中のキャラクターや生物等が、肢体や頭部を切断、切除、または不具にされるといった傷害を受けます。ゲーム中のキャラクターや生物等が残虐的な傷によって苦しむ表現があります。 Characters or creatures suffer dismemberment, maiming, decapitation, or mutilation. Characters or creatures may suffer particularly gory wounds.

 

敵対表現(Hostility)

  訳文 原文
0 敵対行為や衝突といった表現はこのゲームにはありません。 No hostility or conflict between characters is show in this game.
1 プレイヤーキャラクターは、他のキャラクターから怒りや憎しみの感情を受けず、またプレイヤーキャラクターが他のプレイヤーと対立し、怒りや憎しみの感情を他のキャラクターにむけたりすることはゲームでは必須ではありません。 Your character does not experience any hate or anger from another character, nor does the game require your character to confront or express any hate or anger toward another character.
2 プレイヤーキャラクターは、軽度の敵対心を表したり、他のキャラクターからの軽度の敵対心、または怒りなどの感情を受けますが、そのことによって暴力行為が発生することはありません。 Your character expresses mild hostility, or experiences mild hostility or anger from other characters. It does not lead to violence.
3 敵対心や、怒りはこのゲームの主となる要素であり、暴力行為を促すものです。 Hostility or anger are key elements of the game, and lead to violence.

 

残虐性(Cruelty)

  訳文 原文
0 このゲームに残虐、残酷的表現はありません。 This game does not exhibit any cruel behavior.
1 キャラクターは罵声や、あざけり等の言葉を他のキャラクターに浴びせ、、または他のキャラクターから受けるが、身体的な残虐、残酷行為はありません。 Characters use verbal or mocking taunts, or may experience them, but there is no physical cruelty.
2 キャラクターはいわれのない侮辱、いじめ、威嚇、もしくは軽度の傷害を他のキャラクターに与え、または他のキャラクターから受けますが、死に至ることはありません。 Characters use or experience gratuitous insults, bullying, intimidation, or otherwise be slightly injured, but they are not killed.
3 キャラクターがゲーム本来の戦闘以外で、罪のない人達や傍観者に対して故意に重傷を負わせたり、殺害したりすることができます。もし、罪の無い人達を殺害することができるのなら、この項目は3にする必要があります。 Characters participate in purposeful severe injury or killing of innocent bystanders outside of designated game combat. If you action can kill innocent bystanders, you must rate this game a 3.

 

 

性的表現

ここでは、性的表現、肌の露出の2つの項目を設定します。

 

性的表現(Sexual Overtones)

  訳文 原文
0 このゲームに性的表現はありません。 There are no sexual overtones in this game at all.
1 性行為、恋愛、接吻、抱擁などにかんする間接的、もしくは言葉による暗喩があるが、直接的に性的な言葉や、画像はありません。性行為や恋愛が含まれる場合、ゲームプレイには直接関与せず、あくまでも周辺的な要素です。 There are indirect or light verbal references to sex, romance, kissing, or hugging, but there is no reference to sexual words or imagery. Sex and romance are peripheral to the game play.
2 性行為、恋愛、接吻、抱擁などに関する直接的、もしくは言葉による表現がります。もし、キャラクターが他のキャラクターをデートに誘うような表現があれば、この項目を2以上にする必要があります。 There are direct verbal references to sex or romance, characters kissing, or hugging. If your character is required to ask another character out on a date, you must rate this game at least a 2.
3 直接的な性行為表現があります。性行為を追い求めるような表現を含む性的表現がゲーム中常にあります。もし、ゲーム中に売春・買春についての表現があるのなら、この項目は3にする必要があります。 There are direct references to the physical activities of sex. The game constantly refers to sexual themes or innuendos. It includes the explicit pursuit of sex. If this game depicts prostitution, you must rate this game a 3.

 

肌の露出(Partial Nudity)

  訳文 原文
0 このゲームには作中に登場する絵画などを含めて、全裸、半裸の表現はありません。 There are no depictions of the human body unclothed or partially unclothed, including depictions in artwork.
1 肌を若干露出する衣服(半ズボンやタンクトップなど)、もしくは彫像や絵画による抽象的な裸体表現があります。 Clothing is modestly revealing (such as shorts, tank top) or there is some abstract exposure to nudity such as statues or artwork.
2 短い時間、男性または女性の臀部、女性の胸の一部、もしくは露出度の高い衣服(ビキニ下着など)が、表示されることがあります。 For brief periods of time, there is exposure of male or female buttocks, partial female breasts, or revealing clothing (such as bikini underwear).
3 長い時間、男性または女性の臀部、女性の胸の一部、もしくは露出度の高い衣服(ビキニ下着など)が、長い間表示されることがあります。さらに、これらの露出表現はゲームの進行にあたって上避けられないものです。 There is prolonged exposure of male or female buttocks or partial female breasts and such exposure is unavoidable part of game play.

 

 

成人向け表現 

ここでは、薬物の使用、攻撃的な言葉、賭博、粗野な行為、そして恐怖、ホラーの5項目を設定します。

 

薬物の使用(Substance Use)

  訳文 原文
0 薬物(アルコール、たばこ、麻薬)の使用、生成、言及はゲーム中に一切ありません。 There are no substances (such as alcohol, cigarettes, or drugs) are used, created, or referenced by any character or game element.
1 薬物についての言及はありますが、ゲーム中には登場しません。 Substances are referenced by character or other game elements, but are not present in the game world.
2 薬物は実際にゲームの世界に存在していて、プレイヤーが操作するキャラクターやそれ以外のキャラクターが使用します。 Objects exists in the game world that can be used as substances, and are used by your character or other characters.
3 ゲーム中のキャラクターが薬物の使用、生成、もしくは配布に直接関わっています。また、それらの表現がゲーム中に多く登場します。 Your character directly participates in the use, creation, or distribution of substances. Substances are a pervasive part of game play.

 

攻撃的な言葉(Offensive Language)

  訳文 原文
0 攻撃的な言葉による表現はありません。 There is no offensive or potentially offensive language.
1 ある程度の品位を損なう、もしくは卑劣な言葉がありますが、下品、もしくは冒涜的な言葉はありません。 There is some mean-spirited or demeaning language, but no vulgarity or profanity.
2 下品、もしくは冒涜的な言葉がある程度使われます。 There is some occasional profanity or vulgarity.
3 下品、もしくは冒涜的な言葉が常に使われます。 Vulgarity and profanity are commonly expressed.

 

賭博(Gambling)

  訳文 原文
0 賭博や賭け事に関する表現はありません。 There is no depiction of gambling or wagering activity in the game.
1 金品などを賭の対象にしない等、現実世界では存在しない賭博行為による表現があります。 Character engage in fantasy gambling - games that are not associated with real-world games of chance.
2 合法、非合法に関わらず、ゲームプレイの一部として賭博や賭け事がありますが、それらはゲームの主な目的ではありません。 Characters engage in organized or illegal gambling or wagering as part of the game play, but gambling is not the primary game experience.
3 賭博や賭け事が主なゲームプレイです。実在する賭博ゲームのシミュレーションが含まれます。 Gambling or wagering is the primary game experience. There are simulations of actual games of chance.

 

粗野な行為(Crudity)

  訳文 原文
0 粗野な行為はありません。 There is nothing crude or distasteful to polite company.
1 キャラクターはゲップなど、なんらかの子供じみた行動をします。 Characters exhibit some juvenile behavior, such as belching.
2 キャラクターは嘔吐します。ゲップやおならと言った行為や粗野なユーモアがあります。 Characters vomit; there are displays of bodily functions or crude humor.
3 キャラクターは激しく嘔吐します。不快な排泄行為や下品なジェスチャーがあります。 Characters vomit excessively; there are distasteful displays of bodily functions or vulgar gestures.

 

恐怖、ホラー(Fear/Horror)

  訳文 原文
0 恐怖やホラー表現はありません There is no fear or horror featured as part of this game.
1 限定された条件で幽霊と遭遇するなど、一場面だけ恐怖またはホラー表現があります。 One scene of fear or horror is included in the game, such as a limited encounter with ghosts.
2 一定のシーンでプレイヤーが恐怖感を感じるようにゲームがデザインされています。 The game is designed to cause fear or distress in the player during certain sequences.
3 プレイヤーに恐怖や苦悩を感じさせるのがゲームの主な目的です。ゲーム内には、複数の恐ろしい状況や映像があります。 The game is primarily designed to cause fear, distress, and terror in the player. the game uses several horrific situation or images.

 

 

メディアファイルのアップロード

Classificationセクションの次はスクリーンショットや動画をアップロードする為のMediaセクションがあります。

 image

スクリーンショットはファイルサイズが2MBまでのJPGやPNG形式のファイルを3つまでアップすることができます。動画はMSN Soapboxに投稿した動画のURLを指定することができます。

 

CCGAMEパッケージのアップロード

そして最後はゲームをアップロードするためのGame Uploadセクションです。

 image

ここではファイルサイズが150MBまでの.ccgameファイルをアップロードすることができます。.ccgameファイルはゲーム本体やメディアを圧縮したパッケージなので、実際のゲームサイズが150MB以上でも、.ccgameファイルのサイズ自体が150MB以下であればアップロードすることができます。

 

ピアレビュープロセスへの登録

ここまでの項目を設定したら、画面最下部にあるSAVE DRAFTボタンを押すと、プロジェクト編集画面に戻ります。この画面で今編集したリリース(United States : Xbox 360)がPending状態になっているはずです。

image

この状態ではまだレビューが開始されていない状態なので、ここでSUBMIT FOR REVIEWボタンを押すことで以下の契約事項確認画面が表示され、I AGREEボタンを押すことで初めてピアレビュープロセスへの登録が完了します。

image

この後、数分でアップロードしたファイルのチェック(Xbox 360用のパッケージかウィルスなどの感染チェック)などが機械的に行われた後、Creators Club Onlineサイト上に表示され、ピアレビューが開始します。そして、ある一定数のレビューを通過した場合、その約48時間後にはマーケットプレースに配信されます。

 

Classificationセクションでの細かい設定を除けば、単にccgameファイルをアップするだけで簡単に作ったゲームを投稿することができます。

 

 

次回は、ピアレビューについて紹介します。

 

 

謝辞:
面倒なClassificationセクション部分の翻訳に鈴木悠司氏のご助力を戴けたことを感謝致します。

コミュニティゲームへのゲーム投稿 その1

コミュニティゲームの北米版ベータが開始してから2週間が経ちました。現在では41のゲームがピアレビューを通過していて、マーケットプレースからダウンロードして遊べるようになっています。

ベータ版ではCC会員のみがダウンロードできますが、リリース後には誰でもダウンロードできるようになります。北米版リリースはアメリカのホリデーシーズン、つまり感謝祭のある11月の中旬~年末までを予定しているので、後6ヶ月程度になります。ゲームを遊びたい人達にとっての6ヶ月は長くても、ゲームを作るのに6ヶ月というのは意外に短い期間です。

コミュニティゲームの日本版は未発表ですが、日本よりも海外の方が販売台数の多いXbox 360なので世界に向けて作ったゲームを配信してみてはどうでしょうか?アメリカでも日本産のゲーム、とくにシューティングゲームが好きな人は少なからずいて、ヨーロッパ圏の人にもそういう人達がいると耳にするので需要はあると思います。

そこで、今回から数回に渡ってコミュニティゲームの仕組みを詳しく説明していきます。

 

まず、自分が作ったゲームをマーケットプレースに配信するまでには以下のステップがあります。

  1. 他人に遊んでもらえるゲームを作る
  2. ゲームの投稿
  3. ピアレビュー
  4. ゲームを遊ぶ

どうしてもゲーム投稿部分に注目してしまいがちですが、もっとも大切なのは他人に遊んでもらえるゲームを作るということです。これは、趣味でゲームを作っていると陥りやすいのですが、そのゲームをどうやって遊ぶのかの説明が不足しがちになってしまいます。どう操作するのか?ゲームのルールは?ゲームの目的は?といった、作っている本人には当たり前でもゲームを初めて遊ぶ人にとっては何も解らない状態なので、その状態からいかにして制作者の意図する状態にもっていくかがポイントです。

特に、コミュニティゲームは普通に市販しているゲームと違って説明書がつかないので、説明書がない状態でもプレーヤーが快適に遊べる工夫が必要になってきます。このことについてはまた別の機会に詳しく説明していきます。

 

2のゲームの投稿では、自分の作ったゲームの内容説明を文章やスクリーンショット、そして動画をゲームと一緒に投稿することができます。また、ゲーム内での暴力表現、性的表現、成人向け表現がどの程度あるのかを自己評価します。

 

3のピアレビューでは、CC会員が投稿されたゲームが正常に動作するか、投稿者の自己評価に間違いが無いか、法的に問題のあるものがゲーム内に含まれていないかのチェックをします。ピアレビューではゲームの面白さを評価するものではなく、単にゲームとして動作するのかをチェックするのを主な目的としています。また、マイクロソフトはあくまでシステムを提供するだけで評価自体には関与しておらず、XNAチームの人達を始めMS社員はピアレビューをすることはありません。

 

ピアレビューはCC会員の承認が一定数超えた通過、48時間程度でマーケットプレースに配信され遊ぶ事ができます。

 

ゲーム投稿する前準備

ゲーム投稿するには、クリエータープロフィールのプレミアムアカウントを作る必要があります。このアカウントを作るには他にも以下のアカウントを作る必要があります。

  1. Windows Live ID
  2. ゲーマータグ
  3. クリエータークラブ・プレミアム会員(CC会員の新名称)

ここで注意としてクリエータープロフィールのアカウントを作るときに使うWindows Live IDはゲーマータグとリンクしている必要があります。

creators.xna.comのサイトの右上に表示されているSign Inボタンを押し、 Windows Live IDに登録されているメールアドレスを入力すると以下のようなプロフィール設定画面が表示されます。

 

image

ここでは以下の設定ができます。

  • creator name (要入力)
    • クリエータープロフィールとして表示される名前。
  • e-mail address (要入力)
    • コミュニティゲームのシステムのメールの送り先アドレス。投稿したゲームがレビューを通過したときに連絡がくる時などに使われる
  • profession
    • 職業
  • discipline
    • 専門分野
  • creator tile
    • プロフィールに表示するアイコンを選択

以上の項目を入力して、一番下にある「使用規約読みました(I have read accept the terms of use and code of conduct.)」の隣にあるチェックボックスをチェックして、Continueボタンを押すと手続きは完了します。

登録したクリエータープロフィールでサインインすると、creators.xna.comのサイトの右上が以下のように変化します。

 

 image

これで、ゲームを投稿する準備ができました。

 

次回に続く...

コミュニティゲーム・ベータ開始

Creators Club Onlineのリニューアルと同時にCommunity Gamesのベータ版が開始されました。このベータは北米地域のCC会員向けのものなので日本からベータ版を使ってみたいと言うときにはいくつかの注意が必要です。

日本からでもCC会員であれば、ゲームの投稿、投稿されたゲームのピアレビューをすることができ、投稿されたゲームはピアレビューを通過すると北米地域のマーケットプレースに配信されます。

北米地域のマーケットプレースに配信されたゲームは、Creators Club Onlineのサイトで発行されるベータコード(Creators/Profileから取得できる)をXbox 360上で入力しコミュニティゲームラウンチャを導入すると、配信されたゲームをダウンロードすることができます。ただし、前述のように北米地域への配信なので、日本からコミュニティゲームラウンチャ含め配信されたゲームをダウンロードすることは現状ではサポートされていません。

 

以上をまとめると、:

  • 作ったゲームの投稿をすることができる
  • 投稿されたゲームのピアレビューができる
  • ピアレビューを通過したゲームは北米地域のマーケットプレースに配信される

 

と、なっています。

 

私の知る限りでは前例の無いシステムなので、ベータ期間が長く(6ヶ月くらい?)、またベータ期間中にもフィードバックを元にして更新する予定です。投稿されるゲームが多ければ多いほどシステムの完成度が高まるので、作ったゲームをどんどん投稿して意見をもらえると幸いです。

 

次回からは、複数回に渡ってゲームの投稿の仕方、ピアレビューの仕方などを紹介していきます。

XNA GSで作ったゲームを遊ぶ

XNA GSで製作したゲームを友達のPCなど、開発環境の入っていないPCで動作させるにはいくつかのランタイムが必要になります。現状では、必要とするランタイムがインストールされているかを自分で調べてインストールする必要がありますが、将来的には作ったゲームを手軽に配布できる仕組みを提供する予定です。

 

XNA GSE 1.0で作られたゲームの場合

  1. .Net 2.0 : Vistaには.Net 2.0は既に含まれているのでインストールする必要はありません
  2. Direct X 9.0c : DirectX End-User Runtime Web Installerを使う
  3. XNA Runtime 1.0

 XNA GS 2.0で作られたゲームの場合

  1. Windows XPの場合は.Net 2.0 SP1をインストール
  2. Windows Vistaの場合は以下のいずれかをインストールする (既にSP1の場合は必要なし)
  3. Direct X 9.0c : DirectX End-User Runtime Web Installerを使うこと
  4. XNA Runtime 2.0
  5. GamerServiceComponentもしくはLiveネットワーク機能を使っている場合、XNA Game Studio 2.0自体をインストール必要があります。現状ではGames For Windows Live Redistributeには含まれていないコンポーネントを必要とするので、それを含んでいるXNA GS自体をインストールする必要があります。

XNA GSは.Net 2.0以外にMicrosoft Visual C++ 2005 SP1に依存していますが、これは.Net 2.0 SP1、Vista SP1、.Net 3.5に含まれています。

インストール先のPCでDirect Xで作られたゲームが動作しているからといって必要なコンポーネントがインストールされているとは限りません。また、インストール先のPCに最新のDirectX SDKがインストールされている場合にも注意が必要です。SDKは最新のコンポーネントをインストールしますが、過去のコンポーネントはインストールしません。過去のコンポーネントも含めて必要なコンポーネントをインストールするDirectX End-User Runtime Web Installerを使うようにして下さい。

 

参照URL:
http://forums.xna.com/thread/9924.aspx

Posted by Yuichi Ito | 2 Comments
Filed under: , ,

XNA Game Studio 3.0 CTP公開

XNA Game Studio 3.0 Community Technical Preview (CTP)が公開されました。CTPは正式リリースでは無くベータの前段階、つまりアルファ版といった感じです。主な機能は以下のようになっています。

  • Zuneのサポート(市販のZuneがあれば無料でゲーム作成できる)
    • SpriteBatchベースのグラフィクス
    • Ad-hoc WiFiのサポート(既存のネットワークAPIがそのまま使える)
    • メディアライブラリAPI
  • Visual Studio 2008のサポート
  • wav,mp3,wmaなどのオーディオメディアの再生機能

Zuneは北米で発売されている携帯メディアプレイヤーで、それに合わせてXNAフレームワークにはZune内にあるオーディオファイルの列挙と再生ができるAPIが追加されています。

ZuneはXACTがサポートされていませんが、変わりにシンプルなオーディオ再生機能であるSoundEffectクラスが追加され、この機能はWindows上でも使うことができます。このSoundEffectはメモリから効果音などを再生するのに適しています。そして、BGMなどに適しているのは新しく追加されたSongクラスです。

どちらの場合も、他のコンテントと同じくプロジェクトにwav,mp3,もしくはwmaファイルを追加することで実行時に使用することができます。

using Microsoft.Xna.Framework.Media;

Song song = Content.Load<Song>("MySong");
MediaPlayer.Play(song);

この新しく追加されたAPIによって、XACTを介さずにオーディオ再生ができるようになりましたが、これらはXACTの機能を完全に代替するわけではないので、3DオーディオやRPCといつたより複雑な処理をする為には今まで通りXACTを使う必要があります。

 

Visual Studio 2008のサポートはXNA GS 3.0はC#をサポートしているVisual Studio 2008のどのエディションでも使うことができ、それにはVisual C# 2008 Express Edition(無料)も含まれています。

 

他にXNA GS 3.0 CTPを使うのに必要なのこととして

  • VS 2008かVisual C# 2008 Express Editionが必要。XNA GS 3.0はVS 2005はサポートしません。XNA GS 3.0は XNA GS 2.0とサイド・バイ・サイドで動作するので、XNA GS 3.0を使うのにVS 2005をアンインストールする必要はありません。
  • CTP版ではXbox 360をサポートしておらず、WindowsとZuneのみの対応になっています。Xbox 360で開発するにはXNA GS 2.0を使う必要があります。
  • 現状ではZune開発環境は64bit版OS上では動作しません(Zuneとの接続に失敗する)。

と、いうわけでCTPの主な機能はZuneサポートに関するものですが、VS2008対応とオーディオメディア再生機能は他のプラットフォームでも使える機能なので、ホリデーシーズンの正式リリースまで待てないという人にはダウンロードする価値はあると思います。

 

XNA GS 3.0 CTPは以下のリンクからダウンロードできます。

http://www.microsoft.com/downloads/details.aspx?FamilyId=DF4AF56A-58A7-474C-BFD0-7CF8ED3036A3&displaylang=en

Posted by Yuichi Ito | 0 Comments
Filed under: ,

テクスチャ撮影

テクスチャが欲しい

その昔、コンシューマ機で3Dが使えるようになった時に使えるテクスチャのサイズは非常に限られたもので、中には最大32x64という、ウェブサイト上に使われるバナーより小さいサイズのテクスチャしか使えないマシンもありました。それが今ではSM1.1が使えるビデオカードでは2,048x2,048が基本になり、Xbox 360やDX10が使えるビデオカードでは8,192x8,192までの大きさのテクスチャが使えるようになりました。

これだけ大きなサイズのテクスチャが使えると、より高精度なものを作ることができる利点はありますが、逆に言えばそれだけのクオリティのものを作らなければいけないという面倒さが増えてしまいました。

さて、これだけのクオリティのテクスチャを用意するにはどうしたら良いでしょうか?

  1. ネットで探す
  2. 自分で描く
  3. デジカメを使う

ネットからダウンロードできるテクスチャは、サイズが小さく、jpg等の圧縮が掛かっていて画質が劣化していたり、法的問題もあるので、思い通りのテクスチャを探すのは意外と大変です。

次に、自分でテクスチャを描く方法ですが、第一にサイズが大きいので細かいディテールを描くのが大変なのと、普通の絵を描くときには光と影の表現を考えながら描きますが、最近の3Dゲームではポリゴン単位での陰影はもちろん、ノーマルマップを使って細かい陰影や、影などもリアルタイムに処理できるようになり、手で描いた絵に陰影があると計算された陰影や影と食い違いがあるので、そういった処理がされた後にどう見えるかを考えながら描かないといけません。絵を描くのが得意な人ほどちゃんとしたテクスチャを作るのに苦労するなんて話をよく耳にします。

3のデジカメですが、最近のデジカメでは3,264x2,448のサイズの写真を撮ることのできる800万画素が主流になり、1,000万画素を超えるものも珍しく無くなってきました。これだけの解像度があれば2,048x2,048のテクスチャを作るのには十分です。テクスチャはモデルの表面の質感を出すためのものなので、被写体の姿や形に関係ないものであっても素材が近いものであれば十分です。大理石でできた神殿を作るのにわざわざギリシャあたりまで行かなくとも、近所の学校にある記念碑の磨かれた表面部分を床のテクスチャ、荒い裏側の部分は柱のテクスチャとして使ったり、近所で寝ている猫の背中部分を撮ってトラっぽいモデルに使ってみたりと、近所を散歩するだけでオリジナルの色々な素材が簡単に入手することができます。

 

カメラ片手に散歩気分でテクスチャ集め

テクスチャの素材を写真で撮るときの注意としては

  1. 解像度は最高に、ISOの設定は100-400が理想
  2. 雲の多い日か、直射日光の当たらない場所で撮る
  3. 平面になっている場所を撮る

1の解像度は常に最高にして、使えるのならRAWフォーマットを使います。RAWフォーマットの場合16ビットRGBに変換することができるので、後からディテールを損なうことなく明るさの設定ができるので便利です。ISOの値が高いとノイズが発生するのでなるべく低い数値で。

2は、直射日光が当たると影が強くでてしまうので前述のように処理した陰影との食い違いがでてしまいます。

3については、ここで撮るのはあくまでテクスチャとしてのものなので、できるだけ最終的に使うテクスチャの形に近い形で撮るのが理想的です。レタッチソフトなどでは撮ったイメージを三次元的に加工できるものがありますが、撮る時点で気を配ることで後の作業に掛かる手間を減らすことができます。

 

撮った写真をテクスチャに加工する

素材として撮った写真は殆どの場合、そのままではテクスチャとしては使えません。通常、テクスチャはタイルのように並べて貼り付けることが多いので、撮った写真をそのまま使うと繋ぎ目が見えてしまいます。

そこで、フォトショップやGIMPといったツールを使って、その繋ぎ目を無くします。フォトショップの場合はここにある「繋ぎ目のないテクスチャ」で紹介されているように、スクロールやスタンプツールを使います。GIMPの場合はResynthesizerTexturizeといったプラグインを使うことでできます。

high-pass-01   high-pass-02

左上の写真は会社の前にある芝生を撮った写真を正方形にしたものです。そして、右側はフォトショップのフィルタ/その他/スクロールを使って画像の解像度の半分ずらしたものです。

high-pass-03

スタンプツール等を使って繋ぎ目を消すと上の様になります。で、このテクスチャを実際にゲーム内に使うと……

high-pass-08

繋ぎ目の無いテクスチャにはなり、自分で撮った写真が無事にテクスチャとして使えるようになりました。では、皆さんデジカメ使って自分なりのテクスチャを作りましょう……。

 

???

 

何かおかしい。確かに繋ぎ目は無くなりましたが、同じパターンのテクスチャが並んでいるというのがハッキリと判ると思います。

 

低周波問題

結論から言うと、撮った写真の繋ぎ目を消しただけでは、その画像に含まれる低周波成分がそのまま残っているというのが問題です。画像が波で表すことができるといった細かい説明は他の機会にしますが、ここで言う低周波成分とはテクスチャ全体にわたって緩やかに変化する陰影のことです。今回の例では明るい部分の芝生と暗い部分の芝生の色があることです。他にも同じ色だと思って撮った壁が照明の関係で微妙にその色が変化したり、カメラによっては口径食(Vignetting)やケラレと呼ばれる撮った写真の四隅が微妙に暗くなるといった変化も低周波成分に含まれます。低周波があれば高周波もあるわけですが、ここでは草一本一本の細かなディテール部分が高周波成分に相当します。

この低周波成分を画像からグラデーションツール使ったりして手動で取り除くのは非常に面倒な作業です。綺麗になったと思っても、まだ微妙に残ってたりして何度もやり直しをしなければいけません。

 

ハイパスフィルタ

この低周波問題を解決するのに便利なフィルタがフォトショップのフィルタメニューの奥地(フィルタ/その他/ハイパス)に潜んでいるハイパスフィルタ(high-pass filter)です。GIMPにもハイパスフィルタのプラグインがあります。良く高周波成分を取り除くローパスフィルタは耳にしますが、このハイパスフィルタはその逆に低周波成分を取り除くフィルタです。

 

high-pass-04 high-pass-05

左上の図はハイパスフィルタを使っている時の様子です。適用半径を好みの設定にします。この時、芝生の緑色の変化も低周波と見なされモノトーン風になってしまうので、その後に右上の様にカラーバランスを使って元の色に戻します。

 high-pass-06

上はカラーバランス調整後に最終的に繋ぎ目を取る為にスクロールさせたものです。すでにパッと見では繋ぎ目は見えませんが拡大表示すると見えてくる繋ぎ目をスタンプツールなどを使って消します。

high-pass-07high-pass-03

左上は繋ぎ目を消して完成したテクスチャです。右上はハイパスフィルタを使わずに繋ぎ目を消したテクスチャです。

で、このテクスチャを実際にゲーム上で使ってみると……

high-pass-09

上の様になります。目を凝らさない限りは同じテクスチャが並べてあるようには見えない綺麗な芝生ができました。

ただ、今度は低周波成分が皆無に等しいので無機的な感じがします。今回は完全平面な地面に張ったテクスチャなので余計にそう感じますが、実際のゲームでは多少の起伏があるので微妙な陰影がつくことで無機的な感じは少なくなります。また、より自然に見せるためにマルチテクスチャを使った方法もありますが、その紹介は他の機会にします。

 

まとめ

今回はプログラムからょっと離れてテクスチャ素材の作り方を紹介しました。テクスチャというと、私もそうですが絵が描けない人にとってはあまり触れたくないない話題でもありますが、今回紹介した方法ならデジカメとちょっとしたツールの使い方を覚えるだけで綺麗なテクスチャ素材を簡単に作ることができます。

プログラムに疲れたら、気分転換の散歩ついでにオリジナルなテクスチャ素材を集めてみてはどうでしょうか?

TCRに学ぶ

人によっては見たくない三文字

Xbox 360でゲーム開発をしているときに聞く単語のひとつにTCR(Technical Certification Requirements)というものがあります。コンシューマーゲーム機用のゲームを出すためには、このTCRで決められた要求を満たす必要があります。例えば「コントローラーの接続が切れたら、ゲームをポーズ状態にしてユーザーに対してコントローラーの再接続を促すメッセージを表示する」と、いった感じです。プロジェクトの追い込み時期になるとバグデータベースにある直さないといけないバグのリストでよく目にする単語だったりするので、良い思い出がない開発者もいると思います。

全てのTCRを満たすのは面倒な作業ではありますが、その殆どがプレイしてくれるユーザーが快適にゲームをプレイする為には必要不可欠なものばかりです。そこで、今回は数あるTCRの中からXNA GS上でゲームを作るときにも役に立つTCRをいくつか紹介します。

  1. 同じ画面を5秒以上続けて表示しない
  2. ユーザーが操作できない状態が15秒以上続く場合は、ユーザーを飽きさせない工夫をする
  3. メッセージはセーフエリア内に表示
  4. アンチエリアスを使ってね

 

「同じ画面を5秒以上続けて表示しない」

通称5秒ルール。例えばタイトル画面を「Push Start」と描きこまれた静止画一枚を表示したりするとアウトです。要するに常に画面のどこかが動いていることで、ユーザーにゲームが固まってしまった状態ではないと認識させるものです。

簡単な解決方法としては、Push Startといった文字は別に表示してカラーアニメーションさせたり、点滅させたりする方法があります。3Dモデルを表示できるのなら、3Dモデルをゆっくりと回転させるといった手もあります。

ゲームが固まった状態と区別できるという実用的な目的のほかに、常に画面上にアニメーションする部分があると、していないものに比べると楽しく見えるという効果もあるので、ゲーム画面のデザインをするときにアニメーションも考慮することをお勧めします。

「ユーザーが操作できない状態が15秒以上続く場合は、ユーザーを飽きさせない工夫をする」

これはロード画面のことで、Xbox 360のゲームでは「Now Loading...」という単に文字を表示させるだけではなく、ゲームの進行に関する情報や、ゲームプレイ時のTIPSなどを表示しているのは、この要求を満たすためです。以前は単に文字列を表示するという単純なものが大半をしめていましたが、最近では次のミッションの説明をしている間に裏でロードしてるというゲームも見られるようになりました。

ユーザを飽きさせないというのはゲームを作る上で非常に大事なことなので、常にユーザーを楽しませるように努力しましょうということを奨励しているTCRです。

「メッセージはセーフエリア内に表示」

PC用のモニタと違って、TVモニタの場合は画面の上下左右が切れてしまうことがあります。ですから、そのことを考慮せずに画面端にゲームにHPゲージやスコアといったものを表示するとTVによっては見えなくなることがあります。

この問題を避けるためにゲーム中に表示されるメッセージなどは、解像度の90%のセーフエリアといわれる領域に表示するようにします。1280x720の場合はスクリーン座標の(64、36)から(1216、684)の152x648の大きさの部分にメッセージを描くようにします。特に重要度の高いメッセージは解像度の80%の部分に表示するように決められています。

safearea

と、数字で書いても判らないので、例として1280x720の時のセーフエリアを表示したイメージ(クリックするとオリジナルサイズで表示します)を作ってみました。上の図の明るい部分がセーフエリアになっています。

ただし、同じセーフエリアをPCモニタ上でも適応すると今度は周りに空白が目立つようになるので、その空白が気にならないデザインにするか、セーフエリアの矩形情報を持っておき、Xbox 360上では解像度の90%の大きさにし、PC上では解像度と同じ大きさにするようにして「セーフエリアの右端からxピクセルの位置」といった感じに指定できるようにする方法があります。

「アンチエリアスを使ってね」

Xbox 360のeDRAMは4xMSAA使用時にピーク性能を発揮できるように設計されていて、少ない容量のeDRAMに収まらないサイズでも負荷を抑えながら分割してレンダリングするタイリングをサポートしています。せっかくある機能を使って欲しいのでアンチエリアスを使うことが奨励されています。

PCの場合でもXNAを動かすのに必要なシェーダーモデル1.1が使える殆どのビデオカードにはアンチエリアス機能があり、特に最近のビデオカードでは4xMSAA以上のアンチエリアスを使っても速度的なペナルティが少ないものが多くなってきました。また、XNA GS上ではタイリングを気にせずに大きなサイズのレンダーターゲットを指定できるようになっています。

4xaa noaa

左上の図は4xMSAAありで、右上がAAなしの時のスクリーンショット(クリックで拡大表示)です。

aacompare 

上の図は等倍の比較図です。静止画でも違いが判ると思いますが、実際に動かしてみるとAAなしの場合はポリゴンのエッジ部分にでるちらつきが4xMSAAでは殆どありません。

実際の使い方ですが、以下のPreparingDeviceSettingイベントにフックするコードをゲームクラスのコンストラクタ部分に追加します。

public Game()
{
    graphics = new GraphicsDeviceManager(this);

    graphics.PreparingDeviceSettings +=
        new EventHandler<PreparingDeviceSettingsEventArgs>(graphics_PreparingDeviceSettings);
}

そして、以下のコードを追加するとXbox 360、PCの両方でアンチエリアスが使えるようになります。PCの方はアンチエリアスをサポートしていないビデオカードもあるので、CheckDeviceMultiSampleTypeを使ってアンチエリアスが使用可能かのチェックをしています。

    void graphics_PreparingDeviceSettings(object sender, PreparingDeviceSettingsEventArgs e)
    {
        PresentationParameters pp = e.GraphicsDeviceInformation.PresentationParameters;

        // 4xAAと2xAAが使えるなら使っちゃう
        GraphicsAdapter adapter = e.GraphicsDeviceInformation.Adapter;
        SurfaceFormat format = adapter.CurrentDisplayMode.Format;

        // 使いたいAAのタイプを順に使えるか調べる
        MultiSampleType[] multiSampleTypes = {
            MultiSampleType.FourSamples,
            MultiSampleType.TwoSamples
        };

        foreach (MultiSampleType mst in multiSampleTypes )
        {
            int quality = 0;
            if (adapter.CheckDeviceMultiSampleType(DeviceType.Hardware, format,
                false, mst, out quality))
            {
                // 最初に見つけた使用可能なAAを設定する。
                   pp.MultiSampleQuality = 0;
                pp.MultiSampleType = mst;
                break;
            }
        }
    }

アンチエリアスがビデオカードで使用できるようになった頃はアンチエリアスを使ったときの速度低下が大きな問題でしたが、前述のように今時のGPU上でのアンチエリアス使用時の負荷は少なく、Xbox 360上では4xMSAA使用時の負荷は使用していないときに比べると20%程の増加になります。特にGPUがヒマになりがちなXNAフレームワーク上で動いてるゲームでは常に使用していても速度的な変化は殆どないので、最初に4xMSAAを使うようにして、GPUの負荷が多くなったときに2xMSAA、AAなしと変えるようにしてみてはどうでしょうか?

Posted by Yuichi Ito | 0 Comments

簡単(かもしれない)日本語表示

以前紹介した英数字以外の文字列表示方法はコンテントパイプラインの全体の流れを説明するという目的もあったので複雑なつくりになっていました。RPGやテキストベースのアドベンチャーゲームなどの大量のテキストデータを扱う場合は、こういったものは必須になってきますが、今回はXNA 2.0から導入されたプロセッサパラメーターを使ってのシンプルな日本語を含む多言語文字列表示方法を紹介します。

とりあえず、前回のサンプルを2.0用に書き直しておきました。

MessageTextSample 2.0

なぜSpriteFontなのか?

Windowsアプリケーションプログラミングを経験した人達にとってXNAに同様の文字列描画APIがないというのは疑問に思うかも知れません。なぜ、普通のWindowsのアプリケーションのようにOSにインストールされたフォントを指定して文字列を簡単にかけないのでしょうか?それには主に以下の理由があります。

  1. 容量: 日本語のフォントファイルのサイズは大きくて再配布が難しい
  2. 速度: テクスチャ形式のフォントに比べて描画処理に時間が掛かる
  3. 法律: 面倒だから放っておくと、後でさらに面倒なことになる罠のこと
  4. 娯楽: OSにインストールされいるフォントを使うと事務的な印象を受けてしまう

1については、日本語フォントの殆どは約7,000文字近くのデータを持っています。私のマシンにインストールされているMSゴシックのファイルサイズは8MB近くあります。殆どのゲームでは500~1,500文字程度の文字しか使わないので7,000文字のデータを持つのは効率的ではありません。更に、キャラクターや状況によって複数のフォントを使い分けるのでファイルサイズが大きいというの問題になります。

2は、通常のフォントはTrueTypeと呼ばれるデータ形式で、これは一文字一文字のポリゴンデータを持っているようなものでテクスチャにあらかじめ描画された文字をひとつの四角形ポリゴンで表示するより処理するのに時間が掛かります。また、フォントデータは必要になったときにHDDから読み込むのでリアルタイム性の高いゲームを作ってるときにはその遅延時間を考慮しなければいけないという問題もあります。

3は面倒な問題で、フォントには著作権があり、その使用許諾の形式もフォントを作っている会社によってさまざまなものがありますが、その多くはテクスチャとして文字を使うのは良くてもフォントファイル自体の再配布を禁じているものがあります。それ以外にもいろんなライセンス契約形式があることに注意してください。

4については、フォントと言うのはゲームの雰囲気を伝えるために重要なもので、キャラクターやその場の雰囲気によって複数のフォントを使うことが多いです。例えばおどろどろしい雰囲気を出すために古印体というフォントを使ったりしますが、そういった特徴的なフォントがOSにインストールされていることは殆どありません。また、テクスチャにすることで

xboxControllerButtonA

のように普通の文字列の間にビットマップで描いた絵を文字として組み合わせることもできます。

以上の理由からXNAではSpriteFontを採用しています。

簡単メッセージプロセッサ

今回のサンプルの基本アイディアは

  1. FontDescriptionProcessorから派生したMessageProcessorを作る
  2. MessageProcessor.Processメソッド内で任意の文字列をFontDescriptionに追加する
  3. 追加する文字はMessageFilenameプロパティに指定されたファイルから読み込む

と、シンプルなものです。カスタムプロセッサのプロセスメソッドは以下のようになっています。

public override SpriteFontContent Process(FontDescription input,
                                            ContentProcessorContext context)
{
    // MessageFilenameで指定されたファイル内の文字を追加する
    AppendCharacters(input, context);

    // 文字列を追加した後は単純にFontDescriptionProcessorのプロセスを呼ぶだけ
    return base.Process(input, context);
}

  MessageFilenameをプロセッサ・パラメーターとして以下のように宣言しています。詳細はこの記事が参考になると思います。ここではプロパティ画面上で読みやすいようにDisplayNameとDescriptionアトリビュートを使っています。

/// <summary>
/// プロセッサーパラメーター
/// ここに読み込むメッセージファイル名を指定する
/// </summary>
// プロパティ画面で表示される文字列の指定
[DisplayName("メッセージファイル名")]
// プロパティ画面でのパラメーターの説明
[Description("メッセージテキストが含まれているテキストファイル名")]
public string MessageFilename
{
    get { return messageFilename; }
    set { messageFilename = value; }
}

string messageFilename;

Processメソッドから呼んでいるAppendCharactersメソッド内では単にファイルから文字列を読み込み、FontDescription.Characters.Addメソッドを使って使用する文字を追加しています。

/// <summary>
/// FontDescriptionにMessageFilenameで指定されたファイル内の文字を追加する
/// </summary>
void AppendCharacters(FontDescription input, ContentProcessorContext context)
{
    // MessageFilenameは有効な文字列か?
    if (String.IsNullOrEmpty(MessageFilename))
        return;

    if (!File.Exists(MessageFilename))
    {
        throw new FileNotFoundException(
            String.Format( "MessageFilenameで指定されたファイル[{0}]が存在しません",
                            Path.GetFullPath(MessageFilename)));
    }

    // 指定されたファイルから文字列を読み込み、
    // FontDescription.Charctarsに追加する
    try
    {
        int totalCharacterCount = 0;

        using (StreamReader sr = File.OpenText(MessageFilename))
        {
            string line;
            while ( ( line = sr.ReadLine() ) != null )
            {
                totalCharacterCount += line.Length;

                foreach( char c in line )
                    input.Characters.Add( c );
            }
        }

        context.Logger.LogImportantMessage("使用文字数{0}, 総文字数:{1}",
            input.Characters.Count, totalCharacterCount);

        // CPにファイル依存していることを教える
        context.AddDependency(Path.GetFullPath(MessageFilename));
    }
    catch (Exception e)
    {
        // 予期しない例外が発生
        context.Logger.LogImportantMessage("例外発生!! {0}", e.Message);
        throw e;
    }
}

このカスタムプロセッサをコンパイルすると、以下のようにプロパティ画面上でメッセージプロセッサという名前のプロセッサが追加され、そこにメッセージファイル名というプロセッサ・パラメーターが表示されます。

SimpleMessage

ここにはテキストファイルであればどんなファイル名でも指定できますが、使っている環境に依存しないように相対パスを指定するようにしましょう。通常、コンテントパイプライン実行時のルートパスはContentフォルダになっています。また、多言語が指定できるようにファイルのエンコーディングはUTF-8を指定します。

さて、どんなファイルでも指定できるわけですが、前回の時にも書いたように私がプログラムするときには「エラーが起きにくく、起きたとしても直ぐにエラーの原因が特定、修正ができる」ということを心がけています。ですから、メッセージファイルと実際にランタイム時に使う文字列を別のファイルであるソースコードと別々にすると問題が起きやすく、見つけづらいという状態になってしまいます。

じゃあどうすればいいのか?また前回のように面倒なコーディングをしないといけないのか?と思ってしまいますが、今回はシンプルな解決方法をとります。それはソースコードをメッセージファイルとして指定するというものです。

ソースコードも立派なテキストファイル。そこに使われる文字は殆どが英数字なので日本語のメッセージに使われる文字数に比べると少ないし、既に英数字を使用する文字に指定しているのであれば無駄はありません。気をつけるとすれば、メッセージファイルが更新する度にコンテントビルドが行われるので、頻繁に書き換えるソースコードをメッセージファイルとして指定しないということです。

そこで、今回はサンプル内で使う文字列をまとめたMessageTable.csというソースコードを指定しています。

namespace SimpleMessage
{
    static class MessageTable
    {
        public static string[] Messages = {
            "日本語メッセージテスト\n"+
            "キーボードのEnterキー、コントローラーのAボタンで\n"+
            "次のメッセージを表示します。",

            ...

            "最初のメッセージに戻ります。",
        };
    }
}

カスタムプロセッサは100行程度のプログラム。ランタイム側は特別なデータタイプを持つことなく、SpriteFontを追加し、そのプロセッサを変更してパラメーターを設