#ではまあ
ウサといいます。
皆様にはご機嫌よろしゅう。
最近、これで最後にしようかなーと思ってた格闘ゲームの制作がひと段落したので、こういうとこ気を付けたら・・・と思ってたことを書くのだ
(なので、特に文体とか話の順序とかは考えない)
テスト投稿も兼ねてるのであまり気にされないよう。
あんまり言語・フレームワーク・プラットフォーム依存の話はしたくないのだけれど、C/C++で作ってきたのでそれに近い表現が多いかも・・・
格ゲーとゆうのは1/30秒なり1/60秒なりでフレームごとに動くので、その単位でどういう動きをするか、というのを書くデータ構造を最初に考えるが吉
例えば編集しやすいように
こんな感じでExcelで起こしてもいいよねえ、この表の意味するところは、
基本的にフレームは上から下へ行を追って見ることにする(1行は1フレームの記述に相当)
・モーション#0は立ち(ニュートラル)1行目
3~11行目はモーション本体で、
アニメ番号1、2,3を3フレームずつ表示しますよ
属性は立ち
軌道は静止
飛び道具の生成などはなし
11行目で「#0:0」つまり#0モーションの0フレーム目に戻りますよ
→結果として1,2,3のアニメを繰り返して表示する
・モーション#1は強攻撃(立ち強キック)14行目
5フレーム目まで攻撃判定はなし
攻撃持続は4フレーム
ダメージ量は10(補正は後でする)
スペシャルゲージの増加は0(!)
・キャンセル属性、削り属性などを付与するのもあり
・・・
対応するアニメはこんなん
とかいうような表を作っておくと(まあ、ウサはそれすら面倒でメモ帳でだーっと作成してしまったけれど、というかOfficeがメインのパソコンに入ってないし)
適当に書いてしまったけれど、ここで自分のゲームに必要そうな属性をテーブルに入れておくといいのだ
例えば「ジャンプ先」って項目があって、上の「#0:0」は「モーション#0の0フレーム目に遷移する」って意味だけれど、これを拡張して「トリガーに応じて任意のモーションの任意のフレームに遷移する」機能を用意したりするといろいろな機能が実装できたりする
例えば
・相手に攻撃が・・・
・ヒットしたときジャンプする先のモーション(ヒット時有利とかキャンセル可能になるとかを実装)
・ガードされたときジャンプする先のモーション(ガード時不利とかを実装)
・投げが成立する条件でジャンプする先のモーション(投げ処理の実装)
・自分の攻撃判定と相手の攻撃判定がかちあったときジャンプする先のモーション(相殺、ブロッキング、当身投げなどいろいろの実装)
このExcelファイルを、まあマクロかなんか使って数値列にコンバートするのはできるじゃないですか(文字列になってるところは、ビット列にするのが無難かな)
そしたら、例えば
typedef struct _mtype
{
unsigned int アニメ番号;
unsigned int 軌道;
unsigned int 攻撃属性,本体属性;
・・・
} mtype;
って構造体に流し込んで、
mtype playermotion[モーションの最大数][適当に]:
// ここ、mtype *playermotion[n] = malloc(サイズ);・・・とかしたほうが当然無駄がなくていい、ジャグ配列使える言語ならそれでいいし
putsprite(x,y,playermotion[立ちモーション][index].アニメ番号);
とかで表示できるようにするといいわけだ・・・
で、1/60秒なり1/30秒なりごとに呼ばれるルーチンでindex++してやれば、普通にアニメが動くって話・・・
(こないだAndroidでゲームアプリをUnity使って作った時、2Dアニメーションのタイムラインでアニメ組んで「こりゃあわからん・・・」って頭を抱えたけれど、案外Update()の中で参照するアニメセルを1/60秒で切り替えるだけでいいのかもしれん・・・試してないけれど)
で、上の表はモーションデータについて延々と記述するのだけれど、あたり判定や食らい判定はそれとは別にスプライト(アニメパターン)側のどこかで保持するが吉
(モーションデータに入れると量が膨大なので)
・軌道について
まあ普通に格ゲーやってるとあれですが、通常ジャンプのように自然と重力に従って上昇から下降に転ずるもの、なんかよくわからん物理法則を無視した移動をするもの、があるので、両方を指定できるようにしておくと吉
・x、yの初速度を与え、あとは重力でy方向を処理していく
・x、yのペアを何個か用意し、それを都度キャラクターの座標に加算する
まあなんぞかの方法で両方指定できるようにするといいと思うかも
・飛び道具について
同じフォーマット表で作れると思うけれど、これをプレイヤーキャラと同じスコープに置くか、飛び道具専用のスコープに置くか、で、例えば「相手の飛び道具を跳ね返す」「飛び道具が相手をつかまえて投げる」といったちょっと特殊な処理を考えるときに悩むことになるので最初に方針を決めるが吉
・投げとか
投げられる側が「どのように飛んでいくか」を持っているか、投げる側が「相手をどの位置に動かして最終的に飛ばすか」を持っているか、という実装の違い・・・前者の場合は「すべてのキャラが特定の相手の投げに対する飛ばされモーションを持つのでデータ量が大きくなる」、後者の場合は「投げられている最中のグラフィックはどれを表示すればいいのか、投げる側が知る手段が必要になる」という話
#判定の話
あたり判定、食らい判定の話をいくつか。
緑の線はキャラの表示時中心となる軸。
赤の枠が攻撃判定。
黄色の枠が食らい判定。
・初段の攻撃を食らった後、部分的にか全体的にか食らい判定が後ろに下がる例(左)
・食らい判定の位置、大きさはそのまま、アニメだけが食らいに移行する例(右)
ヴァンパイアとかはこんな判定があるキャラがいるようですな
・要するに自分の中心線から後ろにまで攻撃判定の領域が伸びていると、結果として相手を飛び越したときにそこがひっかかってめくりになる調整ができる。
地上に相手がいる場合、(左)の方が一見攻撃判定が厚く、当たりやすそうに見えるが、密着した相手に当たりやすいのは実は(右)。
4.当たって見えないのに当たってしまう判定
こんなケースも。普通、必殺技は「性能がいい」ことを主張するため、右側の攻撃アニメで言えばもう少し大きい判定をつける気がする。
ここでは控えめな大きさの判定にしてるけれど、それでも左のキャラの足先をひっかけて当ててしまうよ。これで「無敵」属性がついていたら・・・対策としては
・対空必殺技側の攻撃判定(赤枠)をもう少し細らせるとか弱体化
まあ、弱体化される方は「自分の技に信頼がおけなくなる」のでこれはしないほうが。
・攻撃される側の食らい判定(黄色枠)を強化
具体的には「足先まである食らい判定を、せめてひざくらいまででおさえておく」とか。
・属性で縛る
ストIVとか、同じ食らい判定でも「飛び道具に対して無敵」「頭部攻撃に対して無敵」とかいろいろ属性があるそうで、でもまあ・・・プログラム的には条件判断が増えるのであんまりうれしくはないよね。実行速度が遅い言語だと致命的。
5.絶対無敵対空技
こういうのはどうだろう。相手の飛び込みにタイミングを合わせてるだけで絶対につぶされない魔法のしゃがみ攻撃。しゃがみ攻撃なので空中ガードもできない。
サムライスピリッツの橘右京しゃがみ大蹴りとかこんな感じになってるのではないかと。対策としては
・攻撃側の性能調整
例えば発生を遅くして、読み勝ってないとつぶせない程度の性能にする
・食らい判定の調整
黄色枠の食らい判定が首から下にしかない上に赤枠の攻撃判定が出るので、普通に考えたら上からつぶせない。なので食らい判定をもっと上に伸ばす。それでもキャラによっては有利不利が出てしまうかも。
・属性で縛る
やりたくはないけれど、特例的に「この攻撃は空中ガードもできますよ」と属性をつけてしまう。
・・・と、誰か別のキャラで強力な飛び込みからの連携・連続技があるキャラがいると詰んでしまう。
こんな感じで、判定をとるといっても結構考えなきゃならないことがあるよ。
例えば1キャラで1つの技を調整したら、それが他のキャラに対して有効か、登場キャラが10体いたら10体分チェックしなきゃならないので作業量が膨大なのは理解してほしい。
そういう意味では最近の20体30体とキャラが出てくる格闘ゲームは厳密には全体を調整するのは不可能に近くて、あれ、最初のバージョンでキャラが少ないうちにとれるバランスはとってるから、後から足しのキャラは差分で済んでるだけでね。
つまりキャラが多くなればそれだけ、あるキャラに対するドラスティックな変更はしづらくて小手先の対応になりがちってこと。
ネットで見ると、「あんなクソ調整しやがって、俺ならもっとうまく調整できるね」なんて言ってる人もいるようだが、「格ゲー野郎」とか、自分でいじれるゲームもあるようなので、ぜひ挑戦してみて欲しいですね。けろり
あ、アニメGIF張れるじゃん
餓狼伝説2/SPで、超必殺技というのは「体力が赤点滅してるときに出せる」もので、当初はコマンドも知られてなくて、CPUが突如使ってきてユーザーが涙目になり、そしてコマンドが知られるようになったという経緯があって、まあ、「相手がいつ出してくるかわからない」という意味でドキドキするもんであったよね。
出がかりがちょっと長くて、気が付けばガードできたけれど、自分がなにか行動してる最中とかだと微妙に間に合わなくて食らってしまう・・・という緊張感があったよ。
龍虎の拳とかになると、まあ同じく出がかりがちょっと間があって、何かくるな・・・というのはわかってて・・・以前に、気力ゲージが画面上に登場してしまったから、「ゲージを小出しにして通常必殺技が出るということは、これ、思いっきり全開にして出せる技があるんだろうな」ということは勘のいいユーザーはすぐに気づいたよね。
つまり、ゲージというものが用意されたゲームではそれを開放する威力のでかい技が絶対あるよね、ということがわかってしまって、「いつ出してくるかわからない」というドキドキはなくなってしまった。
それと合わせるかのように、超必殺技発動時の画面演出、ってのが目立ってきたわけだよ。
これ、いいのかわるいのかわからんよね。ただ、どうせゲージがMAXになってて、超必殺技も普通の選択肢に入ってる状態はわかるんで、なんかあったほうがいいと思ったんだろうね。
というわけで、
・背景の暗転とか必要か
・カットイン(顔がアップになる)のは必要か
とか、自分のゲームでは考えてみてもいいかもね。逆に顔グラフィックが表示される間があることで、それまで続いてきたスピード感をそこで殺してるんじゃないかという気はしてる。
システムに応じて、やりたい人はやってみる、やりたくない人はやらない、でいいのではないかと。
まあ、カットインを豪華(1枚絵じゃなくてアニメにするとか)にすればするほど、キャラクター本体のアニメなりなんなりを削ることになるからね。メモリ制約がきつい場合は。
技を多くすることにメモリ割くのか、カットイン入れて豪華にすることに使うのか。
パソコンで気にすることもないと思うけれど、スマートホンとかだと考えたほうがいいかも。
#モーションの話とか
経験的に、立ち←→しゃがみの遷移時のモーションをしっかり用意しておくと使いまわしがきくという話。
例)
・対空技で着地したとき、しゃがみに遷移し、そこから立ちへ戻る。
・ジャンプの開始・着地時に入れる。
・バックダッシュの着地に入れる。
・空中で体勢を立て直して着地する瞬間に入れる。
・ダウン時、起きあがりのアニメに入れる。
同じように、「でんぐり返し」するアニメなんかも見栄えよく作っておくと使いまわしできるよ。
・空中での態勢立て直し
・起き上がり
・前転・後転
#アニメパターンの話とか
格ゲー作ってる俺頑張ってる!
ってのはわかるけれどなんかこうパッとしない・・・って自分でも思うようなアニメーションパターンを組んじゃう例・・・って話
昔の格闘ゲームって、メモリが少ないとか制約があったから、その中でアニメパターンを作る関係上、使いまわしとかいろいろあったけれど、今はそういう時代でもないので、見栄えを少しでもよくしようってことだぬ。
例えば弱パンチとかで、本当に手だけが動いてるアニメを作っちゃうケースとかあるんだけれど、本当はできるだけ動かないドットを作らない方がいい・・・
まあ、ここら辺は、格闘技の経験がなくても、ちょっと立ちあがって動いてみればなんとなーくわかるようなわからんような。
上の図はキャラクターを上から見て、左パンチを出した場合の図、なわけだけれど、手だけが動くということは実際はなくて、体もなんかしら動いてるわけですので、「腕だけ描き変えてパンチできたー」というのは今はしないほうがいいんじゃね?
昔の格ゲーはそうだったけれど、あれ、メモリ足らんかったから節約のためにしてるだけだからね。
本来はちょっとでもどこか動いてた方がいい。
2枚目と3枚目、ほとんど同じだけれど、服が揺れてたり、袖が少し動いてたりするわけで、そのちょっとが大事、という話。
・大ぶりのモーションの話とか
①構えているところから、
②拳を後ろに振りかぶって、
③前に殴りかかる
というモーションを考えたとき、厳密にいうなら①と②の間にも何枚かアニメが必要なんだけれど、実はなくてもいいんじゃないか、という話。
これは95年だったかな?そこらへんで作ったゲームの分割してあったスプライトを、わかりやすく復元したやつ。
左上がモーションの1フレーム目になるんだけれど、本来、立っている状態からここへ至るまでに、もう1~2枚あってもいいんじゃないか?
と思うのだけれど、動かすと意外にそこは気にならない。
実際に動かすとこういう感じで、意外に枚数なくてもちゃんと見えるわけです。
あんまり枚数が多いと「発生までに時間がかかる重い技」ってことになって、性能調整の段階で削ることがあったりする。
せっかく作ったアニメパターン、削るのはもったいないので、できたらうまくコマ割りを考えよう、とかそんな話ー
#見える攻撃・見えない攻撃の話
ネットとかで見ると、攻撃判定の発生までに6~7フレームはないと、「見てからガード」できる攻撃にならないという意見が多いですぬ。
実際見えてないわけはないのだけれど、「見て、それから反応してガード操作する」ことができない、ということで。
例えば中段攻撃(この用語、なんか違和感あるが・・・要するに「しゃがみガードができない、立ってガードしないと防げない」属性の攻撃のこと)が、弱パンチなんかと同じ4フレーム前後の発生速度だったりすると、基本しゃがんでいる割合が多い2D格闘ゲームで、しゃがみガードから立ちガードに「見てから切り替え」ができないので、「クソな調整しやがって開発め」と言われることになるよ。
テレビアニメーションの作画参考書なんかは、いっぺん読んでみるといいかもしれないよ。
#「長いコンボ」って必要か?って話
格闘ゲームの対戦ってこんな感じで時間とともに進行するわけですよ。
まず緑の「出の速い技での差し合い」がちょこちょこあって、そこから初段を当てた側は青の「コンボを入れる」で時間が過ぎる、それと同じ時間、相手は赤の「見てるだけ(何もできない)」時間を過ごすことになるわけで。
いわゆるコンボゲーは、この「緑」の時間がより短く、「青(赤)」の一方的な時間がどんどん伸びていくことになる。それでも実力伯仲ならいいよ?
でも、上級者と初心者なら、上級者が「青」ばっかり、初心者が「赤」ばかりのつまりなーんにもできない時間だけが過ぎる。
それって面白いか?
面白くはないわな。
スタートボタン押した後、ちょっとやりあったら後ずっと殴られてるだけ。
そりゃあちょっとねえ。
それでも昔の格闘ゲームは、「青」「赤」の一つながりの時間ってそんなに長くなく、「緑」の機会が結構あって、初心者でも「青」を取るチャンスは多かった。コンボゲーが主流になるにつれて、試合をひっくり返すチャンスがなくなって・・・そりゃあ、初心者いなくなるわ。
というわけで、まあなんでもかんでもだらだら続くコンボなんかやらん方がいいんじゃない?
という話。
コンボの段数か、内部カウンタ・・・総ダメージに比例してカウントアップするような・・・とかが一定値を超えたら、相手は食らい判定を失って強制ダウン・・・とかしたほうがいいように思う。
ダウンした相手を再び引き起こして・・・補正リセットして・・・なんてのは、少なくとも初心者がやってみようと思うにあたってはやっちゃいけない設計じゃないかと思うがどうかー
まあ、好みだから、「俺は自分が心行くまで相手にコンボを叩きこんで引き起こしてまたコンボ入れて・・・って熱戦がしたいんだ」って思うのは自由だが、「その反対に相手は熱戦どころか”今日の晩飯なにかなー”と操作もできない自分のキャラを見てるだけ」って可能性があるってことは覚えておくべし。
で、ここでやっちゃうのが「コンボ回避できるようにボム入れたらよくね?」っつって、余計なゲージ追加して「人間が注視できる以上の注目点」を用意して、「コンボから脱出する機能を付けたからこれで初心者も安心さ!」って思っちゃう開発者。
いや、初心者はそもそもそのゲージの意味わからんからさ。
ボムってなんだ?
って意味理解する前に倒されて、まあ次はやらんだろうな。
という話。
でなくても、「一つのゲージに複数の情報を入れ」たり、「一つの画面に複数のゲージ=注視すべき要素をつめこん」だりして、ユーザーがどこ見ていいかわからん画面作っちゃうのはよした方がいいんだと思うの。
そういうのに慣れちゃった人はいいけれど、格闘ゲームが衰退してる今、初心者でもやりたいと思わせるには?
という話も込みで。
人間、慣れるまでは一度にできることはそう多くない。
格闘ゲーム華やかなりしころだと、そういう複雑な文脈も暗黙の了解で通じて納得の上で対戦台にコイン入れたもんだけれど、今そういう時代でもないので。
格闘ゲーム今日初めてやってみるんだ、システムとか知らんけれどな!
というプレイヤーの方が多いってことを考えて作らないとドツボに落ちるんじゃないかと思ったりはするのだ・・・。
ただ、大事なのは、「長い」コンボはいらないじゃね? であって、「コンボ完全になくせ」じゃないんだよな。
完全に単発の攻撃しか入らないようにすると、しゃがんで待って、相手がじれてスキのデカい攻撃を出してきたところを出の速い小技で刺して、要するにちまちましたけん制しあいだけになって、これも面白くないのかもな。
ここら辺は開発者の考え方というか「長いコンボ」「短いコンボ」がどんなもんか、ってイメージが各人によって違うから、出来上がるモノってそこで違っちゃうよなあ。
個人的にはエリアル・・・「空中で複数の攻撃を当てられる」とか言いだすとアウトだとは思ってるが。
じゃあお前、今立ちあがって空中で2回、パンチでもキックでもいいからやってみ。
普通はできないから。
そこら辺を現実的に考えると、地上で何ヒットかするのはいいが、浮いた相手を追いかけてジャンプ攻撃で複数ヒット・・・は現実的でないからやめよう・・・となれば、自然、大体入りそうなコンボの上限数って決まってくる感じがするよ。
さらに言えば、「同じ弱パンチボタンを押したら同じ弱パンチが出る」ってのも微妙だよな、とは思ってる。
同じ人間でも、重心の位置や体力、それまでにもらった身体的ダメージ・・・というのがあって、全部が全部同じようにできるわけがないのだから、本当は、同じ弱パンチでも何種類か性能違いのを用意して、ランダムに出るようにするくらいでもいいのかもしれない。工数ないからやらんかったけれど。
#コンボゲーとアニメーションの制約の話
(2019/10/06追記)
ツイッターの方では何回か書いた話なんだけれど、久しぶりにこっち更新しておこうかなとかそんな感じで。
自分の側の攻撃が相手にヒットしたとき、相手は食らいモーションになって、一定時間操作できなくなるわけだけれど、
弱攻撃→食らいモーション(復帰まで10フレーム)
中攻撃→食らいモーション(復帰まで20フレーム)
強攻撃→食らいモーション(復帰まで30フレーム)
みたいな、同じ食らいモーションでも何種類かあって、当てた攻撃の属性によって食らいモーションの復帰時間を変える、みたいな実装というのは普通なんだけれど、コンボゲームになるとこれがキャラクターのアニメーションを作るにあたってかなりまずいのだという話。
コンボというのは、まあ、基本弱→中→強と当てていって、相手が硬直している間に次の攻撃を当てることをいうわけだけれど、上の例で言えば、弱→中を当てるとき、中攻撃は最速で入力した場合10フレームで攻撃判定が発生するようなモーションでないとコンボにはならないですな?
つまり、10フレームで攻撃判定が発生するようなアニメーションしか用意できないということです。
もっと言って、プレイヤーとしては弱→中→強とつながるのだから弱→強もつながったら、いや、つながるだろ、と思ったりする。
それを実現しようとすると、強攻撃も10フレームで攻撃判定が発生するモーションしか組めなくなるわけ。
中攻撃をはさめば20フレーム猶予があるからそれにあわせたアニメを作れるはずなのに、それを飛ばす仕様にすると10フレーム分の猶予しかなくなる。
何にしろ、コンボで入れられる攻撃アニメを組むということは、直前に想定される食らいモーションの硬化時間内に収まる範囲でしかアニメーションを設定できないってことになるわけです。
で、食らいモーションというのはあまり長いフレーム数かけたらいいものでもなくて(これは、単に長い硬化時間だと弱パンチ連打でもコンボになってしまうことからも推測できると思うけれど)、ある程度の制限・・・例えば弱がぎりぎり連打で入らないフレーム数とかで収めないといけない。
そういうところを考えていくと、コンボゲームの攻撃モーションって、攻撃判定発生までのフレーム数にそんな猶予がなくて、後はフォロースルー(空振りしたりした後の硬直)で差別化する・・・ってことになって、じゃあ実は最初から性能のいい強攻撃振って暴れるだけでもそこそこ出がかりとかも見づらくてやりづらいんじゃ?ってことになってしまう。
つまり性能の調整がめんどくさいってことです。
その割に、攻撃判定の発生までに用意できるアニメーションの枚数はあまり差別化できず、あまりに出だしの遅い技は「コンボに組み込めない死に技」として認識されて、結局どれも似たような発生時間の技・・・になってしまうって話。
動画サイトとかに最新格闘ゲームのコンボムービーとか上がってるでしょ?
あれ見たとき、弱だろうが中だろうが強攻撃だろうが、同じようなリズムで相手に刺さってると思うけれど、つまりどれ選んでも攻撃発生が同じような感じ・・・弱中強という「属性」だけがコンボを縛ってるだけで、本質を言ったらどのゲームも同じなんじゃないかってことです。
それがコンボゲームの致命的なとこ。
差し合いだと、「一見当てようもなくどうしようもない死に技」でも、とっさに突っ込むとか、なんぞかの使い道があったりするんだけれど、コンボゲームだととにかくつながる性能(攻撃判定領域の大きさ、発生速度)を突き詰めていくだけになるんで動画に録画してみるとどのタイトルでやってみても似たようなプレイ感覚になっちゃうというね。
これ、結構怖いことで、どんなメーカーや個人製作者ががんばって作りこんでも、はたから見たらどれも同じように見えるという・・・多様性を持たなきゃならないアクションゲームとしては致命的な問題になるわけです。
まあ、食らいモーションの硬化時間を動的に操作するとか当然考えられるけれど、アニメーションというのは一連の流れの中で見せるものなんで、途中をすっ飛ばしたりするのも結構考え物だったりするわけですよ。
食らいモーションをたくさん用意して、状況に応じて硬化時間を細かく調整していくというのは考え・・・いや工数としちゃあんまり考えたくもない話なのだ。
まあ、どう解決するかはこれから格闘ゲームを作るかもしれない人が、各自考えてみてください。
動的に食らいモーションの硬化時間を変えるのもひとつだし、弱→中→強はつながるけれど弱→強はつながらない、とするのもひとつ。
そもそもコンボをつながらないようチューニングしていくのも一つです。
いろいろあるね。
#ネット対戦っていらないんじゃね?って話
昔ネット対戦実装したことあるけれど、あんまいいことないんですよ。
・開発者側でよくないこと
ネットワーク対応コードめんどくせえ
そもそも今のネットワーク環境って「切れる、ラグる、シンクロできない」ものだから、リアルタイム対戦でプレイヤー双方に支障ないゲームなんかないわけ。ハードウェア的に無理があることを無理してソフトウェア層でやろうとするから無理が出る。
ウチとか、ネットワーク環境が結構怪しくて、google まで1msで行くpingが、隣のサブパソコンに行くのに100msかかったりして、もうそれでやる気でない。
・プレイヤー側でよくないこと
ゲームって良くも悪くも、間抜けなCPUがこっちの誘いに応じで技を空振りしたところにしてやったりでカウンターぶち込んだりして「やっぱりCPUバカだな!」と優越感に浸ったり、気心の知れた友人とサシで対戦して、「あいつここでこう振ってくるよな・・・よっしゃ読み勝った!」って喜んだりできるところに面白さの一つがある。
ネット対戦ってそういうの関係なく、赤の他人との対戦だから、そこで出るのは自分の人間性能。ゲームを楽しもうと思っても、否応なしに「上には上がいる、お前はその程度なんだよ!」と現実を突きつけられるってわけ。
・結局
ネット対戦を用意すると、
まず対戦できるようにするコードを書くのがめんどくさい
↓
「自分の人間性能がそこまで」って現実を突きつけられるユーザーの心が痛い
↓
「ラグい」「マッチングクソ」「運営クソ」とぼろくそにけなされた開発者の心が痛い
という感じで、誰も幸せにならんのよ。
誰も幸せになれないのにゲームなんかやったってしょうがないよね、別のことやりにいくよね。
という話。
##面白いCPU戦とはなんなのか?って話
上の方で、ネット対戦は自分をすり減らしてつまらん、って書いた。
たぶん、気心の知れた友人とわいわい言いながらやるのが一番楽しいんだと思う。
でもまあ、そういう人間の相手がいないときもある。
そういうとき、CPUが相手になるわけだが。
面白いCPU戦ってなんなのかと考えると、結構めんどくさかったりする。
「超反応する相手をおとり技で釣っておいて反撃する」・・・のが常に面白いわけではなさそうだ。
(フフフ、またこいつ同じパターンで反撃してきよった、対空の一番痛いやつで仕留めてやる、という遊び方はあるにしても、普通に人間とやってるような感覚でプレイしたいときもあるよね)
バーチャファイター4の高次面とかちょっとひどかったよね。
自分が押してるボタンに反応してカウンター入れてくるみたいな。
あれはいろいろな意味でまずくて、
・人間がそんな速い技にカウンター入れられる性能はない=人間とかけ離れたやりとりになる
・機械的で、ああこれ超反応だ、とすぐ見破れて、しかしなかなか返せない
・「Aに対してB」という簡単な方程式で規則正しく、単調さを抱かせる
要するに苛立たしいってことです。
そんな感じで、どうも超反応するCPUってのは人間からしたらやってられない感じが強くなるなと。
ある程度ランダムで、でも馬鹿じゃなく・・・というところですかね。
ウサが今回の格闘ゲームタイトルで実装したのは以下のようなロジック。
・相手との距離を計算する。(ピクセル単位である必要はなく、適当に離散化していい)・・・①
・その距離で「出して意味のある攻撃」を絞る
(例えば遠く離れた間合いで打撃を出す必要はなく、移動か飛び道具、突進技・・・と候補を絞れる)
・自分が出せる状態(ガード中でない、食らいモーションや技後でキャンセル不能な硬直中でないなど)ならその技を出す・・・②
それに対して攻撃をもらってしまった場合、
・変数として持っている技のスコアを減らす
相手に攻撃してダメージなり削りなりできた場合、
・変数として持っている技のスコアに何らかの値を加算する
①に戻る
この①のところで、出せる技の候補を何個か用意して、その技のスコアを見るわけです。
スコアが高ければ、少なくとも今までに通ったから試してみる価値はあるってことで、そっちを出す。
(ここで決め打ちで一番スコアが高い技を出す・・・と、その技だけスコアが上下して他の技が出なくなるので、ここはランダムである程度振ってやる)
決定した技を②で出して、その結果に応じて技のスコアを加減する
相手にクリーンヒット>相手にガードされた>相手に当たらなかった>相手から反撃された
くらいの適当な数字で。
反撃された、は、ここではまずい手だってことで、スコアをマイナスしていいと。
実は②の実装が大事で、そのフレームで出せる技の候補として、連続コンボになりそうなデータ列を内部で持っていて、それをもとに連続技を出したりしている。
まあ割と簡単なロジックなんだけれど、実際動かしてみると結構いやらしい連携組んできたりするんで。
長時間持続型の飛び道具超必殺技を出しておいて足払いで浮かせをしかけてきたりするし。
まあこれは、「近距離で超必殺技を出した」後、近距離に相手がいるんで技の候補として「立ち攻撃を振る」「しゃがみ攻撃を出す」とか出てきて、その結果「浮かせを狙った」ように見えるだけだけれど、ゲームとしては「ダメージを与えられれば正義」なんで。
今流行りの深層学習とかで、相手との距離を勘案しつつ、「その距離である技を出してヒットしたかどうか」を評価してやると、まあものすごい回数試行したら、強い技を優先して出してくるようになるかもね。
その場合は「コンボになる技を次に振る」をどう決定するか、だけれど、きっちり「この技からこちらの技にチェーンコンボがつながる」というような情報が設定されていたら、他のチェーンにならない技よりも重みをつけて計算してやってもええかもしれない。
そのうち、積極的にチェーンコンボを繰り出すようになるんじゃないかと。(試してないが)
超反応してもいいが、「これやったらこれ振ってくる」を見破られてしまうとCPU戦って途端に面白さがなくなってしまうので、そこら辺どう処理すんのかなと。
格ゲーって、なんかそういうCPU戦のロジックをおろそかにしてきたんじゃないかと思ってて(なぜならそれ以上に楽しめると思われるところの対人戦、ネット対戦という土壌が出来上がってしまったから)、一人で遊ぶという最も基本的な状態の面白さの追求が足らなかったんじゃないかなあなんて思ってるわけです。
例えばアーケード基板にメモリようさん載っていて、それに人間とCPUの対戦データを全国から集めて蓄積し、それを教師あり学習でゲーセンが閉店した後に学習して、昨日通用した戦法が翌日にはかなりの確率でガードされた・・・とかなってると面白いがなあ。
なんぞか、まだ研究の余地はあるな、ってことです。
[2019/04/03追記]
なんてことを書いていたら、SNKのサムライスピリッツの新作(「ポリサム」と言ったらいろいろ語弊があるんだろうな・・・)で、機械学習によるAIデータを使ってネット経由で対戦できるとかそんな記事が流れてきて、ああよかった、メーカーもやっとCPU戦がこれまでの歴史のわりにつまらないってことに気が付いて対策を考えてるんだなあ、などとは思ったよ(まあ、いろいろ面白くなりそうな要素を考えていったら大体そこらへん思いつかないとおかしいとは思うけれど)、
#なんで廃れちゃったのか、って話
まあ、シューティングでも格ゲーでも、あんだけ盛り上がったのになんで廃れたのか、って話なんよね。
個人的な見解でいえば、「ゲームとしての最適解が極まっちゃった」時点でもう終わりなのだと思うよ。
格ゲーでいえば、飛び込み大キックから繋いで必殺技で締める、というところまでワンセット、ってのが定まっちゃったところで。
ボードゲームでもなんでもいいんだが、セオリーというか、「これやってれば安定」というものができてしまうのがね。
さっき書いた、「ボタンを押したら同じ弱パンチでも何種類かランダムに出たら」って話はこれなのね。つまり安定した要素をもたせないというか。
最適解、つまりこれやれば強い、って定番のアクションがあると、つまりそれを正確にこなせるだけのマシーン的プレイヤーが強いに決まってるわけだから、製作側としてはそれをさせない、つまりランダム要素が入れ込めたほうがいいわけだが、ネット対戦とランダム要素って相性が悪いのよね。
ランダムってことは、そのシード(乱数の元)が常にシンクロできなきゃいけないので、多少パケットを落としてもプレイを再現しようとしてる通信対戦とは相性がよくないのよ。
まあ通信のコード書けばわかると思うけれど、だから今の格ゲーは間違っても「ランダムに技がでる」ような設計にはできないってことです。通信対戦でも帯域が確実に担保できるんならいいけれどね、そうではない。
でも、プレイを安定じゃなく不確定にすることを考えたら、それだけでいろいろ改善できる要素はあるわけです。
・ランダムに技が出る(性能が違う技がでて、コンボルートを「覚える」だけで決めることはできないようにする)
・コンボをこすると、普通に考えたら運動するだけで疲れるから、動くたびに技の性能が落ちていく(例えばボタン押しからの遅延が出て技が出しづらくなるとか)、動きが悪くなる、の実装
・モーションを何種類か用意して、疲労したら動きが悪くなることの表現
・ガードのタイミングによって「相手の攻撃を余裕をもって受けられたのでガードキャンセルが簡単にできる」「きわどいタイミングで受けたのでガードキャンセルで反撃する余裕はない」と、ガードにも何種類か性能を用意してしまう
など、いろいろね。
ただ、工数を考えたら現実的ではないからやらないだけで。
格ゲーも、やろうと思えば、まだできることはあるし、上級者と初心者がやって面白いゲームにする可能性が残されてはいる。
いや、上級者に乱入されて、ただガードするだけ、コンボ食らい続けるだけ、のゲームに、誰がコインもう一度入れようと思う?
普通は二度とやりませんよ。そういう世界に慣れてるマニアだけが二度目三度目のトライをする。ガードで固められ、コンボ食らい続ける、そこを初心者でも返せる要素を考えることですなー。
ボムを用意すれば・・・という考えはやめるが吉。
なぜなら、「このタイミングでボムを使えばこのコンボは抜けられる」というのも、「最適解」を固定することに他ならないから。ということ。
#今作る意味はあるのか?
1995年くらい・・・windows95ブームが来る前に、PC-98(MS-DOS上)で作った格闘ゲームを掲載しておくよ。
さて、今、格闘ゲームを作る意味はあるのか?という話。
結論から言うと、「個人が製作する意味はもうない」と考える。
1.規模がでかすぎる
システム自体はそんな難しいことはやってないけれど(ちょっとトリガーのかけ方が変わったりする状態遷移を考えられるならゲームプログラムの中では楽な方だと思う)、グラフィックの量が多かったり、サウンドが必要だったり、と、とにかく物量が必要になる。
一人でやるのもいいが、複数でやる、となったら、長期間メンバーを拘束して、他に積めるかもしれない経験値を捨てさせるというのはリスクが大きい。
2.ユーザーがいない
今回作ったやつは、一番DL数が多かった作品の1/5500程度のDL数しか出ていない。つまり、20年ほどの間に、それだけ興味を持っているユーザーが減ったってことです。
あの当時、雑誌のCD-ROMにも掲載されたりしたので、1/5500どころか1/6000とかそういう数字になるかもしれない。(それを、まったく金にできなかった、1円にもできなかったというのは自分の人生において大きなミスだったと今でも後悔してるが、それはまあ別の話)
つまり、プレイしてくれる人もいない、規模だけでかい、時間がかかる、というゲームを作る意味はあるのか?いやない、ってこと。
例えば、登場キャラクターが1~2人、対戦オンリー、とかすごく小規模に仕様を絞って作るのなら、キャラクターアニメーションの勉強とか、プログラム環境に慣れるためとか、まだ理由もあるけれど、本格的に何人もキャラクターがいてシステムも作りこんで・・・ってやるのは、もう、プロに任せておいていいんじゃないかと。
まったく否定的で、これからやろうと思ってる人は折れる意見かもしれんけれど、経験者としてはそう考えますよ。
いや、ゲームなんて、遊んでもらって(あるいはDLしてもらって)ナンボだからねえ。遊んでももらえない、売れない、小遣いにも自分の名前を売る(これって、実は意外と大事だったりする)、ということにもまったくプラスにならない現状で格闘ゲームを完成させようってのは、まあ無謀だと思います。
もっと規模が小さくて成立するものを、期間を開けずに多くリリースするのが成功する近道だと思うよ。
できなかった自分がいうのはなんですが。
#「キャラセレにいなきゃいけない」呪いの話
まあ格闘ゲームだけの話じゃないです。
メーカーが、どうしてかそれに囚われているという話。
格闘ゲームのプレイヤーキャラ選択画面に表示されているキャラはすべてプレイヤーが使えなくてはいけない(あるいは使えるキャラクターはすべて選択画面に表示されていなくてはならない)と、メーカーが思い込んでいるようにも見えるので。
「龍虎の拳」のCPUモードでのキャラクター選択画面にはリョウとロバートしかおらず、ストーリー上出てくる敵キャラは選べなかったけれど、今、なんか知らんがどのキャラもかならず選択画面にいるよね。
10人以上いるのに4人しかいない
すべてのキャラがプレイアブルで選択可能でなきゃいけないのかというとそんなこと全然ないんだけれど、どうしてかメーカーはすべて選べるようにしたがる。
・ネタばれしかない
つまりどういうキャラクターがそのゲームの中にいるのか、ということがそもそも隠せていない。せいぜいボスキャラクターが初期状態ではいないかも?でもそのうちタイムリリースや次期アップデートで選べるようになるし・・・
格闘ゲームがいろいろ行き詰っている中で、ストーリーモードの充実とかは一つの方向だと思うんだけれど、「どうしても隠しておきたい」ということができない。
「ストーリーに出てきたこのキャラなんでプレイヤーが使えないの!?」と、わがままをいうお偉いプレイヤー様が出てくるからです。で、メーカーが弱腰でそれにこたえて(なんぞかの調整をして)そのキャラを使えるようにしてしまい、キャラクター選択画面にそいつが表示されるようになる。
つまり、「ああこの世界にはこういうキャラがいるのか」ということが隠せないってことです。
例えばアドベンチャーゲーム、RPGで、OPデモで、事件の核心にいるようなキャラが出てきて、これみよがしに活躍してたらどうする?
カットでちらっと出る程度ならまだなくはないけれど、ネタバレをしだしたら?
ぶちころしゅぞわれぇ・・・(ああ見てないけれど)
三幕構成というストーリーテリングのメソッドがあって、例えばストーリーの序盤に敵の黒幕が主人公と接触する・・・というのはあり、なのだそうだけれど、そこでは「主人公に好意的、または無関心・・・少なくともいきなり悪意を持っていてはならない」という話があるのですね。
キャラクターセレクト画面にいきなりいるじゃん!
敵の黒幕が!
しかも悪のオーラ噴き出してる顔グラフィックで!
・・・アカンよね。
これ以上どうしようもないくらいに雄弁に、こいつは悪です、と。
そして主人公が「正義」であれば、そいつが対極の「悪」で、ストーリーのどこかで主人公と激突するのだと。
見なくてもわかってしまう。
ストーリーの魅力も半減どころか、なくてもいいんじゃねストーリーモード・・・となる。
そこが格ゲーの既存の考え方での限界なのです。
考え方変えないとね。
・ストーリーに関する厳しい制約
あるいは、時系列に沿った矛盾が起きるようになる。
例えば、
「新作格闘ゲーム!キャラクターは8人!」(1)
「待望のアップデート!舞台は前作の10年後!追加キャラクター二人!」(2)
「時代は(2)の少し前・・・主人公と新たな邂逅・・・追加キャラクター2人!」(3)
何が悪いかって?
(3)の時点でいる新キャラ2人は、それより後の時代になるはずの(2)では登場しえない、つまりどっかで捨てるか、わけのわからんアレンジをしてさらにそのあと別の作品で出すとか(あっナッシュさんちーっす)
という風に、ネタにつまって時代を前後させるごとにどんどんストーリー上の矛盾が出てくる。
そして、(1)でいた8人は(2)でも(3)でも継続して登場しているとすれば、つまり昔からの顔なじみで、新シリーズになっても新鮮さもない陳腐なストーリーでからむしかなくなる。(1)のライバルキャラが(3)とかで「ぬぬ、俺と同じ技を使うとは!?」とかやってたら、お前は記憶力ないのか? ってことになるしね。
(2)でも(3)でも無理をしてキャラクターを追加して風呂敷を広げようとするごとに世界にゆがみが生じる、ってことです。
それだったら、最初っからプレイアブルキャラクターを減らして、ストーリーに登場するキャラは徹底して隠しておく方がいいのよ。
それより、メーカーが「XXシリーズ最新作に、〇〇参戦決定!」とかやっても、「あっそう、昔と変わらないメンツだね、で?」ってことになって、つまりマンネリでしかないわけですよ。
新作ゲームに触れるにあたって、何が楽しいか?
「ああ、このキャラクターは、どういう強敵と戦って、どういう結末を迎えるんだろう?」と事前のわくわく感が大事なのです。
でも、上の例だと、少なくとも時系列上最新の(2)でプレイアブルってことは、(1)(2)(3)通じて引退するはめになるような大事件も起きず、なんか適当にストーリー流して終わりだな。と「自動的に」確定するわけです。(あっナッシュさんちーっす)
もうそんなん、格闘ゲームのアクション部分も大した変更もできず、ストーリーもドラマチックにいくこともできず、でじり貧に決まってるやないですか。
そういうつまらないところで可能性を狭めてしまったのが今の格闘ゲームのデザインなわけです。
せめて「龍虎の拳」「ウォーザード」みたいな方向に進化していたらまだ違ったかもしれないけれど、まあ終わったことは終わったことなんで。
#ありがちな昔語り
今、格闘ゲームって斜陽の感があるジャンルだけれど、昔は一世を風靡していたころがあってな?
ゲームメーカーは、まあ大手は1度くらいは格闘ゲームタイトルを出した経験がある・・・くらいの感じで(若干オーバー)
そんなころ、個人製作もいろいろプロジェクトが立ち上がっては瓦解していったものです。
ストーリーだけ、キャラ設定だけ、動くものも止め絵すらもできずに消えていったサークルも結構見てます。
最近もちょっと作りかけた・・・でも停止しちゃった、みたいなブログサイトを見かけて、そうだよな、一度はチャレンジしたくなるもんだよな、「じぶんのかんがえたさいきょうの格ゲー」とかそんなのをな。
でもな
その、順番が違うんだよね。
今も昔も、みんな、リアルタイムに格闘ゲームを制作する過程を出そうとしてるみたいだが。
それが間違いなのだ・・・
例えばこないだ見かけたブログは、キャラ設定とか作ってあったが、実はそういうのは一番最後にすべきなのよ。
一番最初にすべきは、
・自分が作るゲームでどんな機能がソフトウェアに要求されるか
・要求された機能を実現するにはどんなデータ構造が適しているか
・そのデータを作るにはどういうツールがあればいいか
・ゲームの規模は?メンバーはどのくらい確保できそうか?
なんてことから始まって、
・ゲームのシステムはどういうものか
・システムを成立させるにはどんな条件が大事か
例えば、弱攻撃はこのくらいのフレーム数で、ガードはこんなフレーム数で・・・とか、数字的な設計も含む
・ゲーム全体の方向性(スピード勝負か、差し合いか)
・アニメの枚数はどのくらい必要そうか(言い換えれば1体作るのにどんだけ時間かかりそうか)
とか・・・
そういう見積り、設計を積み重ねて、次に1キャラ2キャラで、システムがちゃんと動くレベルまでプロトタイプを作る。
ここまでがものすご重要なのよ。
ここまでできたら8割できたと思っていいくらいに。
で、ここまで見たらわかると思うけれど、別にブログで制作過程を実況するような面白い要素ってこの段階では何もないのね。
プロトタイプができて、対戦とかやってみて、問題があるようなら上の設計を見直す。修正が必要なら修正する。ホント泥臭い作業ばかりなんよ。
そういうところができたら次に、
・ゲームの詳細なストーリーやらキャラデザイン、ボイス、モーション、あたり判定・攻撃判定、アニメパターンの設計
・上のを形にする
・声を入れてみる?
・効果音とか?
と、この辺まで来て、やっとブログとかで定期的に更新してユーザーに見せて「面白そう!次の更新も見よう!」と思われるレベルになる、って話です。
いいか?
メーカーの新作発表見てみ?
「新作発表!(ドン!)」「XX(メーカー)が送る新機軸格闘アクションゲーム登場!(ドドン!)」→プロモーションムービー流れる→「20XX年、冬、稼働開始!(バーン!)みんなよろしく!」
こんな流れじゃないの。
で、新作発表してから公式ブログ、ツイッター、スタートするが、よく考えてみ?
新作発表の場で、すでにある程度動くものができてるんだよ。でないとプロモムービーなんてできないだろ?
そこまで作りこんでおいてから、後は粛々とキャラを追加、データ作って・・・って、毎週更新していく話のネタにできるようなレベルの「きれいな話」がようやっとできるのよ。
いきなり設計もできてない段階から、泥臭いコーディングだのなんだのを見せて、誰か継続して見よう、ってやつはいないよ。そういう時代です。
ウサも最後の格ゲー作った時、ツイッターのアカウントで、「今日は弱攻撃作ったよ!」とか「投げ技作ったよ!」って毎日のようにツイートして、まあ開発の実況みたいなことをやったけれど、そんなん、普通はできません。
ウサの場合、システムも大体昔のを作り直して動かせるのがあって、データ構造も使い方も全部自前で分かってて、後、データ追加していく過程見せれば、ストーリー考えていけば、キャラ追加すれば・・・って、ゲーム制作の楽しそうでおいしそうなとこだけ残してた状態で、そこからツイートしたからね。
おかげさまでその期間はそこそこ見る人はいた(けれど買う人はいなかった)、そういうもんです。
一見華やかで楽しそうに見えるゲーム制作、新作発表の前には、絶対に地味ーな、設計・実装の期間があって、それはとてもじゃないけれどお見せできるようなものではないですよ、だからメーカーもそんな段階では発表なんか絶対しないのだ。
ってことです。
言い換えれば、いきなりブログで「これから格闘ゲーム作ります!キャラ設定は・・・CVはXXさんみたいな感じで・・・」とか言い出してるとこはやべーにおいがぷんぷんするぜなのだ。
一番華やかで楽しそうなところを最初にやっちゃって、後、おいしくない泥だらけの部分しか残ってないので、最後まで平らげられるわけがないのだ。
こうしてプロジェクトは(まだ着手もしないうちから)崩壊する。
まあ、物事には順序がある、ってよくいうけれど、まさにそのとおりで、まずいところを我慢して食べて、最後においしいものをおいしくいただけるかどうか、我慢して設計・実装を続けられるか、ってとこですなー。
今時格闘ゲームやれとも言わないけれども、どのゲームでも結局設計・実装・テスト(お披露目)・調整・リリースの順番に従うしかないのよ。お披露目してブログで実況するのは開発ステップでも最後の方、これ、覚えておくと吉。
#さいごに
まあ、どこもかしこもコンボゲーなんで、なんか誰か毛色の変わった格ゲー作ってくれるとうれしいかなーと思って、ちょっと思ってることを書いてみた
つづきは書くかも書かないかも
(適当に更新する)