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

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

がんばれーるのキャラやタンクの描画には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にアップデートしたら光らなくなったような…
なにかシェーダーの仕様変わったのかな?
(時間が確保出来たら調べるつもりです)

(続く?)

PanzerStrikeがインプレス「窓の杜」で紹介されました

PanzerStrikeがインプレス「窓の杜」で紹介されました。

【週末ゲーム】第648回:物理演算による真面目な3D戦車シューティング「PanzerStrike」
http://forest.watch.impress.co.jp/docs/serial/shumatsu/1019182.html

PanzerStrikeの一番最初の体験版を出したのが2013年8月(c84)なので、もう3年以上経っているんですね。そこから完全版を出すまでさらに時間かかってますが…

最初の体験版はスウィンぐるんと同じ3週間で作ったり、リアルタイムシャドウ欲しさにコミケ前ギリギリで Unity 4.2に変更したり、今思えばかなり無茶をしていたかもw
(当時使っていたIntel HD5000だとUnity EditorがDX11モードでないと動かないけど、DX11だとUnity Editor上でリアルタイムシャドウの確認ができないとかかったりとかトラブルも色々あったなぁ…)

ちなみに今なら紹介記事で指摘されている問題のほとんどを解決できると思うので、いずれ新しい戦車ゲーを作ってみたいとは思っています。…PanzerStrike bis.?

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

スウィンぐるんはWindows専用で作っているため、特に最適化や高速化のテクニックは使っていません。最近のPCは速くて助かります。

もちろんUnity的に一般的に推奨されない記述は出来るだけ避けています。
代表的なものとしては

  • Update内でGetComponent系を使用しない
  • Update内でFind系を使用しない
  • Update内で文字列操作を行わない
  • 使用しないMonoBehaviourのコールバック(UpdateやLateUpdate)は宣言しない
  • 空文字列チェックはstring.IsNullOrEmptyを使用する
  • IDやHashでアクセス出来るものはそれを使用する(マテリアルやAnimator)

でしょうか。

まぁこれらは高速化というよりは低速化を防ぐ意味合いの方が強く、高速化はもっと実装アルゴリズム寄りの話(代表的なところではオブジェクトプール等)だと思います。あと高速化はちゃんとプロファイルしてから検討することが大事です。

とりあえずUnityのランタイムで処理が遅いものとメモリ操作(暗黙に行われるものにも注意)だけ気をつければ、少なくともWindowsプラットフォームならそれほどパフォーマンスに影響はないと思います。

高速化に興味がある方はUnite 2016のこの資料を読んでみるといいと思います。

モバイル端末向けのUnityアプリケーションの最適化実践テクニック
ハードウェア性能を引き出して60fpsを実現するプログラミング・テクニック

(続く)