Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

2D格闘ゲームにおけるユーザビリティとゲームデザインについて

16,625 views

Published on

モバイル・コンシューマ「開発比較」勉強会 #1 インターフェイスと手触り【2D格闘ゲームにおけるユーザビリティとゲームデザインについて】の修正版資料です。
https://atnd.org/events/65421

講演時の質疑応答の内容、わかりづらい点の解説を追加しました!

Published in: Technology
  • Be the first to comment

2D格闘ゲームにおけるユーザビリティとゲームデザインについて

  1. 1. 2015/5/15 プログラマー/ディレクター 朝比奈むかで ※加筆修正2015/5/18
  2. 2. 自己紹介  朝比奈むかで(Twitter @asahina_mukade)  ゲーム開発を続けて24年目ほど  現在も現役。プログラマー/ディレクター職  アーケード、コンソール、モバイル等タイトル開発者
  3. 3. !注意点1  今回は2D(対戦型)格闘ゲームが対象  開発関係・リリースしたタイトルでの事例  ゲームデザインは7年程前までの内容  説明の不足、質疑応答の内容は反映しました →もし漏れや質問がありましたらTwitterまでご連絡を!
  4. 4. !注意点2  用語統一をさせて頂きますm(__)m 十字キー、十字ボタン 8方向レバー レバー ABXYボタン パッドボタン 押しボタン ボタン
  5. 5. アジェンダ  ユーザビリティとは?  “学習のしやすさ”と入力制御  “効率性”とキャラクター制御  “主観的満足度”とコマンド入力  まとめ
  6. 6. ユーザビリティとは?
  7. 7. ユーザビリティとは?(1)  “ユーザビリティ”って? ・一般的な定義として、ソフトウェアの使用感を指す ・操作感、手触りの意味に近いと考えてもよい  ヤコブ・ニールセン「5つのユーザビリティ特性」 ユーザインターフェースのユーザビリティは、ある一面からだけの特性 ではなく、5つのユーザビリティ特性からなる多角的な構成要素を持っている ・学習のしやすさ ・効率性 ・記憶のしやすさ ・間違えにくさ ・主観的満足度
  8. 8. ユーザビリティとは?(2)  5つの特性の詳細 学習のしやすさ ユーザがそれを使って作業をすぐ始められるよう、 簡単に学習できるようにしなければならない 効率性 一度ユーザがそれについて学習すれば、あとは高い生産性を 上げられるよう、効率的な使用を可能にすべきである 記憶のしやすさ 不定期利用のユーザがしばらく使わなくても再び使うときに 覚えなおさないで使えるよう、覚えやすくしなければならない 間違えにくさ エラー発生率を低くし、ユーザがシステム利用中にエラーを 起こしにくく、致命的なエラーが起こってはいけない 主観的満足度 ユーザが個人的に満足できるよう、また好きになるよう楽しく 利用できるようにしなければならない
  9. 9. ユーザビリティとは?(3)  ゲーム開発で重要だと考える項目(主に業務用ゲーム)  これらを今回2D格闘ゲームの事例で紹介 出来るだけ直感的に操作できること 操作やデザインを可能な限り一貫性を保つこと 短時間で面白さが感じられること 学習のしやすさ 効率性 主観的満足度
  10. 10. 2D格闘ゲームとは?  2D格闘ゲームとは? アクションゲームの一種でプレイヤーが操作するキャラクターが CPU、別のプレイヤーの操作するキャラクターと1対1で戦うゲーム 敵キャラクターを殴る蹴るするゲーム  操作系 8方向キー(レバー)、4〜6ボタンを使用 レバーでキャラ移動・コマンド入力、ボタンで攻撃  代表タイトル ストリートファイターシリーズ、ギルティギアシリーズ キングオブファイターシリーズ
  11. 11. “学習のしやすさ”と入力装置
  12. 12. “学習のしやすさ”と入力装置(1)  ビデオゲームではレバー・ボタンが入力装置  レバーは、方向入力装置 →傾けた方へ移動 →元は航空機の操縦桿  ボタンは、ON/OFFスイッチ →自動復帰型スイッチ →押している間だけON
  13. 13. “学習のしやすさ”と入力装置(2)  2D格闘ゲームの場合、レバーでプレイヤーが動かせる →入力方向と動作が一致している  レバーに合わせ動きが遷移 入力方向 移動方向 画面での動き 前進 後退 (防御) しゃがみ ジャンプ “How to Play”やデモ動きや操作は確認 実際に操作して数分でなんとなく理解可能
  14. 14. “学習のしやすさ”と入力装置(3)  ボタンがON状態になると攻撃 →押され続けるとOFF扱い  1ボタン、1攻撃 入力方向 移動方向 画面での動き 小攻撃 大攻撃 しゃがみ 小攻撃 しゃがみ 大攻撃 ジャンプ 攻撃 押せば相手に攻撃をする事を理解 攻撃している最中は他に遷移できない
  15. 15. “学習のしやすさ”と入力装置(まとめ1)  機能ごとに役割が決まっているので、迷うことが少なく レバー=キャラ、ボタン=攻撃と、触れれば理解ができる  また最小限これらだけでユーザーがプレイな点も重要 “学習のしやすさ” ユーザがそれを使って作業をすぐ始められるよう、 簡単に学習できるようにしなければならない “レバー操作” レバー操作で、画面上のキャラクターが動く “ボタンON” 1ボタン、1攻撃。レバーとの組み合せがある
  16. 16. “学習のしやすさ”と入力装置(まとめ2)  直感的な操作方法は、説明不要でシンプルになる  同じ入力で同じ結果が得られることは非常に重要 →一度覚えれば似たシステムの場合、再学習が不要  短時間で操作方法を理解してもらえるシステムである
  17. 17. “効率性”とキャラクター制御
  18. 18. “効率性”とキャラクター制御(1)  2D格闘ゲームのキャラクター制御で重要なポイント  レバー操作で移動・ジャンプ、ボタンを押せば攻撃  ストレスなく、って具体的にはどういうこと? レバー操作・ボタン押下でキャラクターをストレスなく動かせること 移動やしゃがみ、 ジャンプ、攻撃等々
  19. 19. “効率性”とキャラクター制御(2)  レバー操作で状態が変化=“State“を理解  レバー方向を動きが変化=“State”を遷移が理解  ボタンを押下=攻撃を実行と操作の中断を理解  デザインとしても把握しやすくわかりやすい →但しそのままだと問題点がある 待機(Idle) しゃがみ (Crouch) 移動 (Move) ジャンプ (Jump) 攻撃 SP攻撃 “キャラクターアニメーション”と レバーとの連動性における問題
  20. 20. “効率性”とキャラクター制御(3)  例えばレバーを下方向に入れ続けると“しゃがみ”状態になる場合  ただ遷移している途中、アニメーション遷移による Stateが曖昧な状態が起こる 待機 (Idle) しゃがみ (Crouch)
  21. 21. “効率性”とキャラクター制御(4)  例えばレバー下方向に入力を開始する (即座にStateが遷移する条件の場合) 時間経過 Step1 State 遷移 立ち待機 (Idle) 入力 見た目
  22. 22. “効率性”とキャラクター制御(4)  しゃがみに遷移し、中間アニメーションが再生される (即座にStateが遷移する条件の場合) 時間経過 Step1 Step2 State 遷移 立ち待機 (Idle) しゃがみ (Crouch) 入力 見た目 しゃがみへ Stateはしゃがみ遷移 待機→しゃがみの中間 アニメーションになる
  23. 23. “効率性”とキャラクター制御(4)  遷移途中に、レバーをニュートラルにする (即座にStateが遷移する条件の場合) 時間経過 Step1 Step2 State 遷移 立ち待機 (Idle) しゃがみ (Crouch) 入力 見た目 待機→しゃがみ遷移 アニメーション途中で レバーを離す しゃがみへ
  24. 24. “効率性”とキャラクター制御(4)  “しゃがみ“を中断して“待機”に戻る処理が実行される (即座にStateが遷移する条件の場合) 時間経過 Step1 Step2 Step3 State 遷移 立ち待機 (Idle) しゃがみ (Crouch) 立ち待機 (Idle) 入力 見た目 しゃがみへ 立ち待機へ Stateは立ち待機へ遷移 しゃがみ→待機の中間 アニメーションになる
  25. 25. “効率性”とキャラクター制御(4)  “待機”に戻り中でレバー下方向と攻撃ボタン同時押下 (即座にStateが遷移する条件の場合) 時間経過 Step1 Step2 Step3 State 遷移 立ち待機 (Idle) しゃがみ (Crouch) 立ち待機 (Idle) 入力 見た目 レバー下方向と 攻撃ボタンを同時に 入力 しゃがみへ 立ち待機へ
  26. 26. “効率性”とキャラクター制御(4)  入力に従って遷移すると“攻撃(しゃがみ)”になる (即座にStateが遷移する条件の場合) 時間経過 Step1 Step2 Step3 Step4 State 遷移 立ち待機 (Idle) しゃがみ (Crouch) 立ち待機 (Idle) 攻撃 (しゃがみ) 入力 見た目 しゃがみへ 立ち待機へ
  27. 27. “効率性”とキャラクター制御(4)  入力に従って遷移すると“攻撃(しゃがみ)”になる (即座にStateが遷移する条件の場合) 時間経過 Step1 Step2 Step3 Step4 State 遷移 立ち待機 (Idle) しゃがみ (Crouch) 立ち待機 (Idle) 攻撃 (しゃがみ) 入力 見た目 しゃがみへ 立ち待機へ えっ?お前さっき 立とうしてたじゃん! おかしくない?
  28. 28. “効率性”とキャラクター制御(5)  先程の問題は入力するタイミングにも依存するので 曖昧さが解決できない  遷移が安定せずユーザーが混乱しストレスを感じる  毎回同じ(に近い)入力で、同じ結果なる必要がある為 ・ユーザーがレバー下方向とボタンが同時入力される保証がない ・入力が断続的に行われ、一貫性がなく、挙動がおかしく見える State間遷移の対応が必要
  29. 29. “効率性”とキャラクター制御(6)  State間の対応は、もうひとつStateを追加し、 どこに遷移するかを明示化する(1次、2次State) →原始的な方法だが、管理情報が増えてしまうが追加コストは安い  概念的には1次Stateは2次Stateを経由して 遷移することで、入力の変化にも対応可能になる 待機(Idle) しゃがみ (Crouch) Toしゃがみ (Crouch) 待機(Idle) ※ゲームデザイン次第でこの限りではない。アニメーションを2次Stateに合わせて分離したタイトル有 待機(Idle)-1次Sate 待機(Idle)-2次Sate
  30. 30. “効率性”とキャラクター制御(7)  State遷移の概念図はこのような形になる 待機(Idle) 移動 (Move) しゃがみ (Crouch) ジャンプ (Jump) To 待機 (Idle) Toしゃがみ (Crouch) To 移動 (Move) 2次State 1次State To 攻撃 (Attack) 攻撃 SP攻撃
  31. 31. “効率性”とキャラクター制御(8)  先程の内容を再現し、レバー下方向に入力を開始する 時間経過 Step1 1次State 立ち待機 (Idle) 2次State None 入力 見た目
  32. 32. “効率性”とキャラクター制御(8)  “しゃがみ”に遷移せず、”To Crouch”へ遷移 時間経過 Step1 Step2 1次State 立ち待機 (Idle) 立ち待機 (Idle) 2次State None To Crouch 入力 見た目 しゃがみへ
  33. 33. “効率性”とキャラクター制御(8)  遷移途中に、レバーをニュートラルにする 時間経過 Step1 Step2 1次State 立ち待機 (Idle) 立ち待機 (Idle) 2次State None To Crouch 入力 見た目 しゃがみへ
  34. 34. “効率性”とキャラクター制御(8)  2次Stateの遷移から、“しゃがみ“の”To Idle”へ 時間経過 Step1 Step2 Step3 1次State 立ち待機 (Idle) 立ち待機 (Idle) しゃがみ (Crouch) 2次State None To Crouch To Idle 入力 見た目 しゃがみへ 立ち待機へ ここで1次Stateが 変化している!
  35. 35. “効率性”とキャラクター制御(8)  “待機”に戻り中でレバー下方向と攻撃ボタン同時押下 時間経過 Step1 Step2 Step3 1次State 立ち待機 (Idle) 立ち待機 (Idle) しゃがみ (Crouch) 2次State None To Crouch To Idle 入力 見た目 しゃがみへ 立ち待機へ レバー下方向と 攻撃ボタンを同時に 入力
  36. 36. “効率性”とキャラクター制御(8)  2次State遷移は一度“しゃがみ”を経由し… 時間経過 Step1 Step2 Step3 Step4 1次State 立ち待機 (Idle) 立ち待機 (Idle) しゃがみ (Crouch) しゃがみ (Crouch) 2次State None To Crouch To Idle To Attack 入力 見た目 しゃがみへ 立ち待機へ しゃがみへ
  37. 37. “効率性”とキャラクター制御(8)  入力に従って“しゃがみ攻撃”になる 時間経過 Step1 Step2 Step3 Step4 Step5 1次State 立ち待機 (Idle) 立ち待機 (Idle) しゃがみ (Crouch) しゃがみ (Crouch) 攻撃 (しゃがみ) 2次State None To Crouch To Idle To Attack From Crouch 入力 見た目 しゃがみへ 立ち待機へ しゃがみへ
  38. 38. “効率性”とキャラクター制御(8)  入力に従って“しゃがみ攻撃”になる 時間経過 Step1 Step2 Step3 Step4 Step5 1次State 立ち待機 (Idle) 立ち待機 (Idle) しゃがみ (Crouch) しゃがみ (Crouch) 攻撃 (しゃがみ) 2次State None To Crouch To Idle To Attack From Crouch 入力 見た目 しゃがみへ 立ち待機へ しゃがみへ しゃがみを経由して から下段攻撃だね!
  39. 39. “効率性”とキャラクター制御(8)  入力に従って“しゃがみ攻撃”になる 時間経過 Step1 Step2 Step3 Step4 Step5 1次State 立ち待機 (Idle) 立ち待機 (Idle) しゃがみ (Crouch) しゃがみ (Crouch) 攻撃 (しゃがみ) 2次State None To Crouch To Idle To Attack From Crouch 入力 見た目 しゃがみへ 立ち待機へ しゃがみへ 先程と違って、入力と 動作イメージが一致!
  40. 40. “効率性”とキャラクター制御(まとめ1)  色々なアクションをするゲームなので回数を繰り 返せば、安定した動きになるようにシステムを提供  感覚的になるとわかれば、自然と操作がそれに近づく “効率性” 一度ユーザがそれについて学習すれば、高い生産性を上 げられるよう、効率的な使用を可能にすべきである State遷移の整理 想定される様々な入力を2つのStateで生理 動作の一貫性 多少曖昧な入力であっても同じ挙動になる
  41. 41. “効率性”とキャラクター制御(まとめ2)  ゲーム開発のキャラクター制御は例外処理に傾きがち →挙動がおかしくなりやすく、エンバグも多くなる  State遷移2つ分けて遷移の流れを整理 →入力タイミングによる、違いが少なくなるようにロジックを定義 →また2次Stateからの遷移をスクリプトでも対応可能  ユーザーが同じ(に近い)入力で同じ結果になる →タイミングを覚えれば同じ行為を再現できる →入力と動作に一貫性をもってシステムにすることでストレスを軽減
  42. 42. “主観的満足度”とコマンド入力
  43. 43. “主観的満足度”とコマンド入力(1)  コマンド入力とは? 特定の順序でレバーを入力しボタンを押下すると、“必殺技”と呼ばれる 強力な技を発動することができる。 指定された入力を行うことから“コマンド入力”と呼ばれる コマンド入力は発動技ごとに難易度を変えることができ、 入力が成功し技を出せれば、ゲームを有利に進められる
  44. 44. “主観的満足度”とコマンド入力(2)  コマンド入力は最重要・要素 2D格闘ゲームにおいてコマンド入力=強力な技とされる  ユーザーに納得してもらう“コマンド入力”のデザイン →コマンド入力は仕様のまま実装しても上手くいかない事が多い 正確な“コマンド入力”を行えば、必ず技を発動させる ユーザーの見せ場・プレイ能力の高さを証明 ユーザーがコマンド入力を成立できる為に 上手に補助・補完するシステムが必要
  45. 45. (補足)レバー・ボタンの入力情報について  レバー(8方向)・ボタンはビット情報  入力値にはいくつか種類があり、用途によって使い分けられている →ボタンは通常“Trigger”を参照、キャラの移動は“Direct”等 入力値の種類 種類ごとの情報内容 Direct 現在のレバー・ボタンの入力値 Old 1フレーム前のレバー・ボタン入力値 Trigger レバー、ボタン別々に変化した入力があった場合の値 Repeat 同じ入力値を一定時間継続した場合に、反映される入力値 キー ↑ ↓ → ← A B X Y On◯ Off✕ ◯ ✕ ◯ ✕ ◯ ✕ ✕ ✕ 入力値: 0xA8
  46. 46. “主観的満足度”とコマンド入力(3)  コマンド入力を判定する方式 複数の方式があり、今回はコマンドシーケンス検索方式を紹介 名称 処理内容 コマンド シーケンス 検索方式 “コマンド入力”ごとに検索する入力を配列化 レバー・ボタンの入力を順番通り比較検索する 検索順番 検索キー ① ② ③ ④ 一連のコマンド列
  47. 47. “主観的満足度”とコマンド入力(4)  検索テーブルの情報設定について コマンド列/検索キーごとに様々な設定があります コマンド列 受付時間 コマンド全体の入力受付時間(コマンド1つとは別) これも時間オーバーするとコマンド全体が失敗 リフレッシュ時間 コマンド列入力成功後に無効になるまでの時間 コマンド列の優先順位 他のコマンド列と同時成立した場合の優先順位付け数値 検索キーテーブル “検索キー”の全配列 ・コマンド列ごとの設定 ・検索キーごとの設定 判定するコマンド チェックする入力値 コマンドマスク レバー情報をマスクする入力値(不要な入力を許す/許さない) 入力値の参照タイプ 入力値を指定(Directのみ、Triggerのみ、Trigger + Old等) コマンド受付時間 1コマンドを受付時間、オーバーするとコマンド全体失敗に
  48. 48. “主観的満足度”とコマンド入力(5)  コマンド列情報のサンプル(配列はコマンド技の数だけ定義) ID 受付時間 リセット 時間 優先順位 検索キーテーブル コマンド1 (波動拳) 0.4ms 0.3ms 3 コマンド2 (旋風脚) 0.4ms 0.3ms 4 検索キー コマンドマスク 入力値の参照タイプ コマンド受付時間 ↓ 0x20 Trigger 0.13ms ↘ 0x60 Trigger + Old 0.13ms → 0xF0 Trigger 0.13ms Aボタン 0x0F Trigger 0.5ms 検索キー コマンドマスク 入力値の参照タイプ コマンド受付時間 ↓ 0x20 Trigger 0.13ms ↙ 0x60 Trigger + Old 0.13ms ← 0xF0 Trigger 0.13ms Xボタン 0x0F Trigger 0.5ms
  49. 49. “主観的満足度”とコマンド入力(6)  コマンドシーケンス検索方式のロジック(成立例) 時間経過 Step1 入力(Trigger) 0x00:- 入力(Old Trigger) 0x00:- チェック対象 Trigger コマンド1 参照キー 1:↓ コマンド1 入力受付時間 0.3ms (8/60フレーム) マッチング ✕ 入力経過時間 0.0ms
  50. 50. “主観的満足度”とコマンド入力(6)  コマンドシーケンス検索方式のロジック(成立例) 時間経過 Step1 Step2 入力(Trigger) 0x00:- 0x40:↓ 入力(Old Trigger) 0x00:- 0x00:- チェック対象 Trigger Trigger コマンド1 参照キー 1:↓ 1:↓ コマンド1 入力受付時間 0.3ms (8/60フレーム) 0.3ms (8/60フレーム) マッチング ✕ ◯ 入力経過時間 0.0ms 約0.06ms 入力値とチェック する参照キーが一致。 次回から2番目の 参照キーをチェック
  51. 51. “主観的満足度”とコマンド入力(6)  コマンドシーケンス検索方式のロジック(成立例) 時間経過 Step1 Step2 Step3 入力(Trigger) 0x00:- 0x40:↓ 0x20:→ 入力(Old Trigger) 0x00:- 0x00:- 0x40:↓ チェック対象 Trigger Trigger Trigger +Old コマンド1 参照キー 1:↓ 1:↓ 2:↘ コマンド1 入力受付時間 0.3ms (8/60フレーム) 0.3ms (8/60フレーム) 0.3ms (8/60フレーム) マッチング ✕ ◯ ◯ 入力経過時間 0.0ms 約0.06ms 約0.10ms 2番目の参照キーは↘だが OldとTriggerを論理和した 数値がチェックする 参照キーとなるので成立 1つ前のTrigger値は Old Trigger値として保存 どのハードでも 斜め入力は反応 が悪い為、対応 が必要とされる
  52. 52. “主観的満足度”とコマンド入力(6)  コマンドシーケンス検索方式のロジック(成立例) 時間経過 Step1 Step2 Step3 Step4 入力(Trigger) 0x00:- 0x40:↓ 0x20:→ 0x60:↘ 入力(Old Trigger) 0x00:- 0x00:- 0x40:↓ 0x20:→ チェック対象 Trigger Trigger Trigger +Old Trigger コマンド1 参照キー 1:↓ 1:↓ 2:↘ 3:→ コマンド1 入力受付時間 0.3ms (8/60フレーム) 0.3ms (8/60フレーム) 0.3ms (8/60フレーム) 0.3ms (8/60フレーム) マッチング ✕ ◯ ◯ ✕ 入力経過時間 0.0ms 約0.06ms 約0.10ms 約0.13ms Trigger値が、意図しない値 になることもある。 またこの場合、Trigger値と 参照キーの比較のために 不成立となっている。
  53. 53. “主観的満足度”とコマンド入力(6)  コマンドシーケンス検索方式のロジック(成立例) 時間経過 Step1 Step2 Step3 Step4 Step5 入力(Trigger) 0x00:- 0x40:↓ 0x20:→ 0x60:↘ 0x20:→ 入力(Old Trigger) 0x00:- 0x00:- 0x40:↓ 0x20:→ 0x60:↘ チェック対象 Trigger Trigger Trigger +Old Trigger Trigger コマンド1 参照キー 1:↓ 1:↓ 2:↘ 3:→ 3:→ コマンド1 入力受付時間 0.3ms (8/60フレーム) 0.3ms (8/60フレーム) 0.3ms (8/60フレーム) 0.3ms (8/60フレーム) 0.3ms (8/60フレーム) マッチング ✕ ◯ ◯ ✕ ◯ 入力経過時間 0.0ms 約0.06ms 約0.10ms 約0.13ms 約0.15ms Trigger値が変わって、 参照キーと同じ値になり 次の参照キーに移動。
  54. 54. “主観的満足度”とコマンド入力(6)  コマンドシーケンス検索方式のロジック(成立例) 時間経過 Step1 Step2 Step3 Step4 Step5 Step6 入力(Trigger) 0x00:- 0x40:↓ 0x20:→ 0x60:↘ 0x20:→ 0x28:→A 入力(Old Trigger) 0x00:- 0x00:- 0x40:↓ 0x20:→ 0x60:↘ 0x20:→ チェック対象 Trigger Trigger Trigger +Old Trigger Trigger Trigger コマンド1 参照キー 1:↓ 1:↓ 2:↘ 3:→ 3:→ 4:Aボタン コマンド1 入力受付時間 0.3ms (8/60フレーム) 0.3ms (8/60フレーム) 0.3ms (8/60フレーム) 0.3ms (8/60フレーム) 0.3ms (8/60フレーム) 0.5ms (8/60フレーム) マッチング ✕ ◯ ◯ ✕ ◯ ◯ 入力経過時間 0.0ms 約0.06ms 約0.10ms 約0.13ms 約0.15ms 約0.19ms Trigger値が変わって、 参照キーと同じ値になり 次の参照キーに移動。
  55. 55. “主観的満足度”とコマンド入力(6)  コマンドシーケンス検索方式のロジック(成立例) 時間経過 Step1 Step2 Step3 Step4 Step5 Step6 入力(Trigger) 0x00:- 0x40:↓ 0x20:→ 0x60:↘ 0x20:→ 0x28:→A 入力(Old Trigger) 0x00:- 0x00:- 0x40:↓ 0x20:→ 0x60:↘ 0x20:→ チェック対象 Trigger Trigger Trigger +Old Trigger Trigger Trigger コマンド1 参照キー 1:↓ 1:↓ 2:↘ 3:→ 3:→ 4:Aボタン コマンド1 入力受付時間 0.3ms (8/60フレーム) 0.3ms (8/60フレーム) 0.3ms (8/60フレーム) 0.3ms (8/60フレーム) 0.3ms (8/60フレーム) 0.5ms (8/60フレーム) マッチング ✕ ◯ ◯ ✕ ◯ ◯ 入力経過時間 0.0ms 約0.06ms 約0.10ms 約0.13ms 約0.15ms 約0.19ms
  56. 56. “主観的満足度”とコマンド入力(7)  コマンドシーケンス検索方式のロジック(失敗例) 時間経過 Step1 Step2 Step3 Step4 Step5 Step6 入力(Trigger) 0x00:- 0x40:↓ 0x20:→ 0x20:→ 0x40:↓ 0x60:↘ 入力(Old Trigger) 0x00:- 0x00:- 0x40:↓ 0x20:→ 0x20:→ 0x20:→ チェック対象 Trigger Trigger Trigger +Old Trigger Trigger Trigger コマンド1 参照キー 1:↓ 1:↓ 2:↘ 3:→ 3:→ 1:↓ コマンド1 入力受付時間 0.3ms (8/60フレーム) 0.3ms (8/60フレーム) 0.3ms (8/60フレーム) 0.3ms (8/60フレーム) 0.3ms (8/60フレーム) 0.3ms (8/60フレーム) マッチング ✕ ◯ ◯ ✕ ✕ ✕ 入力経過時間 0.0ms 約0.16ms 約0.3ms 約0.32ms 約0.48ms 0.0ms
  57. 57. “主観的満足度”とコマンド入力(7)  コマンドシーケンス検索方式のロジック(失敗例) 時間経過 Step1 Step2 Step3 Step4 Step5 Step6 入力(Trigger) 0x00:- 0x40:↓ 0x20:→ 0x20:→ 0x40:↓ 0x60:↘ 入力(Old Trigger) 0x00:- 0x00:- 0x40:↓ 0x20:→ 0x20:→ 0x20:→ チェック対象 Trigger Trigger Trigger +Old Trigger Trigger Trigger コマンド1 参照キー 1:↓ 1:↓ 2:↘ 3:→ 3:→ 1:↓ コマンド1 入力受付時間 0.3ms (8/60フレーム) 0.3ms (8/60フレーム) 0.3ms (8/60フレーム) 0.3ms (8/60フレーム) 0.3ms (8/60フレーム) 0.3ms (8/60フレーム) マッチング ✕ ◯ ◯ ✕ ✕ ✕ 入力経過時間 0.0ms 約0.16ms 約0.3ms 約0.32ms 約0.48ms 0.0ms Step4までに 入力時間がかかっている。 思ったように入力が 上手くいっていない。
  58. 58. “主観的満足度”とコマンド入力(7)  コマンドシーケンス検索方式のロジック(失敗例) 時間経過 Step1 Step2 Step3 Step4 Step5 Step6 入力(Trigger) 0x00:- 0x40:↓ 0x20:→ 0x20:→ 0x40:↓ 0x60:↘ 入力(Old Trigger) 0x00:- 0x00:- 0x40:↓ 0x20:→ 0x20:→ 0x20:→ チェック対象 Trigger Trigger Trigger +Old Trigger Trigger Trigger コマンド1 参照キー 1:↓ 1:↓ 2:↘ 3:→ 3:→ 1:↓ コマンド1 入力受付時間 0.3ms (8/60フレーム) 0.3ms (8/60フレーム) 0.3ms (8/60フレーム) 0.3ms (8/60フレーム) 0.3ms (8/60フレーム) 0.3ms (8/60フレーム) マッチング ✕ ◯ ◯ ✕ ✕ ✕ 入力経過時間 0.0ms 約0.16ms 約0.3ms 約0.32ms 約0.48ms 0.0ms コマンド列 受付時間を オーバーしてしまった為、 キー検索がリセットして しまう。
  59. 59. “主観的満足度”とコマンド入力(8)  コマンド入力のチェックのフロー システムからのレバー・ボタンを受け取る システムから入力値を受け取る。 ※プラットホームにもよるが、 “Direct”、”Trigger”、”Repeat”は 取得できるが“Old Trigger”等は自前 で実装する。
  60. 60. “主観的満足度”とコマンド入力(8)  コマンド入力のチェックのフロー システムからのレバー・ボタンを受け取る 検索テーブル上のコマンドすべてチェック コマンドシーケンス検索方式のロジックを 操作キャラクターすべてで行う
  61. 61. “主観的満足度”とコマンド入力(8)  コマンド入力のチェックのフロー システムからのレバー・ボタンを受け取る 検索テーブル上のコマンドすべてチェック コマンド列毎の入力の成否・リセット 成立したコマンドは実行されるまで リスト化して保存しておく
  62. 62. “主観的満足度”とコマンド入力(8)  コマンド入力のチェックのフロー システムからのレバー・ボタンを受け取る 検索テーブル上のコマンドすべてチェック コマンド列毎の入力の成否・リセット
  63. 63. “主観的満足度”とコマンド入力(8)  コマンド入力のチェックのフロー システムからのレバー・ボタンを受け取る 検索テーブル上のコマンドすべてチェック コマンド列毎の入力の成否・リセット コマンド入力の チェックは管理のみ
  64. 64. “主観的満足度”とコマンド入力(8)  コマンド入力のチェックのフロー レバー・ボタンからの入力を検索テーブルとは別に情報を保持 成立したコマンドは、リセットタイムが0になると“不成立”となる コマンドの優先順 位 コマンド名 成立・不成立 リセットタイム 優先1 コマンド1 ✕ 0.0ms 優先2 コマンド2 ◯ 0.4ms 優先3 コマンド3 ◯ 0.4ms
  65. 65. “主観的満足度”とコマンド入力(8)  コマンド入力のチェックのフロー レバー・ボタンからの入力を検索テーブルとは別に情報を保持 成立したコマンドは、リセットタイムが0になると“不成立”となる コマンドの優先順 位 コマンド名 成立・不成立 リセットタイム 優先1 コマンド1 ✕ 0.0ms 優先2 コマンド2 ◯ 0.4ms 優先3 コマンド3 ◯ 0.4ms コマンド列の内容は 最後のコマンドが重複しがちで 定義順に成立することが多い ユーザーの努力が無駄にならない ようにより複雑なコマンド列を 優先して成立・発動させる
  66. 66. “主観的満足度”とコマンド入力(8)  コマンド入力のチェックのフロー レバー・ボタンからの入力を検索テーブルとは別に情報を保持 成立したコマンドは、リセットタイムが0になると“不成立”となる コマンドの優先順 位 コマンド名 成立・不成立 リセットタイム 優先1 コマンド1 ✕ 0.0ms 優先2 コマンド2 ◯ 0.4ms 優先3 コマンド3 ◯ 0.4ms コマンド列全体の入力受付時間は 最終的にコマンド列が成立後も 有効になっている 成立後も時間経過・あるいは 他のコマンド入力と共に リセットされる
  67. 67. “主観的満足度”とコマンド入力(9)  成立したコマンド入力と、キャラクター制御 成立したコマンドがある場合、キャラクターの1次Stateをチェック コマンド1優先1 コマンド2優先2 成立したコマンド入力
  68. 68. “主観的満足度”とコマンド入力(9)  成立したコマンド入力と、キャラクター制御 成立したコマンドがある場合、キャラクターの1次Stateをチェック 待機(Idle) 移動 (Move) しゃがみ (Crouch) ジャンプ (Jump) 1次State コマンド1優先1 コマンド2優先2 成立したコマンド入力 攻撃 (Attack) コマンド入力の必殺技 が発動できるか確認
  69. 69. “主観的満足度”とコマンド入力(9)  成立したコマンド入力と、キャラクター制御 キャラクターの1次Stateを必殺技に変更する 待機(Idle) 移動 (Move) しゃがみ (Crouch) ジャンプ (Jump) 1次State コマンド1優先1 コマンド2優先2 成立したコマンド入力 攻撃 (Attack) 1次State 必殺技 (Special Attack) 発動できる状態であれば Stateを必殺技に遷移
  70. 70. “主観的満足度”とコマンド入力(9)  成立したコマンド入力と、キャラクター制御 State遷移できないと判定した場合は、次の入力タイミングを待つ 待機(Idle) 移動 (Move) しゃがみ (Crouch) ジャンプ (Jump) 1次State コマンド1優先1 コマンド2優先2 成立したコマンド入力 攻撃 (Attack) 次の入力タイミングまで コマンド情報を保持
  71. 71. “主観的満足度”とコマンド入力(まとめ1)  ユーザーが上手く出来た!と思ってもらう為、 システムでサポートすることで、満足度を向上させる “主観的満足度” ユーザが個人的に満足できるよう、また好きになるよう 楽しく利用できるようにしなければならない コマンド入力補助 物理入力が難しいものは補助 優先順位とタイミング ユーザーがイメージしたコマンド入力を システム側でサポートし、強い技を入力した 結果が反映されるような仕組みを提供
  72. 72. “主観的満足度”とコマンド入力(まとめ2)  コマンド入力が出来ることを良い体験であるように →ユーザーがより楽しくなる遊びのスパイス  ユーザーが入力した入力を技術的でサポートする →ユーザーが入力した情報を曖昧さを含めて加工して利用する →システムによって、練度が上がるように技術でサポート  ユーザー利益となるゲームデザインを考える →コマンド入力の練度や努力が無駄にならないようにする →ユーザーがイメージする結果に近づけていく
  73. 73. まとめ  ユーザビリティは、昔からゲーム開発をする過程で重 視されるべき要素のひとつであり、現在もそうである  今回2D格闘ゲームでの事例を紹介しましたが、 入力に関するプロセスは、ストレス軽減だけじゃなく ユーザーの満足度に大きく影響します  プレイするユーザーが遊びをより楽しむ仕組みを 紹介しましたが、今度皆さんがゲーム開発する際の ヒントになれば幸いです
  74. 74. 質問等はTwitter(リプライ・DM)でご連絡ください

×