読者です 読者をやめる 読者になる 読者になる

エディトリアルデザイナーのアプリ制作日記

Unityで遊ぶ個人開発者のメモ書き

Unityアクションゲーム制作記 その7 操作系の調整&敵ロジックの組み込み

 ここのところは、敵をザクザクぶっ倒していく気持ちのいいアクションをストレスなく実現する操作性、そして倒される敵のバリエーションを追加すべく地道な作業をしていました。

youtu.be

 操作性に関しては、連打系のコンボとタメ打ち系のコンボの2つをストレスなく使い分けれるようにすることを目指しました。最初よりはずいぶんと良くなったので、ひとまず操作系はこれでいったん終了。なにかもっといい方法が思いついたら改良したいところ。

 敵は、ある一定の条件で行動を繰り返すという、簡単なロジックを実現できるようなものを目指してみました。ただ、バリエーションを作りたいので、なるべくならその行動を繰り替えす条件を個別にカスタマイズできるようにしたい。でも、いちいち敵ごとにスクリプトを書くのはどうにもきつそう。どうしよっかなーと、考えた末に……

1)敵はいくつか設定された基本行動を繰り返す

  行動時間や設定目標を達成したら次の行動へ移行するようにする

 ・敵が取りうる基本行動

  待機・索敵・移動・回避など

2)基本行動中に割り込み行動が起きたら、その割り込み行動に応じた行動へ移るようにする

 ・基本行動中に反応すべき割り込み行動

  行動終了、プレイヤーから攻撃を受けた、プレイヤーを見つけた(見失った)、

  攻撃範囲に入った(出た)、目的の場所へ移動したなど

 こんな感じで敵本体のスクリプトに基本行動を実行するメソッド群をまとめて実装することで、スクリプトを使い回し出来るようにしました。で、個別のロジックを別ファイルに記述すれば、そこそこの手間でザコ敵は回せるかなーと。とりあえず近接系の敵(片手、両手攻撃)、遠隔武器系の敵を1つ作ってみたところ、そこそこ量産できそうな感触でした。

 もちろん、決められた行動をトレースしているだけなので、障害物があれば引っかかるし、敵同士で押し合いへし合いのダンゴ状態にもすぐなったりします。要は敵自身の周りの状況判断ができていなかったりしている状態です。これはまぁ、現状どうやればいいのかまったく見えてないので、他のことを実装しつつ勉強していきます。

 ちなみに、今回、口果音として「夏恋 karen〜」で声をお願いした櫻庭彩華さんにお手伝いいただきました。声に負けないように中身も頑張らなくては。うん。

Unityアクションゲーム制作記 その6 レーダー・BGM・効果音など追加

 ここのところは、レーダーを追加したり、BGMと効果音を入れたりと外側を固める作業に終始しました。自分にしては珍しく早い段階で音を入れてみたのですが、やっぱり音が入るといいですね(↓の映像は音が出ます)。

youtu.be

 さて本題っと、かねてより縦持ち・横持ちでのプレイをしたかったのでその辺の実装をしていきました。まずは、uGUIで画面比率を変えてもレイアウトを崩さないようにするにはどうするんだっけなーとググって見つけたのが、このページでした。

【Unity】UIを端末に合わせたサイズに調節する|ドジキャンラボ

 必要な設定は、

1)Canvas ScalarにあるUI Scale ModeをScale With Screen Sizeに変更

2)Reference Resolutionを1080x1920に設定(縦持ちの場合)

3)Matchを横持ちなら0、縦持ちなら1

以上でOK。実際の設定はこんな感じ。

f:id:hamazakifactory:20160711234642j:plain

 今回はリアルタイムに縦横を切り替えたいので、Canvasに現在どっちの向きであるかの監視スクリプトを追加します。

f:id:hamazakifactory:20160712135805j:plain

 レーダーは、プレイヤーを中心にして画面外にいる敵がどちらの方向にいるかを示すものを用意します。表示方法は、ParticleSystem.Emiitで表示する方法を選択。ヒットエフェクトのパーティクルをEmitで一度に多くのエフェクトを生成たときに、あまり重くならなかった(性能の低い端末で多くのエフェクトを一度に表示させた時、引っかるような動作がなくなる)ので、こちらでも使うことにしました。

tsubakit1.hateblo.jp

 あとは、そこそこの数の敵をバッタバッタとなぎ倒したいということで、敵の出現方法を矩形の塗りつぶしと円形のライン状に一度に出せるようにしました。

f:id:hamazakifactory:20160712140345j:plain

f:id:hamazakifactory:20160712140352j:plain

 大きさと位置を変えるだけで結構なバリエーションが出せるので、ひとまず敵の出現はこの2つをうまく使い回す方向でいきます。物足りなくなったら、追加すればいいや。

 他にもプレイヤーの死亡判定もつけたので、とりあえずゲームとしての最低限の体裁は整えられたかな。とはいえちょっと寄り道が過ぎたので、今度こそ、ほったらかしの敵の管理をちゃんとやらなきゃ…うん。

・BGMで使用したアセット

Heavy & Metal Loops

https://www.assetstore.unity3d.com/jp/#!/content/53112

 

Unityアクションゲーム制作記 その5 コンボ&攻撃リアクション概ね実装

youtu.be

 アセットに含まれた5つの攻撃モーションから、どうしたら攻撃バリエーションを増やして楽しめゲームにできるか。無い知恵を絞り出した結果が上の映像にあるような感じです。敵をガンガンぶっとばす気持ちのいいゲームになりそうな雰囲気になってきた…かな。ちなみに攻撃の流れは、

 通常攻撃>通常攻撃>通常攻撃>通常攻撃>コンボフィニッシュ攻撃

こんな感じ。この流れは自由にカスタマイズできるようにして、使いやすいコンボを目指すといった遊び方もできるようにしていきます(予定)。片手操作可能にしたいということで、タップをしていくとあらかじめセットしておいた攻撃を繰り出していくというお手軽仕様。そして複数回攻撃を繰り返し、最後に多少派手なコンボフィニッシュ攻撃で〆るという流れにしてみました。攻撃は、静止状態から発動するものと、走り状態の後に発動するものの2種類を用意しています。走りからのコンボスタートは、最初の一撃に仰け反り効果を付加したりという差別化をつける予定です。

 ちなみに、この攻撃の種類は成長によって増えていくのか、それともクエスト報酬によって増えていくのか…はたまた両方か…というのは、まだ悩み中です。

・基本のノーマル攻撃(8種類)

 1つのモーションを無理やり分割して数を増やしたたため、つながりがややおかしいものもなきにしもあらずなのが残念なところ。とはいえ、ここはこれ以上どうこうするのは厳しいので、ひとまず〆としておきます。

・攻撃が当たった時のリアクション(4種類)

 ノーリアクション:ヒットエフェクトのみ表示(敵が動き、攻撃してくる)

 仰け反り:一瞬敵の動きが止まる(敵の攻撃が止まる)

 吹き飛ばし(ノックバック):強制的にプレイヤーから敵が離される

 気絶:一定時間、敵が行動不能になる

 敵を打ち上げたり、毒のような継続的にダメージを与えるリアクションも見当してみました。しかし、3Dアクションにまともに対応できていないのと継続ダメージで勝手に敵が死ぬ状況を回避するのがめんどかったので、これはとりあえず保留。いずれ、かっこいい空中コンボとか決めたいなぁ…。

 ・コンボフィニッシュ攻撃(仮で三種類)

 まずは、回転(周囲吹き飛ばし)、突進(前方吹き飛ばし)、打ち下ろし(範囲気絶)を用意。ここはいろいろ工夫できそうなので、いずれ数を増やしていきます。

 あと、外見があまり変わってないのですが、唯一の見栄えが変わったところとしては、敵のHPゲージが付きました。

f:id:hamazakifactory:20160630232727p:plain

上のような64x8ドット、32パターンのスプライトを切り替えるという原始的な方法です。敵の数が多くなりそうだったので、単純な方法にしてみたのですが…効果があるかどうかは謎だったりします。

 いろいろ悩んだ視点に関しては「邪魔になりそうな障害物は置かない」 という方針にして、現状の見下ろしで固定し、余計なことをしないことにしました。それよりも、コンボフィニッシュ攻撃のときにカッチョイイカメラアングルに凝るとか、そういうところに注力していこうと思います。

 ということで、プレイヤーキャラに関しては一通りできたので、次は敵のアルゴリズムやら管理やらを詰めていく予定です。効率的に敵を動かし、増産できるように…したいなぁ。いったい、どういう風に作ればいいんだろうか…がんばって考えようっと。

Unityアクションゲーム制作記 その4.5 爆発!

 今回は視点の話にしようかとおもったのですが、なかなか出口が見つからずに難航してます。一応、後方視点・トップビューと試して、やはりラジコン操作の後方視点より、トップビューの方がとっつきやすさ、そして操作感も上という感触。3Dならではの魅力が減ってしまいますが、軽快なアクションが楽しめるようにすればいい&遊びやすさを優先することにします。

 ただ、トップビューとはいえキャラを見せたいからやや斜め見下ろしの視点にしたいし、そうすると障害物やでっかいボスキャラに隠れてしまうことがあるから…どうしよう? と、うだうだ悩んでいてもうまい解決策が見つからず、気付けばコンボ周りのシステムを全面的にいじり直していました。

 テストや試行錯誤をしやすいように攻撃の組み合わせ自由にできるようになったところで、適当に突進攻撃へ爆発エフェクトをつけてみたら……た、楽しいw 

youtu.be

 エフェクトが重なりすぎて思いっきり処理落ちしてますが、どっかんどっかんエフェクトが出るとやっぱり気持ちいいですね〜。なるべく派手に見せられるようにしたいので、パーティクルの出し方も単純にInstantiateで生成するのではなく、少しはうまくできるように考えてみることにします。その間に視点問題もいい考えが浮かぶでしょう。きっと。

 ちなみに突進&爆発のエフェクトは、これ(↓)の中にあるものを使いました。

FT Free Sample

https://www.assetstore.unity3d.com/jp/#!/content/15900

 なかなかいい感じだったので、購入候補に入れておこうっと。うん。

 

Unityアクションゲーム制作記 その4 判定、入りました

 モーションのセットがあらかた終わったということで、今回は予定通りプレイヤーキャラに当たり判定をつけていきます。ちなみに差別化をするといっていたコンボですが、ノーマルコンボは、攻撃1:仰け反り、攻撃2:仰け反り、攻撃3:なし、攻撃4:仰け反り、として、走りコンボは、攻撃1:仰け反り、攻撃2:仰け反り、攻撃3:吹き飛ばし、にしました。うん、だいぶゲームっぽくなってきた。
youtu.be

 ということで、実際にどんな作業をしていったかというと……。
f:id:hamazakifactory:20160618200414p:plain
 キャラ本体のCapsule Collider(キャラ移動用)、敵からの攻撃判定用のBox Colliderと鎌の攻撃判定用のBox Colliderをそれぞれアタッチしてくだけです。攻撃判定用のコライダーは、攻撃した(された)時に敵を吹き飛ばさないよう、isTriggerのチェックを入れます。
f:id:hamazakifactory:20160618201126p:plain
f:id:hamazakifactory:20160618201129p:plain
f:id:hamazakifactory:20160618201132p:plain
 この辺はゲーム次第だと思いますが、キャラ本体に細かく判定をつけたい時は、それぞれの場所に判定用のColliderを別途追加するようです。今回はガチの格闘アクションゲームにすることもないので写真下のように本体にBox Collider1つ付けるだけで、十分な感じになっています。
f:id:hamazakifactory:20160618201547p:plain
 ちなみに敵キャラはこんな感じです。
f:id:hamazakifactory:20160618111147j:plain
f:id:hamazakifactory:20160618113428j:plain
 こちらは、キャラクターと同じように本体のCapsule Collider、攻撃判定用のBox Collider、剣のBox Colliderをアタッチしていきます。
 実際の当たり判定の流れはどうしようかと、いろいろググったりいつもの参考サイトを見るにつけ、レイヤーマトリクスの設定によってを行って当たり判定の効率化を少し行えそう。で、ゲーム中に必要な判定を考えてみると、
「プレイヤーの攻撃は、敵本体にしか当たらない」
「敵の攻撃は、敵本体に当たらない」
「プレイヤー&敵の本体は地形に当たる」
「プレイヤー&敵の攻撃は地形に当たらない」
こんなもんかな? ということで、これくらいなら明らかに不要な判定を省けるかなーとレイヤーマトリクスの設定を行ってみます。
f:id:hamazakifactory:20160618202939p:plain
 適当に不要そうなものを選んでチェックを外してますが……大丈夫でしょう、きっと。諸々の設定が終わったので、ようやくオブジェクトの接触が起きてからの処理を組み込んでいきます。まず、必要なのは、以下の2つ。
・プレイヤーの攻撃が敵に当たった
・敵の攻撃がプレイヤーに当たった
 それぞれ接触後に必要な処理は、
・ダメージを加える(いずれ実装)
・受けた攻撃の属性によって「のけぞり」「吹き飛ばし」などのアニメーションを発生させる
 この2つ。処理の流れを作る時に気をつけたのが、「なるべくキャラクター本体に役割を集約させること」でした。OnTriggerEnterで判定を取ったところで諸々の処理せずに、わざわざ処理を回すとオーバーヘッドの時間がもったいないのは確かです。しかし、自分がこれまで作ったアプリでは、とにかくやれるところでやれることを勝手にやってしまって最後に苦労していることが多かったもので……少しは、整理してみようかなと。あと、昔ながらの逐次処理でしか物事を考えられないジジイなもんで、各所でばらんばらんに処理を流してしまうと、全体を把握するのが辛いのです。ということで、まとめたのが下になります。……わかりにくい。でも、こんな程度でもまとめておかないと、後で必ず自分で何をやっていたか忘れて困るのでこれでヨシとしておきます。
f:id:hamazakifactory:20160618203906p:plain
 もう1つ判定系で面倒くさいというか忘れそうなのが、攻撃中にColliderのON・OFFをしなければならないところ。今回の敵の場合でいうと、攻撃のモーションは、下ろしていた剣をいったん振り上げてから振り下ろすというモーションになっています。
f:id:hamazakifactory:20160618173940p:plain
 振り上げ前と振り下ろし後の余韻まで結構な時間があり、全部に判定をつけてしまうとゲームとしてまずいことになります。いろいろ悩んだ末、アニメーションイベントで必要な場所のみにColliderコンポーネントをON/OFFするメソッドを呼び出すことで対応しました。Unityでは、これがベターな方法なのかなー。アニメーションイベントは便利な一方、外から見えにくいこともあって、仕込んだものを忘れたり、仕込み忘れたりすると大変なことになりそう…気をつけなきゃ。
 次は、操作・カメラ系の見直しをする予定。気持ちのいいアクションをするためには……どうしたらいいんだろう。しばし悩んでみます。

※画像は説明用に適当にトリミング・再配置しています。キャプチャー画面をそのまま掲載してありません。あしからず。

Unityアクションゲーム制作記 その3 移動&アタックコンボ

 ということで、キャラクターの移動の補足とアタックコンボの実装です。

youtu.be

 静止状態からの4連コンボと走り後>3連コンボの2つを入れてみました。どちらも見た目は一緒なのですが、いずれ走り後のコンボには最後のアタックに吹き飛ばしをつけたりして差別化をしていきます。

 ちなみにプレイヤーのアニメーションコントローラーの全体図がコレです。見ての通り、ジャンプ要素はバッサリカットしました。操作系はラジコンタイプで、コントローラーパッドの上下で前進・後退、左右で右・左回転です(いまのところは)。

f:id:hamazakifactory:20160616093546j:plain

 Locomotion部分のブレンドツリーは、ユニティちゃんのサンプルそのままです。

f:id:hamazakifactory:20160616093636j:plain

 そして歩行部分の条件はこの通り。※画面は適当に加工してあります。

f:id:hamazakifactory:20160616095129p:plain

  武器を構えた待機モーション(Idol_C)と、武器を下ろした待機モーション(Idol_B)の切り替えに条件はついてませんが、これは単純にIdol_Cを指定時間再生したら自動的にIdol_Bへ移動するようにしたためです。厳密に●秒経ったから待機モーションを切り替える必要もないなら、スクリプトでわざわざカウントする必要もないですしね。

f:id:hamazakifactory:20160616095515p:plain

 コンボ部分はこんな感じ。 攻撃ボタンを制御しているスクリプトからAttackFパラメータがtrueになったらIdol_B&Idol_Cからは、一段目の攻撃へ。移動中(Locomotion)なら移動速度(Speedパラメータ)によって、連続攻撃の発生先を変えます。その後は、アニメーターのBehaviourスクリプトを使い、そこで攻撃ボタンが押されているかどうかを判定して、押されていたらAttackFをtrueにして、二段目、三段目〜と進めていきます。この判定部分をタメや連打に変えることで、バリエーションを増やせそう。

f:id:hamazakifactory:20160616113210p:plain

  ちなみに今回のゲーム制作にあたって参考にさせていただいているのが、かめくめちゃんのゲーム制作ブログ、「Unityを使った3Dゲームの作り方(javascript)」

http://gametukurikata.comです。アクションゲームに必要なネタを、基本操作から丁寧に手順を追って説明してくれているので、とてもわかりやすいです。

 今回も大いに参考にさせていただきました。ありがたやぁ。

Unityのアクションゲームで連続攻撃を実現する方法 | Unityを使った3Dゲームの作り方(javascript)

 次は、敵キャラクターと判定もろもろ。ようやくゲームっぽくなるかな。がんばろ。

Unityアクションゲーム制作記 その2 キャラと背景アセットの確認

 先日購入したアセットを使い、ぼちぼち制作を始めてるのですが、導入アセットでちょこっとだけ気になる点があったのでメモしていきます。ちなみに使用したバージョンは、Unity5.3.5f1 Personalです。

 まずはメインキャラクターの彼女。

Faye

https://www.assetstore.unity3d.com/jp/#!/content/52663

 mecanimを使ったサンプルシーンってことで、どんなのかなーと見てみるとユニティちゃんのサンプルそのままが収録されてました。動作確認と一緒にパラメータをいじったり、アニメーションコントローラーはこれをベースにすればいいかとか、使えそうならコントロール系も流用しようかなーとコードを書き換えていました。ただ、キャラ本体のprefabを見てみるとFrontPos以降に謎のオブジェクトかぶりが……(視点制御用の空オブジェクトですね)。

f:id:hamazakifactory:20160614133704j:plain

 本家のユニティちゃんのサンプルでは重複してない&カットしても動作には問題なさそうなので、なんだろーなーと思いつつ削除しちゃいました。インポート時に複製された? そんなことないか。ま、イチからコントロール系のプログラムを作ったり、キャラクターのデータを利用するだけであれば、全く問題ないでしょう。きっと。

  欲をいえば、鎌の向きがイマイチな攻撃のアニメーションを調整したいところですが、そこをやり始めると沼にはまりそうなので、今はあるものを組み合わせることから始めていきます。追加のアニメーションとか修正は、余裕ができたら挑戦ってことで。

 お次は背景アセット。

Tiny Dungeons

https://www.assetstore.unity3d.com/jp/#!/content/48170

 インポート後に出たエラーは、標準アセットのEffects&CrossPlatformInputをインポートすることで解消。

f:id:hamazakifactory:20160614150047j:plain

 ちなみにエディタ上で実行したサンプルシーンで見るモバイルとPCでの見た目の比較はこちら(アセットストアにはなかったかな)。

f:id:hamazakifactory:20160614150711j:plain

f:id:hamazakifactory:20160614150725j:plain

 さすがに直接比較してしまうと見劣りしますが、そんなに複雑な地形を作る予定もないしモデル自体のクオリティは納得。こちらも余裕があったらライティングだけでも調整してみよう。うん。

 さて、モデル自体はいいのですが、ちょっと注意しておきたいのがパーツの当たり判定用に用意されているメッシュの壁の高さが低いこと。

f:id:hamazakifactory:20160614171605j:plain

f:id:hamazakifactory:20160614160706j:plain

 写真のように 壁手前にある障害物があって、そのコライダーに乗ってしまうと、するりと壁を抜けて奈落の底へ……。ジャンプなど派手なアクションをするならともかく、移動するだけで落ちてしまうので要注意です。障害物を消去すればジャンプしない限り落ちませんが、判定用のメッシュをいじるか、壁には別途BoxColliderを追加するかしないとですね。この辺は、用途に応じてカスタマイズしろってことで忘れないようにしておきます。

 最後に武器の軌跡エフェクトを追加。

X-WeaponTrail

https://www.assetstore.unity3d.com/jp/#!/content/20972 

f:id:hamazakifactory:20160614173557j:plain

 鎌(scythe)オブジェクトの下に、X-WeaponTrailのprefabをアタッチ。StartPoint(赤丸)とEndPoint(青丸)を移動させれば、武器の軌跡が表示されるお手軽さ。最初、鎌の刃の部分につけてみたのですが、あまりきれいな軌跡が描けなかったため、武器の柄の部分にアタッチしてみました。武器の形状のせいもあるのですが、微妙にずれるというか、綺麗に出ない…要調整ですな。歩いている時にも軌跡が出ちゃうのはご愛嬌。そのうち直すと思います。 

youtu.be

 ということで、フィールドを走り回れるようになりました。次は、攻撃コンボの実装かなー。ちなみにキャラに入っていた攻撃アニメーションは5個のみ。うまく組み合わせて、コンボバリエーションを増やしたりできるかな……。がんばってみよう。うん。