原カバンは鞄のお店ではありません。

Unityを使ったゲーム制作のあれこれを綴っていきます。

【雑記】何度目かの終わらないUnity1week

闘争を求めない身体

激しい予約合戦の末、なんとか購入したiPhone15を自慢してくる同僚を前に、新型iPhoneの発売自体知らなかった皆さんこんにちは。元々AndroidユーザなのでiPhoneの動向にはあまり興味が無いのですが、シェア的にiPhoneが6割強を占めている日本では新型発売の波に乗れないのは時代に取り残されるのと同義のようです。
同僚曰くなんと今回は「電話アプリの通話終了ボタンの位置が変更されてちょっと不便」だそうで、知らんがな。

 

デジゲー博

今年の春夏は東京ゲームダンジョンへの出展に右往左往していましたが、調子にのって11/12に開催されるデジゲー博2023に出展することになりました

digigame-expo.org

デジゲー博は2013年から年に一回開催される同人ゲーム、インディーゲームの展示・頒布のイベントで、今年は秋葉原UDXで行われます。2Fのアキバスクエアと4FのUDXギャラリーの2会場に分かれているのですが、私は2Fアキバスクエアのスペース「B-18b」にて出展できる事になりました。

 

東京ゲームダンジョンに続いて3D脱出ゲーム「W.T.」を展示する予定で、東京ゲームダンジョンで展示した試遊版を幾点か変更し、配布物の種類を増やすつもりでいます。特に試遊版についてはアピール不足な点があるので、本編への誘導を高めるようなバージョンへブラッシュアップして望みたいと思っているのでよろしくお願いいたします。

 

store.steampowered.com3D脱出ゲーム「W.T.」は現在アーリーアクセス版をリリース中で近々ゲームパット対応したバージョンへ更新予定です。

 

Unity1week

「W.T.」のバックアップ予定が「近々」としか書けないのは、現在Unity1weekに挑戦中で制作期間が過ぎても完成せず、未だ作業中だからです。

unityroom.com

Unity1Weekとはunityroomというサイトで開催されている「お題に沿って一週間でゲームを作ろう」というイベントなのですが、その(制作期間の)一週間が過ぎても私の方は制作期間継続中のため、他の作業に手が回せない状況となっています。

このAA貼り付けるの何度目だろう・・・

 

今回はシルバーウィークでの開催でいつもよりは時間があるので間に合うと思ったんですけどねー、全然終わらない。
逆に毎回一週間で仕上げて投稿している人はどうして間に合うんだろうか?コツがあるなら教えてほしいものです。

頑張ります。

 

【Unity】Steamからの収益の受け取りに右往左往した話とUnity小ネタ

ソフール

ヤクルト製のヨーグルト・ソフールレモン味が季節限定だったのか9月に入りコンビニから一切姿を見せなくなって非常に悲しい皆さんこんにちは。ほぼ毎日食べていただけに本当に残念でなりません。ヤクルトのHPを見ると「通年販売」と書いてるので、コンビニ側が仕入れをしなくなっただけかもしれませんが、どちらにせよ手に入らないのは変わりないので何としてほしい。レモン味って夏場以外でも需要はあると思うんだけどなぁ。

 

Steamからの収益

早期アクセス版がリリース中の数学的迷宮脱出ゲーム「W.T.」ですが、8月の終わりにSteamから「7月分の収益をシェアしたよ」との通知がきました。(*´꒳`*ノノ゙パチパチ

store.steampowered.com

このブログでは何度もリリースを告知していますが、旧Twitterでのインプレッション数やYoutubeでのプロモーション動画の再生数などを見ても正直、収益を得るまで($100以上の売り上げが必要)の売り上げがあるとは思ってなかったので想定外な結果に驚くと共に、有難い思いで一杯です。本当にありがとうございます。今後予定しているアップデートも、正式版の完成もこれを励みに頑張らせて頂きます。

 

で、Steamからの入金をワクワクして待っていたのですが、通知がきてから2,3日後の事、取引先(Steamからの入金先)の銀行から「お知らせしたい事があるので、こちらまでご連絡ください」のお手紙が。
不穏に思いながら電話してみると、「Valve Corporation(Steamの運営会社)という会社から貴方宛に入金があるが、これは何の取引に対するお金なのか?」という確認でした。

どうも昨今ではテロ対策やマネーロンダリング対策によって海外向けの為替取引には厳しい監視の目が向けられているようで、私のような個人に対しても
外為法等各種法令・規制等に基づいて、お客さまとの取引内容等を確認するため、送金目的や送金人さまとのご関係がわかる資料の提供等をお願いする場合があります。」(郵貯HPより)との事。

 

この為、売り上げの対象となった商品の概要が分かる資料と、実際に売り上げた金額が分かる資料の提出を求められました。

今回の場合はSteamで販売しているゲームが対象なのでSteamのストアページのリンクと、開発者用ダッシュボードから見る事ができる財務Reportのスクリーンショットを提出したのですが、応対した担当の銀行員の方がどうも「Steam」や「個人開発によるゲーム」という概念にあまり知見がなかったようで、
「URL(Steamのストアページ)のどこに貴方の商品が売られているのか
「(ストアページの)どこの部分が今回の売り上げの対象となっているのか
と聞かれて、答えるのに窮してしまいました。(ストアページを見せてそんなこと聞かれるとは思わなかった)

 


最終的には納得してもらえたのですが、Steamのストアページによる販売が(私が閉じない限り)永続的に続くと伝えると

「それなら収益が入金される度に、毎回今回と同じような資料のご提出をお願いしますが、大丈夫ですか?」

と告げられました・・・・・・

 

「大丈夫ですか?」って「嫌だ」と拒否できるんですか?

巷のインディーゲーム開発者って毎月毎月、今回みたいな銀行とのやり取りをしているんですかね?銀行によるのかなぁ。

 

Enable GPU Instancing

ご存じ方も多いかと思いますがunityroomの恒例ベントUnity1weekが9/18から始まるようです。

unityroom.com

事前準備として色々調べているのですが、どんなゲームを作るにせよ性能対策は必須で、特にunity1weekでは動作するのはWebブラウザ上という事もあり、高精度なテクスチャを使用したり大量のオブジェクトを生成したりすると、遊ぶ方の環境によっては全く動かない、という事もあり得るので注意が必要です。

 

性能対策にも色々あると思いますが、STGなどの同じようなオブジェクトが大量に必要になるゲームでの対策としてGPU Instancingを使う方法があります。

GPU Instancingとは「同じマテリアル」且つ「同じメッシュ」のオブジェクトをGPU側で一括描画する手法で、一括で処理するためDarwCallを減らすことが出来て処理の高速化(=性能対策)に繋がります。

ただし、GPU Instancingはシェーダにて使用する機能なのでシェーダがGPU Instancingに対応している必要があります。
まぁ自作シェーダは別としてUnity標準のStanderdシェーダなど大抵は対応していると思いますが、使い方はMaterialのInspector下部からEnable GPU Instancingにチェックを入れるだけです。

Advancede OptionsのEnable GPU Instancingにチェック

 

効果の程を確認するため、今回は下図のようにSphereを大量に配置

通常だとBatchesの値が2688ですが、マテリアルのEnable GPU InstancingのチェックをONにすると・・・

Batchesの値が268818と激減している事が分かります。

同じオブジェクトを沢山表示したいケースでは有用な対策法だという事が分かりました。

【Unity】InputActionを使ってオブジェクトを操作する

夏が終わらない

もはや首掛けの扇風機が体の一部となっている皆さんこんにちは。この夏はどこに行くにも欠かせない存在で、暦の上で夏が終わっても気温がちっとも下がらない為、未だに首に掛けて過ごしているのですが、街ですれ違う人の視線がチラチラ扇風機の方へ向けられている気がして恥ずかしくなってきました。でも外せない、だって暑いし。

 

「W.T.」アップデート(予定)

一人称視点の3D脱出ゲーム「W.T.」ですが、早期アクセス版に対するゲームパッド対応が一通り完成しました。
現在は動作確認中ですがWindows版とMac版の二つで確認する必要があるため、Steamへアップデート版をリリースするのはもう少し先になりそうです。

store.steampowered.com

当初は8月末辺りにリリースしたかったのですが、Mac版での検証が一昔前のMacBookAirで行うため性能対策も必要で、そしてその対応をWindows版にも反映する作業がいる為、思ったよりも時間が掛かりそう。
まぁ、進捗が遅れている一番の要因はAC6だったり、AC6だったりするのですが、これはやたら難しいくせにリトライのロード時間が短いフロムが悪い、ゲームオーバーになっても直ぐに再開するのでずっと遊んでしまう。バルテウスで二日、シースパイダーで半日潰れてしまいました。

 

InputSystemを使おう

InputSystemはPackage Managerからインストールして使う事ができます。
InputSystemを導入するとキーボードやマウス、ゲームパッド、ジョイスティック、タッチディスプレイなど様々な種類のデバイスを統合して扱うことが可能なため、InputManagerを使うよりもコーディングの量が少なく、ゲームパッドやOSの違いでアレコレ悩む必要が無くなります。

 

例えばゲームパッドの方向キーの入力を判定したい場合、XInput形式、DualShock形式に関わらず現在接続されているゲームパッドはGamepad.currentで参照でき、方向キーの入力はGamepad.current.leftStick.ReadValue()で取得(Vector2で各方向-1~1)されるので、Input.GetAxisを使って各形式でマッピングされたAxisの名前を指定するよりは随分簡単になります。
この辺の基本的な内容はUnityの公式で発信されているので、下のリンクを参照してください。

forpro.unity3d.jp

 

InputActionを使おう

InputSystemを使えばゲームパッドは形式やOSを考慮することなく入力値を参照できることは分かりましたが、マウス+キーボードとゲームパッドで入力を統合したい場合はどうしたら良いでしょうか?
InputSystemでは、マウスやキーボード、ゲームパッドなど複数の入力デバイスを統一して扱えるようにするコンポーネントInputActionが用意されています。

 

例えば下の図のようなCubeに対して、Wキーを押しても、上方向キーを押しても、ゲームパッドの左スティック上を押しても、前(Z方向)に移動させたい場合、

InputActionに「Wキー押下、上方向キー押下、左スティック上押下」の入力イベント(Binding)を登録して、InputAction経由で入力値を取得すれば、登録した入力イベント全てで「前(Z方向)に前進」を行うことができます。

 

まず、Cubeを操作するスクリプトにInputActionの定義を追加し、インスペクターで入力イベント(Binding)の登録を行います。

手順はインスペクター上に表示されているInputActionの項目に対して

  1. 「+」ボタンを押下
  2. Add Binding項目を選択
  3. Pathドロップダウンから追加したい入力イベントを選択

の順で設定します。今回は「Wキー」「上方向キー」「左スティック上」を登録しました。

 

スクリプトにてInputAction(ActionCtl)から入力値をReadValueで取得し、CubeをZ方向へ移動させます。

 

「Wキー」「上方向キー」「左スティック上」の全ての入力でCubeを前進させることができました。

 

前後に動かしたい

上記の設定は入力イベント(Binding)の登録であるため、ReadValueから取得できる値は0~1の値となりますが、これを-1~1として「前方向と後方向」で判定したい場合は[Binding]を登録するのではなく、[Positive/Negative Binding]の登録を行います。

[Positive/Negative Binding]では0~1の値を取るPositiveイベントと-1~0の値を取るNegativeイベントを登録することになります。

上記の設定を[Positive/Negative Binding]に変更

この設定で各キーに応じて0~1、-1~0の値が取得できるので、スクリプトを変更することなくCubeを前後方向に動かす事ができます。

 

自由に動かしたい

[Positive/Negative Binding]で「正方向・負方向」それぞれでイベントを設定することができるので、これを利用すれば「前後方向」「左右方向」の入力値が取得できるようになります。とはいえ、「前後方向」「左右方向」でInputActionを用意するのはちょっと面倒です。
ゲームを制作する上ではキャラクターの移動の為の「前後」「左右」以外にも視点移動の為の「前後」「左右」の指定もあるため、それらを含めると用意するInputActionが増えていき煩雑になります。

この為、InputSystemには、InputAction AssetのActionをラップして管理するPlayerInputコンポーネントが用意してあります。

docs.unity3d.com

PlayerInputコンポーネントをアタッチしてインスペクターからCreate Actionsボタンを押下します。
すると色々なBindingが登録されたInputActionアセットがプロジェクト内に作成されます。

 

こちらのInputActionアセットをクリックして開いてみると分かりますが、ゲームに必要な操作に対する入力イベント(Binding)が一通り登録されており、一般的な操作方法を考えているのなら、そこから変更する必要はありません。

 

PlayerInputコンポーネントをアタッチすると、各デバイスの入力は一旦PlayerInput側で受け取り、必要に応じてSendMessageか登録したコールバック関数への通知が行われます。
今回はInvoke Unity Eventsを設定してコールバック関数(OnPerformed)への通知を受け取るように設定しました。

スクリプトにてキー、ステック(Axis)の入力応じてReadValue<Vector2>で値を取得、その値に応じてCubeを動かします。

これを実行すると

いろんな入力で前後左右にCubeを移動させることができました。

 

まとめ

InputSystemを導入してInputActionを使うと様々な種類のデバイスを統合して扱うことが可能となることが分かったと思います。
ゲームを制作する上ではPlayerInputコンポーネントを導入すれば、デフォルトのままでもゲーム内の一通りの動作をデバイスの種類よらず、同じロジックで実装することが可能となります。
これからはInputSystemの導入が必須になるかもしれませんね。

 

【小ネタ】ゲームコントローラーの接続/切断を検知する

バルテウスが倒せない

アーマードコア6購入以降、ゲーム制作のみならず全ての予定が滞っている怠惰な皆さんこんにちは。私は例のミサイル弾幕野郎バルテウスと10時間以上格闘しても倒せなくてほぼ詰み状態なのですが、それでも遊ぶ手を止められなくてコーラル中毒となっているようです。どうしよう。

 

本来なら週末は自作ゲーム「W.T.」(早期アクセス版)のアップデート作業を進めないといけないのですが、

store.steampowered.com

その開発作業が現在テストフェーズで確認とバグ潰しという苦行という事もあり、モチベーションの上がらないゲーム開発よりもバルテウスの全方位ミサイル避け作業の方を優先させてしまっています。

この為、ブログ記事用の検証作業も滞っているので今回は非常に小さなネタ記事となっています。申し訳ない。

 

ゲームコントローラーの接続/切断

某個人開発者さんが旧Twitterにて「Steamのゲーム審査でリジェクトはされなかったけど『ゲームコントローラー切断時にゲームが一時停止しない』と注意を受けた。」との呟いておられたのを見て、ゲームコントローラーの接続/切断はなるべく検知して対処した方が良いというのを知りました。
ここら辺はInputSystemを使っている場合は、接続/切断それぞれでイベントが用意されているのでそちらを利用すれば何とかなりそうです。

baba-s.hatenablog.com

 

しかしながらInputSystem以前のInputManagerを既に使用している場合は、この対応の為にInputSystemを導入するとInputManager周りの諸々の処理が使えなくなるという弊害がでるので自力で何とかするしかありません。
調べてみるとInputクラスのGetJoystickNamesで接続しているゲームコントローラーの名前(配列)を取得して、配列のLengthが減った場合は切断だと判定する方法がありました。

docs.unity3d.com

 

で、早速試してみたのですが上手くいかない。私の環境はXInput形式のコントローラーを無線で、PS5コントローラーを有線で接続しているのですが

有線で繋がっているPS5コントローラーを抜いてもGetJoystickNamesから取得できるゲームコントローラー名配列のLengthは変わらず、ゲームコントローラー名が空欄(空文字)となっているようでした。

なので、ゲームコントローラーの接続/切断の判定はGetJoystickNamesで取得した配列のLengthで判定するのではなく、その中の名前が空欄(空文字)かどうかで判定する必要があるようです。

 

名前で判定した結果

 

本来ならInputSystemへ移行すべきなんでしょうが、InputSystemを使えない暫定的な対応としてはこの方式で十分だと思います。

【Unity】ゲームコントローラー(XInput/DualShock)による入力判定まとめ

夏季休暇

長い休暇明けは周りからの「どこに行きました?」という質問が一番怖い皆さんこんにちは。それぞれお土産のお菓子を配ったりするのはご勝手なんですが、それを渡す際に不毛な質問をするのは是非やめて頂きたい。返事に窮するので。

 

アップデートに向けて

既に早期アクセス版をリリースしているアドベンチャーゲーム「W.T.」ですが、今月末にアップデート版をリリースする予定です。

store.steampowered.com

アップデート内容はバグの改修とUIの修正、一部パズルにヒントを追加する事と、ゲームコントローラー対応を予定しています。
ゲームコントローラーは東京ゲームダンジョン3で展示したデモ版では対応していたのですが、本編の方では諸般の問題解決に時間が掛かり間に合っていなかったので次回のアップデートのタイミングで導入することにしました。

 

Inputクラスによる入力判定

Unity でゲームコントローラーによる入力を判定する場合、Unity2019辺りから導入されたInputSystemを使えば「Gamepad.current.leftStick」や「Gamepad.current.buttonSouth」といった各入力応じたコントールを使用して判定する事ができるのですが、旧式のInputManagerを使っている場合はInputSystemと共存できない為、Inputクラスを使うことになります。
(InputSystemを導入するとInputManagerを無効化する設定に変更される)

 

Inputクラスを使う場合、ゲームコントローラーには軸(左右スティック等)によるアナログ入力とボタンによるデジタル入力の2種類があるため、それぞれの入力情報を受け取るには、Input.GetAxisInput.GetButtonDown といった二種類のメソッドを使い分けて取得する事になります。

Input-GetAxis - Unity スクリプトリファレンス

Input-GetButtonDown - Unity スクリプトリファレンス

上のマニュアルの通り、Input.GetAxis と Input.GetButtonDownどちらも入力値を取得したい軸、ボタンをその名前("JoystickAxis0"とか"JoystickButton0")で指定する方式なので、事前に使用するゲームコントローラーの「左スティックの名前」「Aボタンの名前」を知っておく必要があります。

 

ゲームコントローラー毎のマッピング

一般的にPCゲームで使用されるゲームコントローラーは

  • XBoxで使用されるXInput形式
  • PSで使用されるDualShock形式

の二種類が考えられると思います。

どちらもコントローラーの構成(左右スティック、4ボタン、上部左右にトリガーボタン二つ)は同じなので、Inputで使用する各軸の名前、ボタンの名前は同じなのかと思いきやドッコイ、調べてみるとXInput/DualShockで異なるのはもちろん、それぞれWindowsとMacOSでも異なる、という鬼畜仕様、メモを取っておかないと絶対に対応できない、という事が分かったので、下に各形式で割り当てられている軸名、ボタン名を書き置きます。

 

■XInput形式

 

 

DualShock形式

 

 

左スティックに関しては各形式どれも同じ名前ですが、右スティックに関しては各形式で微妙に違うので注意が必要です。
ボタンの割り当てはXInput形式の場合はWindowsとMacOSで大きく異なり、DualShock形式ではほぼ同じ、Windows版のXInputとDualShockでボタンのマッピング微妙に違う(XInputはbutton0が下ボタン、DualShockでは左ボタン)事も不可解ですが注意しましょう。

 

DualShock形式での注意点

ゲームコントローラーにはアナログ入力とデジタル入力の二種類の入力がありますが、L2,R2(XInputではLT,RT)ボタンはアナログ/デジタルの併用入力となっている為、ボタンでありながらGetAxisで入力情報を取得することができます

入力値の範囲は左右スティックと同じ-1.0~1.0の範囲ですが、DualShockコントローラーの場合、L2,R2はOFFの値が「-1」となっている為、例えば入力判定に「Mathf.Abs(Input.GetAxis(L2軸名))==1」のような条件を設定していると、必ずONとして判定される事になります。

DualShockコントローラー接続中の各軸OFFの値

 

この為、キーコンフィグ画面などで各ボタンの入力有無を判定する場合、「L2」「R2」に関しては「1がON」として判定するように設計を行う必要があります。開発者としては少し意地悪な仕様に感じますが、こればっかりは文句をいっても仕方ないのでDualShock形式の仕様に合わせて対応を行いましょう。

 

【Unity】キーボード(+ゲームパッド)のみでuGUIを操作したい

酷暑

日中に小一時間出かけるだけで今日のターンは終了した気分になる夏バテ気味な皆さんこんにちは。先日は例のジブリ映画を観に出掛け、映画館までの往復計一時間で全ての体力を使い果たしました。映画自体は「全く説明のない"千と千尋"」みたいな感じで、各要所毎のシーンは面白く飽きずに観れたのですが、鑑賞後に全体を振り返ると特に印象に残る場面がない、というなんとも不思議な映画でした。あと、「このキャラクターの声、ちょっと浮いてるな」と思ったらそれが菅田将暉でビックリ。あんな作りこんだ声で演技させるなら普通に声優使えばいいのに。

 

ゲームパッド対応

自作のアドベンチャーゲーム「W.T.」は既にアーリーアクセス版をSteamでリリースしていますが、東京ゲームダンジョン3での出展前にリリースしておきたい&東京ゲームダンジョン3に出展する試遊版を制作する必要があった事もあり、現状ではゲームパッドでの操作には対応していません

store.steampowered.com

とはいえ、最近ではPCゲームでもゲームパッドで操作するのが主流となっているので、現在はその対応中なのですが、ネックとなっているのは、uGUIに対してゲームパッドでどう操作するか、という事。
Unityではメニュー画面、オプション画面等を作成するために必要なButtonやTextBoxなどのUI(uGUI)が提供されているのですが、WindowsフォームやJavaScriptなどのWeb画面とは違い、フォーカスという概念がないので、マウス操作以外のゲームパッドやキーボードでのキー操作に対応してフォーカスを移動させるにはEventSystemを使ってちょっと工夫が必要です。

 

EventSystem

UnityでのUI操作は、EventSystemというコンポーネントを必ず使用します
このEventSystemではどのオブジェクト(UI)が現在アクティブなのか、どのオブジェクト(UI)が『選択中』なのかという事が管理されています。

例えば下の図のようなメニュー画面でマウス操作ではなくキーボード操作でボタンを選択したい場合を想定します。

この時、ゲーム開始直後に最初に選択されるボタンの設定はEventSystemの「First Selected」という項目で設定することができます。

この項目に起動時、選択状態にしておきたいゲームオブジェクト(ボタン)を指定しておくと

ゲーム起動時に選択状態となります。(上の動画では選択状態は青くなるようにHighlightedColorを設定しています)

 

キーボード操作によるボタンの選択

最初に選択したいボタンは上記の設定にて実現することができますが、そこからキーボード操作で「選択状態」のボタンを移動させたい場合、Standalone Input Moduleというコンポーネントを使用します。

このStandalone Input Moduleでは横方向の入力(Horizontal Axis)と縦方向の入力(Vertical Axis)および決定ボタン(Submit Button)等の動作と、InputManager(UnityメニューのEdit→Project Settingから設定)で定義されている入力方法との紐づけが行われています。

Input Managerのウィンドウ

このInputManagerに関してはUnityのマニュアルを参照してください。

docs.unity3d.com

この設定はデフォルトならキーボードの矢印キーとゲームパッドの左スティックが設定されているので、通常なら特に意識することなく矢印キーと左スティックで選択状態のボタンを移動させることができます

 

また、一部のボタンを非表示化(非アクティブ化)しても問題なく移動させる事もできます。

 

…と、ここまでなら特に工夫も必要なくキー操作対応が行えそうですが、InputManagerに定義された入力以外の操作でボタンの選択を行い場合、例えばTabキーで「選択状態」のボタンを移動させたい場合はStandalone Input Moduleの設定だけでは対応することができません

 

方向入力以外によるボタン選択

方向入力による操作は継続しつつ、その他のキーでもボタン選択の操作を行いたい場合には、自力でスクリプト組む必要があります。
具体的にはそのキー(例えばTabキー)のキー押下(GetKeyDown)をUpdateで検知した場合、

  1. 現在「選択状態」となっているオブジェクト(ボタン)をEventSystemから取得する
  2. 「選択状態」ボタンの親クラスSelectableから、次のボタン(右、もしくは下)のボタンを取得する
  3. 次ボタンをEventSystemに渡して「選択状態」にする

という手順を行います。

void Update()
{
    // Tabキー押下
    if (Input.GetKeyDown(KeyCode.Tab))
    {
        // 選択中のオブジェクト取得
        GameObject nowObj = EventSystem.current.currentSelectedGameObject;

        // Selectableがある場合
        if(nowObj.TryGetComponent<Selectable>(out var sr))
        {
            // Selectableを取得
            Selectable mySelectable = sr;
            
            // 一つ下のオブジェクトを選択
            EventSystem.current.SetSelectedGameObject(mySelectable.navigation.selectOnDown.gameObject);
        }

    }
}

上のスクリプトを実行すると

Tabキーによってボタンを選択することができます。

 

ゲームパッド対応には道半ば

前述のようにUnityのuGUIではフォーカスという概念がないので、Standalone Input Moduleの設定だけは中途半端な動作になります。
特にマウス操作と併用された場合、「選択状態」となるオブジェクトはボタンだけとは限らないので、ボタンやスティックを操作しても何の反応もしない、という状態に陥る事が多いです。
例えば、ボタンが選択されている状態でボタン以外の箇所をマウスでクリックされた場合、もう一度マウスでボタンをクリックしない限りは「選択状態」に戻らないので非常に面倒な事になります。

ここら辺はWindowsフォームのようにLostFocusイベントが検知されれば良いのですが、現状では自力で何とかするしかないようです。

【レポート】東京ゲームダンジョン3に出展するまでの準備と出展後の感想

真夏

今年は去年以上の暑さで昼間に外出すると体がちょっと溶けたように思えるのに、実際は去年と体重が変わっていない悲しい現実の皆さんこんにちは。今年の夏は本当に暑い夏になるようで、天気予報によると、これから一か月間は日本全国ずーーーーーーと平年以上の暑さとなるそうです。熱中症には十分気を付けて対策を行ってください。

 

東京ゲームダンジョン3

そんな猛暑の中、7/30に東京・浜松町で開催された東京ゲームダンジョン3に自作「W.T.」を携えて出展してきました。

store.steampowered.com

東京都立産業貿易センター浜松町館で開催された本イベントは、全部で約200団体が出展するというゲームの展示会イベントで、インディーゲーム界隈では結構有名なタイトルから、拙作のような無名のタイトルまで、幅広い層のゲームクリエータが一堂に会する日本でも有数の大型のインディーゲームイベントです。
前日に東京入りしてすぐに会場の下見に向かったのですが、会場のビルの巨大さに圧倒され、事の重大さを感じて出展を決めたことをちょっと後悔。前日はずっと不安に襲われてあまり寝付けませんでした。

会場の東京都立産業貿易センター浜松町館 デカい

 

出展準備と設営

展示会当日は出展者は10時に会場入りとのことだったので、10時から会場入りして設営開始。東京ゲームダンジョンでは宅配便サービスによる出展用機材の搬入を受け付けてくれたので、モニターやら配布物やらの資材は事前配送しており、私はノートPCの入った鞄一つで会場入りする事ができました。
一時間半程度で完成したブースはこんな感じ

設営完了

 

他のブースでは複数のチラシや名刺、ステッカーその他グッズが並び、PCを複数台持ち込んでいる所もありましたが、私の場合は初めて&遠方からの参加、という事もあり、ほぼ最低限の備品に留まっています。
試遊用に持ち込んだミニPCも本来ならノートPCの方で動かす予定だったのですが、グラスシェーダ(草シェーダ)が動作しないという性能の問題があって、ミニPC+キーボード+マウス+ゲームパッドという構成、PCやキーボード以外の備品は今回の展示会用に購入しました。


配布物としてはクリアファイル(紙製)を用意、全部で100部刷ったのですが、事前の予想では「1時間10枚のペースで配布できればと良し」と考えていたので70部ぐらいしか持ち込んでおらず、これが後で大きな反省点となってしまいました。

クリアファイルというと結構な予算が掛かりそうですが、紙製のクリアファイルなので片面印刷のみ、かつファイル中央部にしかデザインできないので100部刷っても7,000円程度に抑えることが出来ました。

配布したクリアファイル

 

開場後は凄い盛り上がり

後に主催者の方からアナウンスがあったのですが、当日は1,600名ほどのお客さんが訪れたそうです。それに加えて出展者が200名以上いるので、いくら広い会場&出展数200ブースとはいえ、拙作のような無名のタイトルで結構地味なブースでも訪れてくれる人が途切れる事はほとんどありませんでした。

開場当初は「どうせあまり人が来ないから、遊んでくれた方々のリアクションを逐一メモに取っておこう」とノートPCを開いて待っていたのですが、途中からほとんど休む暇がなかった為、メモを取る時間さえとれず、それも諦めてお客さんの対応に追われていました。

そしてついに、持ち込んだ70部のクリアファイルが開場時間の半分の3時間程度で全て配布し終えるという事態になってしまいました・・・。

 

それまでは「クリアファイルです。中に(チラシとか)入れられるから便利ですよ」と声をかけると殆どの方に手を取ってもらえて、そのままの流れで「これは・・・どんなゲームなんですか?」と試遊版の方に体を向けてくれる事が多かったのですが、残り3時間もある段階でその手が使えなくなってしまいピンチに。

「あ~あ、これから暇になるな」と覚悟を決めたのですが、以外にも通りがかって目があった方に「どうぞ~、(試遊版を)遊べます」と声を掛けると、そのまますんなり遊んでもらえる事が多くてビックリ。

よく考えると、こういう展示会に訪れる方は「いろんなゲームを遊びたい」という事が目的でチケットを購入して入場している訳で、タイミングさえ合えば遊んでもらえるんです。たとえ地味なビジュアルでも、すぐに遊べそうならそのままコントローラーを手に取って遊んでもらえる、という事が分かって大きな収穫を得ました。

 

なので、これからこうしたイベントに出展の予定がある方は、「お客さんには積極的に声をかけた方が良い」という事を覚えておいてください。あちらも「遊びたい」と思って会場に来ているので、こちらから切っ掛けを作ればポジティブな結果が得られると思います。

 

所感と反省

今回は展示会用の特別ステージを試遊版として持ち込みました。本作の雰囲気と要素を知ってもらうために作ったのですが、遊んでいただいた反応は中々良かったと思います。
特に受けが良かったと思うのは二つのボールを同時に運ぶミニゲームのパートで、途中で挫折する方もいましたが、結構集中して遊んでもらえたと思います。

 

また、最後のパートでちょっとビックリさせるようなイベントを用意していたのですが

ちゃんと「わぁ。ビックリした」とリアクションをしてもらえることが多くて、心の中でニヤニヤしていました。ごめんなさい。

 

反省点としては、パズルのパートがこちらの想定以上に難しいらしく、こちらからヒントを言うと気づいてもらえるのですが、それまで苦戦されている方が多くて、そういったレベルデザインや難易度調整は思った以上に簡単な方向に持って行った方が良い、という事が分かった事と、パズルパートではパズルを操作するモードに入る際に、カーソルをパズルのマークに合わせてAボタンを押す必要があるのですが、その操作に意外と手間取る方が多くて、そういった操作性の調整も、今後のアプデ要件として取り上げる必要があると思いました。

 

最後に

今回は初めての出展で不安が大きかったのですが、出展後の今は参加出来て本当に良かったと思っています。
特に自作のゲームを目の前で遊んでもらえて、リアクションをもらえるという事はゲーム制作の大きなモチベーションアップにつながりました。
また、直にお客さんの操作を見ることで自分では気づけなかった問題点を多く発見できて、技術的にも知見が広がる結果になったと思います。
今回得られた多くの知見をゲーム開発も方に出来る限りフィードバックして拙作「W.T.」の完成を目指したいです。

心残りなのは一人での応対だったため、他のブースに遊びに行く時間が全くなかったことで、特にこのブログの記事を読んで「記事を参考にしました!」とわざわざ挨拶に来てくれた方もいて、その方のブースにも足を運べなかったのは非常に申し訳ない限りです。
次の機会があれば他のブースにも遊びに出かけて、ゲーム開発者の方と交流を深めたいと思っています。

最後に、このようなイベントを主催していただいたスタッフの方、本当にお疲れ様でした。そしてありがとうございます。
また次回、参加したいと思っていますので、その際にはよろしくお願いいたします。

 

◇プライバシーポリシー

●個人情報の利用目的

当ブログでは、メールでのお問い合わせ、メールマガジンへの登録などの際に、名前(ハンドルネーム)、メールアドレス等の個人情報をご登録いただく場合がございます。

これらの個人情報は質問に対する回答や必要な情報を電子メールなどをでご連絡する場合に利用させていただくものであり、個人情報をご提供いただく際の目的以外では利用いたしません。

●個人情報の第三者への開示

当サイトでは、個人情報は適切に管理し、以下に該当する場合を除いて第三者に開示することはありません。

・本人のご了解がある場合
・法令等への協力のため、開示が必要となる場合

個人情報の開示、訂正、追加、削除、利用停止
ご本人からの個人データの開示、訂正、追加、削除、利用停止のご希望の場合には、ご本人であることを確認させていただいた上、速やかに対応させていただきます。

アクセス解析ツールについて

当サイトでは、Googleによるアクセス解析ツール「Googleアナリティクス」を利用しています。

このGoogleアナリティクスはトラフィックデータの収集のためにCookieを使用しています。このトラフィックデータは匿名で収集されており、個人を特定するものではありません。
この機能はCookieを無効にすることで収集を拒否することが出来ますので、お使いのブラウザの設定をご確認ください。

●免責事項

当サイトからリンクやバナーなどによって他のサイトに移動された場合、移動先サイトで提供される情報、サービス等について一切の責任を負いません。

当サイトのコンテンツ・情報につきまして、可能な限り正確な情報を掲載するよう努めておりますが、誤情報が入り込んだり、情報が古くなっていることもございます。

当サイトに掲載された内容によって生じた損害等の一切の責任を負いかねますのでご了承ください。

●プライバシーポリシーの変更について

当サイトは、個人情報に関して適用される日本の法令を遵守するとともに、本ポリシーの内容を適宜見直しその改善に努めます。

修正された最新のプライバシーポリシーは常に本ページにて開示されます。