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

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

【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.」の完成を目指したいです。

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

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

 

【小ネタ】TextMeshProのテキストの中でスプライトを表示する

小休止

ティアキンも殆ど遊びつくして次のアーマードコア6まで手持ち無沙汰な皆さんこんにちは。個人的には「W.T.」のアーリーアクセス版を無事にリリース出来てほっとしたと同時に、色々と課題も見えてきた事で、製品版リリースまで超えないといけない壁の高さ事を感じてモチベーションやらテンションやらが小休止状態となっています。

store.steampowered.com

 

東京ゲームダンジョン3

そんな事を言いつつも来週には東京ゲームダンジョン3に出展するので、今はその準備に追われています。
展示会用のデモ版の作成は終わり、配布物やレイアウト用の品々は買い揃えたので、後はそれらの搬送をどうするか、他に不足しているものはないか、当日会場までたどり着けるか、等々の確認を行っている最中です。

tokyogamedungeon.com

出展ブースはH-15会場奥のプロジェクターの目の前の席なので分かりやすいと思います。もし会場に来られる方は、暇そうにしていたら助けると思って遊んであげてください。

 

TextMeshPro

Unityに標準装備されて以降、テキストのUI関係はTextMeshProで実装している方が殆どかと思います。
TextMeshProの利点は、「拡大してもuGUIのテキストのように滲まない」「グラデーションやアウトライン等の装飾が使える」「DOTweenに連携して色々なテキストアニメーションが可能」等々、色々ありますが、その中の一つに「RichTextタグを使ってスプライトが表示できる」というのもあります。

上の図ではAボタンの表記にスプライトを使用しています。

 

スプライト用画像

最初にスプライト用の画像を用意します。この際、他のテキスト中に表示したい画像も合わせて一枚の画像にしておきます。

この画像をProject内にDrop&Dragして取り込んだら、それを選択して表示されたInspector内でTexture TypeをSpriteにし、Sprite ModeをMultipleにした後

Sprite Editorボタンを押します。

SpriteEditorウィンドウが開くので、上の▼を押して表示されるメニューから「Slice」ボタンを押下

すると、一纏めにした画像を自動で分割してマルチスプライト化してくれます。
マルチスプライト化された画像はSprite Editorウィンドウで個々の画像を選択すると、Nameで名前をつける事ができます。この名前を後で指定するので、分かりやすい名前を設定しておきましょう。

 

Sprite Assetの作成

今度は分割したスプライト画像からTextMeshProで使用できるSprite Assetを作成します。
先程の画像を右クリックし、Create > TextMeshPro > Sprite Assetの順に選択します。

すると、TextMesh Pro用のSprite Assetが作成されます。

そのSprite AssetをTextMeshProのExtra SettingsにあるSprite Assetに設定すれば準備完了です。

 

タグで指定する

TextMeshProのText内に「<sprite name="名前">」の形で指定すると、指定したスプライト画像を表示することができます。

上の画像のようにスプライトと他のテキストに位置がずれている場合は、Sprite Assetを選択したInspectorからEdit Glyphボタンを押すと「BX」「BY」の値が変更できるようになります。
この「BX」「BY」を調整するとこでスプライトの位置を他テキストの位置に合わせることが出来ます。

ちなみに画像部分はTextMeshProの色やマテリアルの影響は受けません。色を変更した場合はタグ内に「color=#22201E」のように直接Colorコードを指定する必要があります。

【告知】数学的迷宮脱出ゲーム「W.T.」早期アクセス版リリース

梅雨明けしてないのに暑い

大谷のホームラン数とここ最近の最高気温が相関関係になっている気がする皆さんこんにちは。このペースだと大谷さんが40号を打つ時には日本の気温も40度越えする気がしてならない。

 

数学的迷宮脱出ゲーム「W.T.」

以前からこのブログでお知らせしている通り、7/17に早期アクセス版をリリースしました

store.steampowered.com

早期アクセス版ではストーリー全5章中4章までを遊ぶことができます
プレイ時間は恐らく2~3時間程度、Windows版、Mac版どちらも揃えています。
また、現状ではキーボードのみでの操作となっています(製品版ではコントローラーに対応予定)

 

ゲーム概要

本作は一人称視点の3D脱出ゲームで、色のないループする迷宮を歩き回りながら各所に配置されたパズルを解いていくゲームとなっています。
出題されるパズルは多種多様の形態で登場しますが、その多くが数学的センスを問う問題となっています。

 

ゲームの特徴

ゲームの舞台は各所で空間がループしており、直進していたら元の場所に戻っていたり、階段を登っていたら通り過ぎた下の階に辿り着いたり、とプレイヤーの空間認識を惑わす仕掛けが施され、狭いながらも迷宮的な構造を持つ舞台となっています。

プレイヤーは提示された数学パズルを解いくことで、少しずつループの先へと進んでいきます。
本作ではスライドパズルから図形のパズル、チェスを絡めたパズルなど、パズル毎にその解法が異なるので、プレイヤーは各パズルに隠された法則を探して解法を見つける事が必要となります。

 

ゲームのストーリー

「数学者の見る夢には色が無い」事を告げられてプレイヤーはゲームを開始します。また、その直後に「万物の根源となる解を求めなさい」とも告げられます。

迷宮内には主人公宛と思える手紙が散らばっており、それらを収集し、読み進めることで先程の言葉の意味と、プレイヤーが何故ここにいて、何を目的に彷徨っているのか、そしてこのループする空間の「正体」は何か?それらミステリーの謎に迫っていきます。

 

実況配信について

特に制限はありません。事前連絡も不要ですが、可能であれば配信ページの概要欄等にストアページURLの記載をお願いします。

W.T. (Steam):

https://store.steampowered.com/app/2426100/WT

お手数ですが、よろしくお願いいたします。

 

最後に

既に詳細なレビューを書いてくださった方がおり大変ありがたい事です。本当にありがとうございます。
頂いたご意見は今後の製品版の開発に活かしたいと思います。
また、バグか仕様か分からない事象でも疑問があれば気軽にコミュニティの方に投稿してください。答えられる範囲でお答えしますので、よろしくお願いいたします。

t.co

◇プライバシーポリシー

●個人情報の利用目的

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

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

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

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

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

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

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

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

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

●免責事項

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

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

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

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

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

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