Unity1Week-転がる偉大な英国面-
1年間ほったらかしでしたねこのブログ。 MachineCladの制作系記事はEntyで書いてるとはいえひどいや。
さて、このたびhttps://unityroom.com/さんの企画、unity1weekにて下記ゲームを制作しました。
転がる偉大な英国面 | ゲーム投稿サイト unityroom - Unityのゲームをアップロードして公開しよう
unity1weekとは、「1週間でUnityゲーム作ってアップしよう」という企画です。
月曜日の0時にお題が発表され、日曜日の20時が締め切りです(遅刻OK
この一週間どのようにしてゲームを作ったのかを語っていきます。
・月曜日
お題が発表されました。今回は「転がる」がテーマです。
僕「転がる、かぁ。岩を転がしたりして敵を押しつぶしたりとかどうだろう(ゼルダ脳)」
・火曜日
僕「坂道の上から岩転がしてタワーディフェンス系とか(妄想中)」
・水曜日
僕「ねむい」
・木曜日
僕「そろそろ手を付けねばヤバイ」
・・・あ、これタワーディフェンス、ステージ作るのめんどくさい。中止中止。
じゃああれだ、転がるっていったらあれしかねえ
パンジャンドラムやろ
この偉大な英国面の象徴たる失敗兵器が転がって迫ってくる、それから逃げる。これでいこう。
・金曜日
僕「逃げる主人公のモーションと、パンジャンのみ手作り。あとは全部アセットストアのや基本機能のフリーを使う」
フリーアセットのKyleくん。ボーンは持っていてもアニメーションを一つも持っていない(他のアニメーションアセットから入れる前提なのか)ので、自分で走るモーションを作る。Blenderで。走るモーションもアセット探してもよかったけどもめんどくさかった。
こちらは完全に自作。パンジャンしてきた。テクスチャはSubstancePainter2で適当に。どうせ大きくは見えない。
・土曜日
14時ごろ
僕「今起きた」
作ったモデルをUnityへドーン!
パンジャンを回転させるのはUnityのAnimation機能で回した。アセットストアでParticle系を手に入れてロケットの噴射炎をつけて
#unity1week 進捗です pic.twitter.com/0RW1Ds7Maq
— Hiromi@マシンクラッド (@Redhucules) 2017年5月27日
こいつを、まずは前進させねばならない。ちょうどいい、こいつは輪っかだ。UnityにはなにやらWheelColliderというホイール的なものを制御する当たり判定機能があるらしい。それを仕込もう。
— Hiromi@マシンクラッド (@Redhucules) 2017年5月29日
あーお客様!お客様!困りますお客様!!
どうやらWheelColliderを使う場合はRigidBodyのRotationをFreezeさせておかなければいけないらしい。真下でしか当たり判定とってないのね。おぼえた。
そもそも失敗兵器たるパンジャンドラムを現実的な制御したら失敗にしかならんわ!
WheelColliderの機能で前進させ、主人公を狙う機能はMachineCladのエネミー制御から旋回追尾のところだけ持ってきて埋め込んだ。
僕「主人公の移動どうしようかな。WASDで四方向移動でいいかな」
が、いままで背後視点系のものしか作っていなかったので見下ろし系の移動制御がぱっと思いつかないというかめんどくさい。
僕「めんどくさい、クリックしたところへ移動形式にしてしまえ」
先月のunity1weekでうら干物さんが、画面上のクリック地点をとる記事を書いてたので丸パ 参考にさせていただきました。
主人公の移動はNavMeshを使用。クリックで得た地点を目標地点にぶちこんでいます。
あとはパンジャンに、主人公にぶつかったときに爆発する仕組みを入れて。
まあこれで、追ってくる敵と逃げる主人公ができたわけです。
イメージエフェクトをかけてブルームとか色味とかを調整。
21時の僕「ARMSおもしろい」
ゲーム性isどこ
・パンジャンは一定時間ごとに増やそう。徐々に難しくしていくのだ。
10秒ごとに1体ポップ。生成位置は・・・画面中央にEmptyを置いてそこから360°ランダムの一定距離に生成。
ポップするごとに内部的に「レベル」を1増加。レベルが上がるごとに10秒に1回のポップ間隔を狭めていく。最終的に1秒に1体。これでだんだんと、続々出てくるようになる。
・パンジャン自体にもランダム性を付与。生成時、加速性能と追尾性能をランダム増減させた。個体差というやつだ。さらに「ハイレベル」モードを追加。ハイレベルパンジャンはプレイヤーの現在位置ではなくプレイヤーの目標位置へと追尾してくる。目の前ばっかり指定して移動してたら食われます。
・パンジャン同士もぶつかるようにしよう。というか同士討ちするようにしよう。英国面は英国面をも飲み込む。
・・・あー!一度ぶつかった後小刻みにぶつかるからすぐにHPなくなって爆発しちゃうあーお客様!お客様!!
・パンジャンがパンジャンにぶつかったら相手を弾くようにしよう。
[Unity] オブジェクトを爆風で吹っ飛ばす | ftvlog
ここをパ 参考にさせていただきました。これでぶつかったら相手を弾くから連続でぶつかってすぐ爆発するのはなくなる。
ついでに弾いて動きの軌道が変わるから、パンジャンが増えるにつれて予測が難しくなって避けるのが難しくなる。
えらいひとはいいました、複数の問題を一度に解決するのがアイデアだと。
27時の僕「ARMSおもろい」
・日曜日
謹製のランキング機能を仕込んで。結果のつぶやきも先月のやつから入れて。
unityroomにアップ!
エゴサしやすいようにつぶやき内容にオリジナルのハッシュタグを仕込みました。
まとめ
・制作は金土日の3日間 実働15時間くらい。
・過去作のスクリプトの使い回しとかフリーアセットとかで素材制作をショートカット
・スコアアタック系にすることでステージ制作をショートカット
・パンジャン
UnityのNavMeshを使用した敵移動
Entyの支援者リワードで、「敵MAの構成権」をつけたので、敵MAを動作させるAIを作る必要が出てきました。出てきましたというか、もともとやるつもりだけど背水の陣を敷いたので取り組む理由が生まれたというか。
最低限、敵のAIに必要な要素として、「敵は移動しなければならない」があります。いや当然ですよね。
ではどのように移動させるのか、今回はUnityのNavMeshを使ってみました。
NavMeshとは、上図のように設定されたAIが移動できるエリアのことです。
NavMeshで移動可能エリアに設定するオブジェクトはNavigationStaticである必要があります。インスペクターの右上あたりからチェックを入れておきましょう。
WindowからNavigationタブを表示し、NavMeshを焼くオブジェクトを選択してBakeすれば設定完了。
焼き終わりまでちょっと時間かかります。多分オブジェクトが大きさや複雑さが増すほど時間も。
さてこれで、AIが移動できるエリアが決定されました。
次にこのNavMeshを使って実際に動く機能をつけます。
動かしたいオブジェクトに、コンポーネント追加からNavMeshAgentを追加しましょう。
Agent Sizeは要するに当たり判定というか移動可能判定用のサイズ。
Steeringの項目が、速度、旋回性能、加速性能、目標地点までどれくらい近づいたら停止するか。到着時に勢いで行き過ぎないようにブレーキかけてストップさせるか。
あとは障害物の回避判定力とか。
あとはスクリプトからこのNavMeshAgentコンポーネントの
に目標地点のPositionを入れれば経路検索して移動してくれます。
自分の意志を離れて何かが動き出すのってすごい気持ちいい。
ただし目標地点がNavMeshから離れすぎてしまうと経路を見失ってしまう模様。最後に見失った地点まで進んで立ち止まります。
NavMeshAgentのついたオブジェクトはNavMesh上に居なければエラーを吐くので、nullチェックでセーフティーかけとかなければいけません。
それにあくまで設定したオブジェクトが目標地点まで移動してくれるだけなので、機体のアニメーションと連動させるとかにはいろいろと小細工をしました。
ひとまずまあ、こういうかたちでAIを作って行きます。
楽しい pic.twitter.com/ZXA5Cr5oWA
— Hiromi@Redhu (@Redhucules) 2016年5月13日