がんばれーるのゲーム本体について

がんばれーるのゲーム本体についてです。

実はがんばれーるの元になるゲームは10月に既に作っていました。
これがいわゆるプロトタイプになります。

このゲームは

  • DustShootersの主人公の制御方法の見直し(CharacterController+Rigidbody的なものにしたい)
  • NavMeshの応用研究(DustShootersのボスの移動がNavMeshなので)

を主目的とし、さらに個人的に不定期で実施している

  • 瞬発力を鍛えるために24時間で1本ゲームを作る

という「一人ハッカソン」的なもので誕生しました。
このゲームにキャラカスタマイズ機能を追加したのが「がんばれーる1st」になります。

ただ、ゲームロジック部分の思想が異なっていて、プロトタイプはシューティングゲーム的な自機と敵の組み合わせに対し、がんばれーるは自機も敵も「タンク+キャラ」という部分を共通化し、プレイヤーが操作する自機に相当するタンクにはユーザー操作を許可するコンポーネントを追加することでキー操作を行っています。

そのため、がんばれーるの内部ロジック的にはCPUs vs CPUsのような自動バトルロイヤルが可能だったりします。

一応プロトタイプの流れでシューティングゲームとして作りましたが、もしかしたら次は(がんばれーる2nd?)シミュレーションゲームになる可能性もあったりなかったり…

次回は使ったAssetについてです。

描画パフォーマンスについて

ゲーム本体についての前に、がんばれーるの動作が遅いとの意見を頂いたので、手持ちのPCで特にパフォーマンスの出にくいノートPCでFPSを計測してみました。

解像度は1280×720(GT330のみ1280×768)、No Effect はPostEffect処理(Antialiasing、Ambient Occlusuin、Bloom)を無効にした場合です。
※頒布中のがんばれーるではPostEffectを無効にすることはできません

Good Beautiful Fantastic
i7-640M
GeForce GT330M
D11 15 11 9
D9 16 13 11
D11 No Effect 27 19 14
D9 30 25 17
i7-4650U
Intel HD Graphics 5000
D11 21 19 13
D9 28 23 17
D11 No Effect 37 27 19
D9 40 30 23
i7-6650U
Intel Iris Graphics 540
D11 34 31 29
D9 39 35 29
D11 No Effect 60 43 37
D9 60 50 36

若干ですが、DirectX9モードで動かした方がFPSは出るようです。

また、やはりPostEffectの無効化はやはり影響が大きいです。
もちろん見た目もこれぐらい変わりますが…

ちなみにPostEffectはImageEffectではなくこっちを使っています

まぁ結論としては当たり前ですが描画クオリティの設定機能は必要ってことですね。

後は動作スペックの下限をどのあたりに設定するかも課題かもしれません。
一覧には入ってませんが、Intel HD Graphics(i7-640M)ではDirectX11で起動せず、DirectX9でGood品質の時 4fps(No Effect で7fps)でした。さすがにこの世代でプレイするのは非常に厳しいです。

【補足】
FPSを計測したのはタイトル画面です。
環境によりますが、ゲーム中(見下ろし画面)のFPSはタイトル画面の 1.5 倍程度出ます。

キャラクタの描画について

がんばれーるのキャラクタの描画についてです。

がんばれーるのキャラやタンクの描画にはToony Colors Proを使っています。

Toony Colors Pro+Mobile(Asset Store)

シェーダーの構成としてはStandard PBS(物理シェーダー)+アウトライン+ランプです。

特に難しいことはやっていませんが、当初カスタマイズで色変更を考慮していなかったので、後から色変更(そのために複数テクスチャ化)に対応するため1メッシュ複数マテリアルというパフォーマンスの悪い実装になっています。もっともPCならさほど問題でもないでしょう。

例えば髪のレンダラーはこんな感じに複数マテリアルになっています。
chara_bobcut_colが髪、chara_bubcut_maskがハイライトになり、chara_bobcut_colの Albedoを変更することで色変更に対応してます。

ただ、やはりパフォーマンスや取り回しを考慮するならシェーダーを自作するべきでした。
例えばStandard PBSでテクスチャを3枚重ねるだけなら

#pragma surface surf Standard fullforwardshadows

void surf (Input IN, inout SurfaceOutputStandard o)
{
    fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;

    fixed4 tex2nd = tex2D(_Tex2nd, IN.uv_MainTex) * _Color2nd;
    c.rgb = lerp(c.rgb, tex2nd.rgb, tex2nd.a);

    fixed4 tex3rd = tex2D(_Tex3rd, IN.uv_MainTex) * _Color3rd;
    c.rgb = lerp(c.rgb, tex3rd.rgb, tex3rd.a);

    o.Metallic = _Metallic;
    o.Smoothness = _Glossiness;
    o.Albedo = c.rgb;
    o.Alpha = c.a;
}

だけで済みますし、アウトラインを入れるならUsePass “Toon/Basic Outline/OUTLINE”でUnity標準のアウトラインシェーダーを呼べばいいでしょう。
ランプテクスチャを用いた階調表現はUnity標準のToonLit.shaderを参考にすればいいと思いますが、Standard PBSと合成したいとかなると自前で実装する必要があると思います。もしShaderForgeを使うなら

Unity道場 14 Shader Forge 102 ~ShaderForgeをつかって学ぶシェーダー入門~ カスタムライティング/トゥーンシェーダー編

の30ページからランプシェーダーについての説明があるので、これを参考にするのがいいと思います。

なお、今回の反省をから後日シェーダーに関しては自作してみました(途中)。
普段なら直接シェーダーを書くところですが、せっかくなのでShaderForgeで作ってみたり。
※ShaderForgeを使うにあたり、上記Unity道場の内容は非常に参考になりました!

左がToony Colors Pro、右が自作シェーダーになります。
ランプの実装がまだ途中なのでいまいちですが、全ての処理が1マテリアルで完結しているので、マテリアル情報が MaterialPropertyBlock で変更出来るようになります。
(MaterialPropertyBlockはレンダラーに対しての設定のため、マテリアルが複数ある場合の設定のしかたがわからなかった…)

ちなみにこれらで得られたノウハウはもれなくDustShootersに反映されています。

次回はゲーム本体についてです。

がんばれーる1st反省会

がんばれーる1st反省会(その1?)

前作のスウィンぐるんは3週間、それもかなりのオーバーワークで作ったので、今回は何を作るにしてもとりあえずゆるゆると6週間で開発すると計画したものの、結果的に5週間のオーバーワークという前回より状況は悪化しましたw

大雑把な内訳は

  • キャラ+タンクのカスタマイズ機能に3週間
  • ゲーム本体に2週間

でしょうか。

特にキャラカスタマイズに半分以上の時間を使ってしまったのは大失敗でした。
実装方法をあれこれ試していたのもありますが、一番の問題はエディタ拡張を作るのに時間をかけてしまったことです。なにせゲーム自体の進捗にはほとんど寄与しないので…

どうせゲーム内でカスタマイズするので、最初からランタイム動作のカスタマイズエディタを作ってしまえばよかったんですよねぇ。

ちなみにUnityエディタ上で動作するカスタマイズエディタはこんな風です。

キャラクタのカスタマイズ

タンクのカスタマイズ

それでも今までエディタ拡張を積極的に使ってこなかったこともあり、今回のカスタマイズを作って色々と得るものはありました。今更でしょうが Inspector が見やすくなるのが素晴らしいですw

次回はキャラクタの描画についてです

車体と砲塔の追加説明

がんばれーる1stに収録されている車体と砲塔の追加説明になります。

車体は「履帯」「多脚」、砲塔は「戦車砲」「連装砲」「ガトリング」が収録され、ゲームを進めていくと選択できるようになります。

最初から使用できるのはこの戦車砲と履帯の組み合わせです。

戦車砲が他の砲塔のパラメータの基準になっています。よって後述する砲塔は戦車砲に比べて速い遅い等の表現になります。

ただ、他の砲塔にはない戦車砲固有の特徴として

  • 命中時の吹っ飛びが大きい

というのがあります。
命中すれば敵の向いている方向が変わりやすいので攻撃をそらすきっかけになるかもしれません。もちろん敵の戦車砲が当たるとこっちの向きも変わってしまうわけですが…

なお戦車砲は連射していてもステージ開始序盤ならエネルギー回復量>エネルギー消費量になりエネルギー量を気にせず撃ちまくれます。

履帯は特に特徴がないのが特徴です。
履帯の移動速度等を基準に他の車体のパラメータを決めています。


多脚

今回、履帯以外に唯一選択できるのが多脚になります。
多脚の特徴は

  • 移動速度がちょっと遅い
  • 旋回速度がかなり速い
  • エネルギー上限がちょっと高い

になります。


連装砲
連装砲の特徴は

  • 1発あたりのダメージが低い
  • 同時に2発発射する
  • エネルギー消費量はちょっと高い(2発分なので)
  • 弾速・連射速度は速い

です。

1発あたりのダメージは低いものの弾速も連射速度も速く、さらに同時に2発出るため撃ち合いにはかなり強いです。


ガトリング

ガトリングの特徴は

  • 1発あたりのダメージはちょっと低い
  • エネルギー消費量は高い
  • 弾速・連射速度はかなり速い

です。

1発あたりのダメージは戦車砲にやや劣るものの、弾速も連射速度もかなり速いため攻撃力としては最高の部類にはいります。
ただ、その分エネルギー消費量も高くなるので無駄撃ちするとあっという間にエネルギーがなくなってしまいます。

 

C91お疲れ様でした

C91お疲れ様でした。

新作「がんばれーる 1st」以外にも「スウィンぐるん」や「PanzerStrike」も置かせて頂きました。

個人的にはUnibook(C91セット・電子版)が買えたので満足です。
(読みやすさでは紙の方がいいんですが、出先でも読める電子版の方が便利なのです)
vol.1 から買ってますが、カテゴリ別になったのはありがたい!

スウィンぐるんの主人公を方向パッドで操作する

スウィンぐるんの主人公(ルン子withクルクルマシン)の操作をゲームパッドのスティックではなく方向パッド(POV)で行いたい場合の方法です。

多くのゲームパッドでスティックとPOVのY軸の入力値は逆になっているため、上下の操作が入れ替わってしまいます。

以下、スウィンぐるんで方向パッドを使う場合のY軸上下反転のやり方になります。

※Xbox360コントローラ限定の内容になりますが、一般的なゲームパッドでも概ね同じ方法が使えると思います

1. スウィンぐるんが実行中なら終了してください。

2. スウィンぐるん実行ファイル(swingrun.exe)と同じフォルダ内に以下のファイルを作ります。

ファイル名:config.csv
文字コード:UTF-8(BOM付き)
改行コード:CR+LF

20161001_conifg%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%81%ae%e8%bf%bd%e5%8a%a0

3. 2.で作成したconfig.csvに

GamePadVInvert,Int,1

と記述して保存してください。

※ここにconfig.csvを置いておくので、このファイルをダウンロードしてswingrun.exeと同じフォルダに入れてもらっても構いません

4. swingrun.exeを実行し、起動時のダイアログの Input タブの Horizontal と Vertical を方向パッドの各軸に設定してください。

20161001_input%e3%82%bf%e3%83%96%e3%81%ae%e8%a8%ad%e5%ae%9a%e7%ae%87%e6%89%80

これでゲームを開始すれば方向パッドで操作できるようになります。
フリーモードのステージ選択でカーソルが方向パッドの入力向きと一致すれば正しく動作しています。

なおスティック操作に戻す場合はconfig.csvファイルを消すか

GamePadVInvert,Int,0

と記述を修正してください。

またconfig.csvに

ShowFPS,Int,1

と記述すると画面左下にFPSが表示されるようになります。

161001_fps%e8%a1%a8%e7%a4%ba

スウィンぐるん開発裏話(6)

ゲーム中の残り時間が少なくなると、ヒントとしてまだ見つかってない宝石も「キラッ」と光るようになります。
(わかりにくいですが、右上のミニマップでも光っています)20160914_%e5%85%89%e3%82%8b%e5%ae%9d%e7%9f%b3

仕組みはシンプルで、宝石を光らせるだけの専用ライトを作り、常にシーン上を高速回転させています。
20160914_%e5%ae%9d%e7%9f%b3%e3%83%a9%e3%82%a4%e3%83%88

ライトといえば平行光源x3+アンビエントな世代(?)なので、簡単にライトが増やせシャドウまで面倒見てくれるのは非常に助かりますね。ただ、その分絵作りが難しいというかセンスが問われるというか…

もちろんライトを置けばおくほどシェーダーのパスが増えて描画負荷は上がります。
この辺りの詳細は

「いけにえと雪のセツナ」グラフィック解説(第3回・シェーダ編)

や Unity公式ドキュメントの
Forward Rendering パスの詳細

の説明がわかりやすいと思います。

ただUnityを5.3から5.4にアップデートしたら光らなくなったような…
なにかシェーダーの仕様変わったのかな?
(時間が確保出来たら調べるつもりです)

(続く?)