2020/11/09
というわけで、先日公開した「アザラシを守るゲーム」のバージョンアップを行いました。
タイトル画面のバージョンが「1.0.1」の場合、本記事の修正が適用されています。もしバージョンが1.0.0のままだったり、エラーのアラートが出てしまった場合はスーパーリロード(Ctrl+F5)やブラウザのキャッシュクリアをお試しください。
プレイはこちらから
https://gomafrontier.com/DefenceOfGoma/index.html
以下、修正点や変更点をご紹介します。
目次
修正・変更点
音量表示
ミキサーのfloat値をそのまま出していたので、「-80~20」という残念な表示になっておりました。しかも初期値は60%にしてあるのですが、表記では-20となっており、初見では「音でないの?」と疑問を抱くような感じに。
ということで、「0~100」のパーセントで表示するようにしました。
たったこれだけのことでゲームから受ける印象って結構変わりますね。タイトル画面と言えばゲームの導入部分なわけなので、なおさらです。
リスの帽子のシェーダ
リスの帽子を内側から見た際、後ろがスケて見えてしまいます。
ゲーム画面はトップビューなのでほぼ気になりませんが、タイトル画面はかなり残念な見た目に。
これを解決するため、公式からビルドインシェーダをダウンロードし、standard.shader
をカスタマイズします。
https://unity3d.com/jp/get-unity/download/archive
まず冒頭のシェーダ名を修正し、カスタマイズしたものであることを分かりやすくしておきます。
Shader "Custom/Standard_DoubleSided"
次に本題の両面処理になるように修正します。
SubShader冒頭、「LOD 300」の下に「Cull Off」を追加します。
SubShader { Tags { "RenderType"="Opaque" "PerformanceChecks"="False" } LOD 300 Cull Off
保存してUnityに戻った後、シェーダの選択肢に「Custom/Standard_DoubleSided」が追加されているので、それを選択します。
音量表示の件と合わせてタイトル画面がマシになってきました。
キャラクターの被ダメージ時の表情
現在は被ダメージモーション時もキャラクターの表情は変わりません。
ロボットならともかく、動物モチーフなら被ダメージ時はそれっぽい表情をしたいので、ダメージ関数呼び出し時にテクスチャを切り替えます。
アザラシも対応したかったのですが、目を半球のオブジェクトとしてモデリングしてしまったので出来ませんでした。まあリスもトップビューではほとんど表情が分からないので、「念のため」というレベルではあります。
遠距離攻撃の拡散
左クリックで遠距離攻撃の星弾を連射しますが、全て真っ直ぐピシッと飛んでいくのに若干の違和感があります。
なのでちょっとだけブレるようにしてみました。
内部的には発射時の角度設定に+-5ほどの乱数を加算しています。あまりブレすぎると当たりにくくなってしまうのでこの程度にしておきます。
敵撃破時の演出
ただ吹き飛ぶだけでは地味なので、回転しながら派手に吹っ飛ぶようにしました。敵はRigidbody
で動かしているので、AddTorque()
を使って回転させます。回転のベクトルはかなり適当です。
以下は敵キャラクター撃破時に呼び出される関数内の一部分です。(rb
はRigidboy
型の変数です)
// 吹き飛ばし処理 var forceVect = (-transform.forward + Vector3.up) * 15; rb.AddForce(forceVect, ForceMode.Impulse); rb.constraints = RigidbodyConstraints.None; rb.AddTorque(new Vector3(100f, 100f, 100f), ForceMode.Impulse);
ついでに吹き飛ぶスピードも早めに調整し、撃破したことが一発で分かるくらい飛ばすようにしました。思ったより回転が掛かっていないのが気になりますが、見た目的には十分かと思います。
修正しようとしたが出来なかった点
Chromeで実行した際の移動入力の暴走
公開時に周りからも指摘されたことですが、Chromeから実行中に移動入力をすると、そのまま移動が解除されずに暴走してしまうことがあります。
どうも端末によって再現したりしなかったりで、私の家に2台あるPCのうち、片方のみはゲーム画面で「A」または「S」入力時に暴走してしまうようです。
https://forum.unity.com/threads/disable-enable-keyboard-in-runtime-webgl.286557/
↑のフォーラムでは「インラインフレーム使うと発生しない」的なことが書かれていますが、Chromeだけのためにiframeを使うのもちょっと…という感じ。
あれこれ試行錯誤した結果、「一部の拡張機能が影響しているのではないか?」という結論に至りました。私の場合は「Evernote Web Clipper」をOFFにしたところ、移動入力をしても問題なく動作するようになりました。
Chrome拡張は作り方や権限次第でいろいろできてしまうので怪しいところはありますが、すべての拡張機能を検証するのは無謀なので、現象が発生した人の環境を聞いて調査していくしかなさそうです…。
パワーアップ状態の残り時間表現
これもすごく入れたかったのですが、パワーアップ状態のリセットをDOVirtual.DelayedCall()
でやっているため、現仕様では残り時間の目安を取得できません。
プレイヤーが時限強化する場合は有効期限を示すのが一般的なので、これは単なる設計ミスと言えます。次のバージョンアップまでには表示できるようリファクタしたいところです。