【Game A Week】CHARRRRRRGE!【week2】

Game A Week

【Game A Week】CHARRRRRRGE!【week2】

Game A Week チャレンジのweek2では、CHARRRRRRGE!というゲームを作りました。

CHARRRRRRGE! | フリーゲーム投稿サイト unityroom

どういうゲームか

要塞に立てこもる敵を歩兵地上部隊と砲撃部隊で攻略するというゲームです。プレイヤーは砲撃を担当します。ゲーム目標は歩兵が敵の大将を捕らえること。砲撃でそれを援護します。敵は砲撃を邪魔してきます。砲撃手がやられたらゲームオーバーです。

charrrrrrge! ゲームプレイ画面

メイン画面

charrrrrrge! ドクトリン画面

ドクトリン画面 経験値を様々なアップグレードに使える

ちょっと物騒ですが、歩兵の死体が積み重なることによって、敵陣地奥地への道が切り開かれて、ターゲット捕捉へつながるというゲームメカニクスです。死体だけではなく、壊れた要塞の一部も同じく積み重なっていく設計でしたが、今のところあまり実現できていません。

結論から言ってしまえば、動作が重くてある程度の環境以上じゃないとカクカクしてしまうので、あまりゲームになりません。私の環境ではそれほど問題はないのですが、WebGLでビルドしてみたら、重くて話になりませんでした。UnityRoomに投稿しようと考えていたのですが、このままだと無理そうです。 追記:一応できる範囲で修正はしたので、unityroomにアップロードしました。

計画自体は割と順調に進行しました。途中で小手入れがありましたが、許容範囲だと思います。重さの原因のプロファイリングからの最適化手順も含めて、学ぶことは多かったので良かったとします。

項目説明

  • Idea: アイデア。コンセプト。テーマ。元ネタ
  • What went right: やってみて良かったこと。うまくいったところ。成功したところ。次回に活かせそうなこと
  • What went wrong: ダメだったところ。うまく機能しなかったところ。問題点。改善すべき点
  • What I learned: 学んだこと。効果的なゲームデザインの方法やツールの使い方、獲得したテクニックなど

Idea

  • 3Dタワーディフェンス
    • 3Dでしかできないことは?
    • プレイヤーの視点は?
    • 誤爆があり得る?
  • というかタワーオフェンス
    • 砲撃部隊と突入部隊
    • 崖から侵入
      • いつも行く山道から着想
      • 義経
        • 逆落とし?
  • 高台から包囲
    • 砲撃
    • 設置
    • 間接射撃
  • 兵士の死体が積み重なる
    • 203高地
    • 球体が死亡すると四角になって分散する
  • マテリアル/貨幣入手
    • 敵を倒す
    • 建物を壊す
  • 建物
    • 兵舎
      • 地上部隊
      • パラシュート部隊
    • ドローン製造
    • 研究施設
  • ドクトリン
    • 指示系統(office)
      • ドローン派遣
      • XP上昇
      • 兵舎増築
      • 指示力上昇
      • 建設力上昇
    • 科学(effector)
      • 変性アシッド
        • 建物への攻撃力アップ
      • 幻覚作用
        • 敵兵士混乱
      • 重力改変
        • 重力を半減
      • パラライザー
      • つるつる
    • プロパガンダ
      • 誇り高き奴隷
        • increase infantry spawn-rate
      • 戦争は平和
        • increase infantry speed
      • あなたは知らない、私は知っている
        • now infantry is immune to projectile
      • 国家の糧となれ
        • 忠義精神
        • 特攻
      • 栄誉の戦死
      • 無我の自由
      • Distopian Paradise
    • 砲撃
      • クールダウン短縮
      • 爆破力上昇
      • 16連射撃
      • 質量上昇
    • charrrrrrge
      • 将軍出撃
        • 最終手段
        • 使用には注意されたし

What went right

  • 砲撃による爽快感
    • 爆破混み
      • エフェクトも実装できた
    • 壊される側のオブジェクトの設計
      • 破片一つ一つをオブジェクトとしてあらかじめ作っておく
      • 壊されると破片になって吹っ飛ぶ
    • 発射音
      • 簡易的に実装
  • ドクトリン
    • 実装可能性について一番不安があったがそれなりにうまくいった
    • UIの設計
      • layout group系のcomponent
      • UIを作るのにちょっとなれてきた
        • デザインはあれだけど
    • scriptable objectでメソッドの多態性を実装
      • abstract classを定義
      • それを継承して、doctrineごとに実行するメソッドを書いたクラスを作る
      • doctrineのフィールドで、継承したスクリプトを受け取る
        • 委譲?転送?でメソッドを実行
  • object poolerの実装
    • particle systemの再利用
      • 実際に効果が得られているのかが不明
      • 長時間持続するエフェクトなどは、poolするメリットよりデメリットが上回るらしい
        • 計算され続ける?
    • bulletの再利用

What went wrong

  • 砲台の軸回転がおかしい
    • プレイには支障ないレベルだが、3D上でのquarternionメソッドを理解しきれていない
  • 敵としてinfantryと同等のguardを沸かせる案が浮上して実装してみたが、結局辞めた
    • ただでさえ多いオブジェクトが増えるだけ
    • それ専用のスクリプトを書かないゲーム性が増さない
      • 例えば、ボスを守るような動き
      • 近くにて気がいた時のみある行動をとるとか
      • でも、もうちょっと複雑な敵AIスクリプトは近々書いてみたい
  • バランス調整については色々おかしいがそれは目をつぶる

What I learned

  • transform.rotationとrigidbody.rotation
    • 計算されるタイミングが違う?
      • When getting (reading the values) it’s the same. The difference is that when you set the transform.position or rotation it will be applied at the end of the frame but for rigidbody.position or rotation it will be applied at the end of the next physics step.
    • artilleryとturretの関係
  • physics
    • material
  • transform.eulerangles vs transform.rotation
    • 特に違いが判らない
  • 子オブジェクトの衝突判定が検知される条件
    • 親オブジェクトにrigidbodyがついている
  • getcomponents
    • リストではなく配列で受け取る
  • Listの初期化
  • EventSystemがないとUIが機能しない
  • RuntimeInitializer
    • inspector上で登録したpropertyはnew Gameobjectの方だと消える
    • resources.Loadで対処
  • UI要素を取得するときはinspectorから入れた方がいいらしい?
    • 必要なモノ、依存関係がinspector上で明確になる
    • transform.Findは子要素のみ
      • 孫要素は拾えない
      • つまり、hierarchyを変えると崩れる
  • prefab化したものは、hierarchy上にあり続けない限り、inspector上で代入したinstanceとのつながりを失う
  • 拡張メソッド
    • すでにあるクラスにメソッドを追加する
    • 色々カスタマイズをするらしい
      • Debug.Logを上書きして、logしないようにするとか?
    • ライブラリ的に利用することが可能
  • 当たり判定
    • kinematic同士だとcollisionが起こらない
  • AudioSource.PlayClipAtPoint
    • もとのgameObjectから切り離された新しいオブジェクトを生成して音を鳴らす
  • audio sourceに2d/3dの設定がある
    • clip自体にもあるらしい
      • import settingsをいじる?
      • みつからない
    • PlayClipAtPointはaudiosourceコンポーネントを使うわけじゃないから、設定をどこですればいい?
    • AudioSource.PlayClipAtPointは、位置情報があるのだから当然3Dになる?
  • ドローンを再アクティベートする時に角度がずれる
    • 移動させなければ問題ない
    • 移動させるとずれる
    • 原因がわからない
      • 移動させると回転軸がずれる?
    • とりあえずsecactiveではなくinstantiateすることで妥協
  • ”あまり知られていない事実は、MonoBehaviour のすべてのコンポーネントにアクセスするもの、つまり、transform、renderer、audio などは、それらに対応する GetComponent(Transform) と同様です”
    • 軽量化したいなら、transformをその都度呼ぶのではなく、あらかじめ変数に入れておいた方がいい
  • Debug.Logは重い処理
    • Debug.unityLogger.logEnabled = false;
    • ビルド時に設定で消せる
  • プロファイリングでの最適化
    • rendering
      • primitive objectに
      • タワーの残骸をなくすか荒くする
    • animation
      • 同じく
    • physics
      • TimeのFixedTimeStepを増やして、物理計算の回数を減らす
    • others
    • GC
      • 文字列はstringbuilderクラスで扱う
    • canvas
      • 動く要素を含むものを別canvasにわける
  • Assetbundle
    • 別の場所にそれ用に最適化されたアセット群をアップロードしておいて実行時にダウンロードする?
    • アプリ自体は軽量化される
    • Assetのみの差し替えが可能になる
    • Resourcesとの比較

コメント

タイトルとURLをコピーしました