キャッスルバーニア反省会(4)

登場キャラクタ紹介です。

キャラクタのシェーダーは基本Unityちゃんシェーダーを使ってます。
(一部Standard Shaderを併用しているメッシュもあります)

※画像はUnityのScene Viewのキャプチャのため、ゲーム画面とは見え方が異なります

【ササリーヌ=NaNa=RB=アストロ】

このゲームの主人公。通称ササ姫、ササ子。
ササとかナナとかアストロとか気になるワードが…

実は夏コミのPOPに説明文が書いてあったりします。

ゲーム中では操作キャラ以外にゲームの説明も兼ねて自らVTuber的なことをやっています。残念ながらしゃべりませんが。

参考までに実装はVTuber用のカメラでRenderTextureに描いてからuGUIで描画です。
なお、ゲーム中にテンキーではない方の[1]~[8]を押すとVTuberササ姫のモーションが切り替わります。デバッグ機能が有効なままリリースしてもうた…

注目すべきは手に持っているモノです。一見ゲームパッドに見えますが、じつは…?

今回揺れモノはUnity-chan SpringBone を採用しました。
(ドラスティースピアの主人公ドラ子はDynamic Boneです)

【ホーリーバーニア】

ササ姫の移動手段であり攻撃手段でもあるスペシャルな兵装。
動力源等全てまだ考えてない不明で、今後明らかになる予定です。

【ゴースト】

今回のやられ役です。よく燃えます。
もっと大量に出してガンガン燃やしたかった…

【サッカーボール&ゴール】

ゲーム開始直後のフリータイム時に置いてあります。ボールはササ姫の体当たりで動かせます。ちゃんとゴール判定を入れてミニゲーム的な感じにしたかったんですが、時間切れで実装ならず。

【???】

悪魔城ドラキュラに出ていそうなアレですが、時間が足りず登場ならず。

ボスの巨大コウモリはドラスティースピアで登場したモデルなので省略。
小コウモリに分裂して移動する予定でしたが、時間が足りず(ry

 

以上、登場キャラクタの紹介でした。
今回も魅力的なキャラに助けられ、まだ未完成なゲームながらも何かしらの可能性を感じられるような内容になったと思っています。

なにせ、これが

これになるんですから!

 

 

キャッスルバーニア反省会(3)

キャッスルバーニアの一番特徴である「バーニアアクション」を支える技術についてです。

バーニアの出力はスティックの倒す量で小・中・大の3段階に切り替わります。

本当はスティックの倒した量でパーティクル自体のエミッション量を制御したかったんですが、ちょっと難しそうだったので3段階用意しました。

そしてパーティクル自体に当たり判定を付けることでバーニアの出力=パーティクル数=攻撃力としています。例えば出力が大のときはこんなコリジョンが発生しています。

ちなみに出力が大のときは中と小、出力が中のときは小のパーティクルが同時に出ています。

パーティクルのコリジョンを有効にするにはParticleSystemのCollisionを有効にし、さらにSend Collision Messageを有効にする必要があります。

これでOnParticleCollisionが入ってくるのでスクリプトで処理するだけです。
キャッスルバーニアではヒット数のみカウントして、実際のヒット処理はUpadteで行っています。イメージとしてはこんな感じです。

void OnParticleCollision(GameObject other)
{
    hitCount++;
}

void Update()
{
    if( hitCount != prevFrameHitCount)
    {
        prevFrameHitCount = hitCount;
        // ヒット処理
    }
}

全てのColliderに対して判定する必要がなければCollisionWithで当たり判定対象のレイヤーを設定できます。

とりあえずParticleSystemを正しく設定すればこのような防火シャッターみたいなのはすぐに作れます。シャッターになる方にもColliderを入れることをお忘れなく!

なおゲーム中ササ姫に炎が当たらないのは炎除けのSphere Colliderが入っているから炎は友達だからです、きっと。

 

OnParticleCollisionは結構前からあったと思いますが使ったのは今回が初めてです。もしOnParticleCollisionが期待動作しなかったらキャッスルバーニアは誕生しなかったかもしれません。

ただ、パーティクルの量を出すとそれなりに処理負荷も高くなりそうですし、パーティクルシステムの仕様に依存するので(動的にエミッション量を変えられないとか?)、今ならECSで独自実装するのも面白いかもしれません。

ちなみに最初は扇形で判定してました。バーニア出力に合わせて半径を変えれば出力に対して当たり判定を取ることもできますが、OnParticleCollisionを使えば見た目と当たり判定も一致しますし遮蔽処理も簡単です。

と、色々書きましたが、キャッスルバーニアはUnityの標準機能に支えられていますw

あ、バーニアでの移動については単にAddForceしているだけなので特に書くことはないかな…

Unity上でEDTrackerを使ったヘッドトラッキング

Unity上でEDTrackerを使ったヘッドトラッキングを実験したので、その備忘録。

EDTrackerとはArduino+ジャイロセンサーを使ったヘッドトラッキングデバイスです。完成品のProと自作向けのDIYの2種類があり、DIYは専用基板を買って作ることもユニバーサル基板上で完全に自作することもできます。詳細は公式サイトで確認してください。

EDTracker

今回はリファレンス機としてProを使いましたが、自作したものでも結果は同じだと思います(自作用のパーツは用意したんですが、まだ作ってないので…)

EDTrackerはopentrackを経由することで既存のさまざまなゲームで使えるような運用になっているようです。

今回はopentrackを経由せず直接EDTrackerの情報をUnity上で扱えるようにするのが目的です。

EDTrackerはWindowsからはジョイスティックとして認識され、トラッキング情報はジョイスティックの軸データとして取得できます。joy.cpl(昔はコントロールパネルから実行できたんですけどねぇ)で確認すると、X軸・Y軸に-1~1の範囲でデータが入ってくるので、このデータをヨー・ピッチとして使えば良さそうです。

【注意】EDTrackerUIでYaw ScalingとPitch Scalingを1.0にしておく必要があります

しかしここで問題が。Unity標準のInput.GetAxisRawでは期待した値が取得できませんでした。問題切り分けのためWin32APIのJoyGetPosExでEDTrackerのスティックデータを取得したところ期待していた-1~+1の範囲の値を取得出来ました。
おそらくUnity側の問題だと思うんですが、あまり突っ込んだ調査はせずJoyGetPosExをC#から呼べるようにしてUnityで使えるようにしました。
(Win32APIをC#で呼び出す方法は”C# DLLImport”等でググると出てきます )

ちなみにヨーのデータは正面を 0 として左方向にマイナス、右方向にプラスで、真後ろが-1もしくは+1になります。

なので

float axis = (((float)JoyInfoEx.dwXpos - 32767) / 32768);
Yaw = Mathf.Clamp(axis, -0.5f, 0.5f) * 180f;

とすれば、左を向けば -90f、右を向けば 90f がYawに格納されます。
あとはカメラのTransformを回転させればヘッドトラッキングが実現出来ます。

transform.rotation = Quaternion.Euler(
-Pitch * RotationSpeed,
Yaw * RotationSpeed,
0f * RotationSpeed);

まぁリアルに頭を90度横に向けてしまうと画面が見られないので、opentrackのマッピング機能と同等の機能を実装して調整出来るようにする必要があると思います。

とりあえず今はインスペクタである程度調整できるようにしています。
(上はヘッドセットの入力を左右30度の入力でカメラを左右90度回す設定)

これでとりあえずUnityでEDTrackerが使えるようになりました。
ヘッドトラッキングだけではVRのような没入感は得られませんが、頭の動きにカメラが追従するのでだけでも結構楽しめますし、なにより高価なHMDを使わないので簡単に利用出来るのもメリットだと思います(EDTrackerを完全自作するなら部品代は1500~2000円ぐらいです)

できればNx Head TrackerのようにBluetooth接続できるといいんですけどね。

がんばれーるで使用しているAssetについて

がんばれーるで使用しているAssetについてになります。
ホント、毎回Assetには助けられています。

過去に何度か紹介している普段から使っているAssetは

になります。
どのAssetも有名どころだと思うのであえて説明する必要はないかなと。

描画関係で使っているAssetはキャラクタとタンクの描画に Toony Colors Pro、背景の一部に UNOShader UNLIT w/TOON support を使っています。
両シェーダーともかなり高機能かつ便利なんですが、ワークフローや仕様上の問題でおそらく次は自作シェーダーになると思います。

爆発等のパーティクルは Sci-Fi EffectsWarFX、Skyboxは First Fantasy for Mobile のものを使っています。
Sci-Fi Effectsは爆発系以外にもレーザーや炎、ホログラフと色々なエフェクトが入っていたり、ターレットエディタで好きな砲台が作れたりとAsset単体でも結構楽しめます。
また非常に助かるのはエフェクトにあわせた効果音も入っているところですね。エフェクトにあった効果音探すのも結構時間かかるんです…

ステージ開始時のカメラ動きは Pegasus を使いました。DustShootersで使っている Camera Path Animator でもよかったんですが、たまには別のAssetを使ってみたかったので。次は無償になった Cine.Machine Base Rig も使ってみたい思っています。

version 1.01から追加したボイスは Voice Pack Vol.1vol.2 です。
やはりボイスがあるとないとでは全然違いますね。

以上、かなりざっくりですががんばれーるで使っているAssetの紹介でした。

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

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

実はがんばれーるの元になるゲームは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

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

UnityでXboxOneコントローラを使う…前に

UnityでXboxOneのコントローラを使おうと思ったら、Xbox360のコントローラとアサインが違っているのか…
とりあえず以下のような割当てだったのでメモとして書いておきます。

※2016/06/24 スティック押し込みのアサインと軸の増減方向を追加
※2018/07/08 RTとLTの情報を修正

http://support.xbox.com/ja-JP/xbox-one/accessories/xbox-one-wireless-controller の画像を使わせてもらってます
XboxOneController

1 左スティック(X) X axis (左: -1 右: +1)
1 左スティック(Y) Y axis (上: -1 下: +1)
1 左スティック押し込み joystick button 8
2 LB joystick button 4
2 LT 3rd axis (Off: 0 On: +1)
3 ビューボタン joystick button 6
4 USB充電端子
5 Xboxボタン
6 メニューボタン joystick button 7
7 RB joystick button 5
7 RT 3rd axis (Off: 0 On: -1)
8 方向パッド(X) 7th axis (左: -1 右: +1)
8 方向パッド(Y) 8th axis (上: +1 下: -1)
9 拡張端子
10 右スティック(X) 4th axis (左: -1 右: +1)
10 右スティック(Y) 5th axis (上: -1 下: +1)
10 右スティック押し込み joystick button 9
11 3.5mm端子
A Aボタン joystick button 0
B Bボタン joystick button 1
X Xボタン joystick button 2
Y Yボタン joystick button 3

あ、軸の反転は好き好きでー
スティックと方向パッドの上下の向きが違うので注意!

PanzerStrikeの照準について(2)

引き続き照準についてです。

戦車の砲身の延長上に敵(もしくは破壊可能なモノ)があると、緑色の円が消えて赤い円に変わり、横に目標までの距離が表示されます。
やっていることはシンプルにPhysics.Raycastです。160521_測距の仕組み

「赤い円の状態=砲身の延長上に敵がいる」となるので、この状態の時に射撃を行えば命中します。ただし砲弾は重力の影響を受けるので、目標までの距離次第では砲弾が目標に到達する前に地面に接触する可能性があります。

例えば400m先の敵を狙った場合の着弾位置はこんな感じです。160521_400mまでなら水平射撃でOK

かなり下側に着弾してますが、400mぐらいなら水平射撃で命中します。
(スピーカーアイコンの位置が着弾位置です)

では400mより先の目標に当てるにはどうすればいいかと言うと、砲身を上に向けて弾道射撃を行うことになります。
試したところ、2000m先の目標に当てるには発射角0.82度、8000m先の目標に当てるには発射角3.32度で弾道射撃を行う必要があります。ただ8000m先となると爆発の煙さえ見えませんが…160521_2000m着弾160521_8000m着弾

せっかくなので、砲弾にカメラを付けて8000m先の目標に着弾する動画を録ってみました。
8000m先はさすがにマップ外なので途中から地面や海面もなくなりSkyboxのみになります。
発射から約10秒後の着弾直前に一瞬だけ白い立方体が見えると思います。

照準についての説明は以上です。

実際のゲームでは地形の傾きや揺れが発生してなかなか照準が定まらないことがあったり、敵が移動している場合は予測射撃も必要になります。