Unityアクションゲーム制作記 その9 コンボ追加〜
ここ1ヶ月くらい、ずっと細かい調整と何か機能を追加するたびに起こるエンバグとデバッグ作業の繰り返し…。ようやく、今度こそ攻撃コンボはコレで! というところまでこぎつけました(あちこちバグはアリだけど)。
これまでに用意していた攻撃コンボは、連打とチャージ(押しっぱなし)の2種類でした。そこにタイミングを見て攻撃する目押し系のコンボを追加したのですが、これがまた難産というか、適当に仕様も決めずにやってきた継ぎ足し継ぎ足しのフラグ管理のツケが回ってきたというか……あっちこっちで不具合を引き起こして、ホント対応に苦慮しました(泣)。しかも片手1タップの操作だけで、3つのコンボを気持ち良く使い分けなければ意味がないので、その辺りの調整もしんどかった。
で、最終的にまとまったのが以下の3つの連続攻撃です。
連打攻撃>特徴:前方への範囲攻撃が強い
操作:とにかく連打しているだけで、連続攻撃を繰り出してくれる
コンビネーション攻撃>特徴:360度、全方位への攻撃が可能
操作:攻撃マーカー(赤いもやもや)の出るタイミングにタップすると全方位への連続攻撃を繰り出してくれる。他のタイミングでタップしてしまうと攻撃は繋がらない
チャージ攻撃>特徴:突進による強力な吹き飛ばし攻撃で敵を砕く
操作:ダブルタップ後、押しっぱなしにしているとエフェクトが発生。最大まで大きくなったあと、画面から話すと現在向いている方向へ突進する
コンビネーション攻撃の受付時間には、ド派手なエフェクトを用意して、タイミングがわかる用意もしてあります。ただ、受付時間自体が短いので、見てから押しても間に合わないこともあるのかも…ここは体でタイミングを覚えてもらうしかないかなと。
とりあえず、これでなんとか遊びやすくまとまったはず! しかしテストプレイしている自分が慣れてしまっているだけの可能性もあり、ちゃんとできているかどうかは判断に苦しむところですけど。
ま、これからバグを潰しつつ細かい演出面での課題を拾いながら、ゲームとして面白くするための方法を探っていきます(いまさらだけど)。とにかく前に進めて頑張っていかないとだ。うん。
Unityアクションゲーム制作記 その8 メニュー周り
やることはいっぱい、ゲームの中身を作り込まなくてはいけないのですが、ここのところは中身とは関係のないメニュー周りをいじり倒してました。縦横自由に持ち替えられるようにするためのメニューはどうすればいいのかなーと、ぼんやり考えながら行き着いた先がコレ⬇︎
ぶっちゃけていうと、メニューとして置くパーツ(ボタンやイメージ)それぞれに縦・横のレイアウト情報(表示の位置座標)を持たせ、切り替わったらそれぞれの位置へDOTweenを使って移動させるだけという力技。まだボロが出るときもなきにしもあらずですが、一応、さまざまな解像度の端末で、ある程度見苦しくない程度でレイアウトを維持できるような仕組みができたかなと。予想通りというか、完全自動化とかは無理でしたけど♪ あと、せっかく(?)なので背景の穴埋めにFayeちゃんを置いて、見た目だけは豪華にしてみました。他には、ゲーム中に敵へ与えたダメージ表示を入れたり、ゲームオーバー場面を作ったりしているだけで結構な時間が経過してしまいました。
このゲーム、そもそも「わらわらと集まって来る敵をぶっ倒す」というコンセプトだけで適当に制作を進めてきたおかげて、ゲーム全体の構成をどうするかとかを考え、具体的に形にしようとすると…とにかく決めなくてはならない細部&作らなきゃいけないものが多いことに気づかされます。やっぱりゲームを作るのは大変だなぁ。楽しいけど。ということで、広げすぎた風呂敷をうまくバランスよく整えつつ、引き続きがんばっていこう。うん。
Unityアクションゲーム制作記 その7 操作系の調整&敵ロジックの組み込み
ここのところは、敵をザクザクぶっ倒していく気持ちのいいアクションをストレスなく実現する操作性、そして倒される敵のバリエーションを追加すべく地道な作業をしていました。
操作性に関しては、連打系のコンボとタメ打ち系のコンボの2つをストレスなく使い分けれるようにすることを目指しました。最初よりはずいぶんと良くなったので、ひとまず操作系はこれでいったん終了。なにかもっといい方法が思いついたら改良したいところ。
敵は、ある一定の条件で行動を繰り返すという、簡単なロジックを実現できるようなものを目指してみました。ただ、バリエーションを作りたいので、なるべくならその行動を繰り替えす条件を個別にカスタマイズできるようにしたい。でも、いちいち敵ごとにスクリプトを書くのはどうにもきつそう。どうしよっかなーと、考えた末に……
1)敵はいくつか設定された基本行動を繰り返す
行動時間や設定目標を達成したら次の行動へ移行するようにする
・敵が取りうる基本行動
待機・索敵・移動・回避など
2)基本行動中に割り込み行動が起きたら、その割り込み行動に応じた行動へ移るようにする
・基本行動中に反応すべき割り込み行動
行動終了、プレイヤーから攻撃を受けた、プレイヤーを見つけた(見失った)、
攻撃範囲に入った(出た)、目的の場所へ移動したなど
こんな感じで敵本体のスクリプトに基本行動を実行するメソッド群をまとめて実装することで、スクリプトを使い回し出来るようにしました。で、個別のロジックを別ファイルに記述すれば、そこそこの手間でザコ敵は回せるかなーと。とりあえず近接系の敵(片手、両手攻撃)、遠隔武器系の敵を1つ作ってみたところ、そこそこ量産できそうな感触でした。
もちろん、決められた行動をトレースしているだけなので、障害物があれば引っかかるし、敵同士で押し合いへし合いのダンゴ状態にもすぐなったりします。要は敵自身の周りの状況判断ができていなかったりしている状態です。これはまぁ、現状どうやればいいのかまったく見えてないので、他のことを実装しつつ勉強していきます。
ちなみに、今回、口果音として「夏恋 karen〜」で声をお願いした櫻庭彩華さんにお手伝いいただきました。声に負けないように中身も頑張らなくては。うん。
Unityアクションゲーム制作記 その6 レーダー・BGM・効果音など追加
ここのところは、レーダーを追加したり、BGMと効果音を入れたりと外側を固める作業に終始しました。自分にしては珍しく早い段階で音を入れてみたのですが、やっぱり音が入るといいですね(↓の映像は音が出ます)。
さて本題っと、かねてより縦持ち・横持ちでのプレイをしたかったのでその辺の実装をしていきました。まずは、uGUIで画面比率を変えてもレイアウトを崩さないようにするにはどうするんだっけなーとググって見つけたのが、このページでした。
【Unity】UIを端末に合わせたサイズに調節する|ドジキャンラボ
必要な設定は、
1)Canvas ScalarにあるUI Scale ModeをScale With Screen Sizeに変更
2)Reference Resolutionを1080x1920に設定(縦持ちの場合)
3)Matchを横持ちなら0、縦持ちなら1
以上でOK。実際の設定はこんな感じ。
今回はリアルタイムに縦横を切り替えたいので、Canvasに現在どっちの向きであるかの監視スクリプトを追加します。
レーダーは、プレイヤーを中心にして画面外にいる敵がどちらの方向にいるかを示すものを用意します。表示方法は、ParticleSystem.Emiitで表示する方法を選択。ヒットエフェクトのパーティクルをEmitで一度に多くのエフェクトを生成たときに、あまり重くならなかった(性能の低い端末で多くのエフェクトを一度に表示させた時、引っかるような動作がなくなる)ので、こちらでも使うことにしました。
あとは、そこそこの数の敵をバッタバッタとなぎ倒したいということで、敵の出現方法を矩形の塗りつぶしと円形のライン状に一度に出せるようにしました。
大きさと位置を変えるだけで結構なバリエーションが出せるので、ひとまず敵の出現はこの2つをうまく使い回す方向でいきます。物足りなくなったら、追加すればいいや。
他にもプレイヤーの死亡判定もつけたので、とりあえずゲームとしての最低限の体裁は整えられたかな。とはいえちょっと寄り道が過ぎたので、今度こそ、ほったらかしの敵の管理をちゃんとやらなきゃ…うん。
・BGMで使用したアセット
Heavy & Metal Loops
https://www.assetstore.unity3d.com/jp/#!/content/53112
Unityアクションゲーム制作記 その5 コンボ&攻撃リアクション概ね実装
アセットに含まれた5つの攻撃モーションから、どうしたら攻撃バリエーションを増やして楽しめゲームにできるか。無い知恵を絞り出した結果が上の映像にあるような感じです。敵をガンガンぶっとばす気持ちのいいゲームになりそうな雰囲気になってきた…かな。ちなみに攻撃の流れは、
通常攻撃>通常攻撃>通常攻撃>通常攻撃>コンボフィニッシュ攻撃
こんな感じ。この流れは自由にカスタマイズできるようにして、使いやすいコンボを目指すといった遊び方もできるようにしていきます(予定)。片手操作可能にしたいということで、タップをしていくとあらかじめセットしておいた攻撃を繰り出していくというお手軽仕様。そして複数回攻撃を繰り返し、最後に多少派手なコンボフィニッシュ攻撃で〆るという流れにしてみました。攻撃は、静止状態から発動するものと、走り状態の後に発動するものの2種類を用意しています。走りからのコンボスタートは、最初の一撃に仰け反り効果を付加したりという差別化をつける予定です。
ちなみに、この攻撃の種類は成長によって増えていくのか、それともクエスト報酬によって増えていくのか…はたまた両方か…というのは、まだ悩み中です。
・基本のノーマル攻撃(8種類)
1つのモーションを無理やり分割して数を増やしたたため、つながりがややおかしいものもなきにしもあらずなのが残念なところ。とはいえ、ここはこれ以上どうこうするのは厳しいので、ひとまず〆としておきます。
・攻撃が当たった時のリアクション(4種類)
ノーリアクション:ヒットエフェクトのみ表示(敵が動き、攻撃してくる)
仰け反り:一瞬敵の動きが止まる(敵の攻撃が止まる)
吹き飛ばし(ノックバック):強制的にプレイヤーから敵が離される
気絶:一定時間、敵が行動不能になる
敵を打ち上げたり、毒のような継続的にダメージを与えるリアクションも見当してみました。しかし、3Dアクションにまともに対応できていないのと継続ダメージで勝手に敵が死ぬ状況を回避するのがめんどかったので、これはとりあえず保留。いずれ、かっこいい空中コンボとか決めたいなぁ…。
・コンボフィニッシュ攻撃(仮で三種類)
まずは、回転(周囲吹き飛ばし)、突進(前方吹き飛ばし)、打ち下ろし(範囲気絶)を用意。ここはいろいろ工夫できそうなので、いずれ数を増やしていきます。
あと、外見があまり変わってないのですが、唯一の見栄えが変わったところとしては、敵のHPゲージが付きました。
上のような64x8ドット、32パターンのスプライトを切り替えるという原始的な方法です。敵の数が多くなりそうだったので、単純な方法にしてみたのですが…効果があるかどうかは謎だったりします。
いろいろ悩んだ視点に関しては「邪魔になりそうな障害物は置かない」 という方針にして、現状の見下ろしで固定し、余計なことをしないことにしました。それよりも、コンボフィニッシュ攻撃のときにカッチョイイカメラアングルに凝るとか、そういうところに注力していこうと思います。
ということで、プレイヤーキャラに関しては一通りできたので、次は敵のアルゴリズムやら管理やらを詰めていく予定です。効率的に敵を動かし、増産できるように…したいなぁ。いったい、どういう風に作ればいいんだろうか…がんばって考えようっと。
Unityアクションゲーム制作記 その4.5 爆発!
今回は視点の話にしようかとおもったのですが、なかなか出口が見つからずに難航してます。一応、後方視点・トップビューと試して、やはりラジコン操作の後方視点より、トップビューの方がとっつきやすさ、そして操作感も上という感触。3Dならではの魅力が減ってしまいますが、軽快なアクションが楽しめるようにすればいい&遊びやすさを優先することにします。
ただ、トップビューとはいえキャラを見せたいからやや斜め見下ろしの視点にしたいし、そうすると障害物やでっかいボスキャラに隠れてしまうことがあるから…どうしよう? と、うだうだ悩んでいてもうまい解決策が見つからず、気付けばコンボ周りのシステムを全面的にいじり直していました。
テストや試行錯誤をしやすいように攻撃の組み合わせ自由にできるようになったところで、適当に突進攻撃へ爆発エフェクトをつけてみたら……た、楽しいw
エフェクトが重なりすぎて思いっきり処理落ちしてますが、どっかんどっかんエフェクトが出るとやっぱり気持ちいいですね〜。なるべく派手に見せられるようにしたいので、パーティクルの出し方も単純にInstantiateで生成するのではなく、少しはうまくできるように考えてみることにします。その間に視点問題もいい考えが浮かぶでしょう。きっと。
ちなみに突進&爆発のエフェクトは、これ(↓)の中にあるものを使いました。
FT Free Sample
https://www.assetstore.unity3d.com/jp/#!/content/15900
なかなかいい感じだったので、購入候補に入れておこうっと。うん。
Unityアクションゲーム制作記 その4 判定、入りました
モーションのセットがあらかた終わったということで、今回は予定通りプレイヤーキャラに当たり判定をつけていきます。ちなみに差別化をするといっていたコンボですが、ノーマルコンボは、攻撃1:仰け反り、攻撃2:仰け反り、攻撃3:なし、攻撃4:仰け反り、として、走りコンボは、攻撃1:仰け反り、攻撃2:仰け反り、攻撃3:吹き飛ばし、にしました。うん、だいぶゲームっぽくなってきた。
youtu.be
ということで、実際にどんな作業をしていったかというと……。
キャラ本体のCapsule Collider(キャラ移動用)、敵からの攻撃判定用のBox Colliderと鎌の攻撃判定用のBox Colliderをそれぞれアタッチしてくだけです。攻撃判定用のコライダーは、攻撃した(された)時に敵を吹き飛ばさないよう、isTriggerのチェックを入れます。
この辺はゲーム次第だと思いますが、キャラ本体に細かく判定をつけたい時は、それぞれの場所に判定用のColliderを別途追加するようです。今回はガチの格闘アクションゲームにすることもないので写真下のように本体にBox Collider1つ付けるだけで、十分な感じになっています。
ちなみに敵キャラはこんな感じです。
こちらは、キャラクターと同じように本体のCapsule Collider、攻撃判定用のBox Collider、剣のBox Colliderをアタッチしていきます。
実際の当たり判定の流れはどうしようかと、いろいろググったりいつもの参考サイトを見るにつけ、レイヤーマトリクスの設定によってを行って当たり判定の効率化を少し行えそう。で、ゲーム中に必要な判定を考えてみると、
「プレイヤーの攻撃は、敵本体にしか当たらない」
「敵の攻撃は、敵本体に当たらない」
「プレイヤー&敵の本体は地形に当たる」
「プレイヤー&敵の攻撃は地形に当たらない」
こんなもんかな? ということで、これくらいなら明らかに不要な判定を省けるかなーとレイヤーマトリクスの設定を行ってみます。
適当に不要そうなものを選んでチェックを外してますが……大丈夫でしょう、きっと。諸々の設定が終わったので、ようやくオブジェクトの接触が起きてからの処理を組み込んでいきます。まず、必要なのは、以下の2つ。
・プレイヤーの攻撃が敵に当たった
・敵の攻撃がプレイヤーに当たった
それぞれ接触後に必要な処理は、
・ダメージを加える(いずれ実装)
・受けた攻撃の属性によって「のけぞり」「吹き飛ばし」などのアニメーションを発生させる
この2つ。処理の流れを作る時に気をつけたのが、「なるべくキャラクター本体に役割を集約させること」でした。OnTriggerEnterで判定を取ったところで諸々の処理せずに、わざわざ処理を回すとオーバーヘッドの時間がもったいないのは確かです。しかし、自分がこれまで作ったアプリでは、とにかくやれるところでやれることを勝手にやってしまって最後に苦労していることが多かったもので……少しは、整理してみようかなと。あと、昔ながらの逐次処理でしか物事を考えられないジジイなもんで、各所でばらんばらんに処理を流してしまうと、全体を把握するのが辛いのです。ということで、まとめたのが下になります。……わかりにくい。でも、こんな程度でもまとめておかないと、後で必ず自分で何をやっていたか忘れて困るのでこれでヨシとしておきます。
もう1つ判定系で面倒くさいというか忘れそうなのが、攻撃中にColliderのON・OFFをしなければならないところ。今回の敵の場合でいうと、攻撃のモーションは、下ろしていた剣をいったん振り上げてから振り下ろすというモーションになっています。
振り上げ前と振り下ろし後の余韻まで結構な時間があり、全部に判定をつけてしまうとゲームとしてまずいことになります。いろいろ悩んだ末、アニメーションイベントで必要な場所のみにColliderコンポーネントをON/OFFするメソッドを呼び出すことで対応しました。Unityでは、これがベターな方法なのかなー。アニメーションイベントは便利な一方、外から見えにくいこともあって、仕込んだものを忘れたり、仕込み忘れたりすると大変なことになりそう…気をつけなきゃ。
次は、操作・カメラ系の見直しをする予定。気持ちのいいアクションをするためには……どうしたらいいんだろう。しばし悩んでみます。
※画像は説明用に適当にトリミング・再配置しています。キャプチャー画面をそのまま掲載してありません。あしからず。