投稿記事

籠城ゲームの記事 (94)

竹林ソフト 2024/06/13 20:00

ねこ巫女籠城ゲーム開発(敵が建物を乗り越えるあたり)

観念して実装していきます。

やること

建物を敵が乗り越えるあたりを実装します。

このタイルではこのメッシュが足元にあるものとして移動してね、というあたり

建物を建築したときに、建物が提供する足場とメッシュで表現します。そして、このメッシュ情報が建物の建築時に配置されるようにします。

↓ 配置するあたりのデバッグ出力

今回はフィールドに多門櫓と木柵のみで、壁のメッシュ配置は未実装なのでこれでオッケーです。
次は、この情報を下に「このキャラの足元には(この建物の提供する)メッシュがあるから)そのメッシュの上にキャラを配置しよう」という処理を実装します。

で、いろいろ戸惑いながら時間をかけた結果、動作するようになりました。

↓ 多門櫓が提供する移動メッシュ(バスタブに似てる)

↓ 建物が提供するメッシュに沿って移動時の高さが変わっている様子

よいです。

まとめと今後の予定

敵を移動させるにあたり、建物が提供する移動メッシュを使うあたりを実装しました。

次回は石垣、そして壁の移動メッシュを使うあたりに着手します。このあたりも小難しいのですが少しずつでも進めていきます。がんばります。

竹林ソフト 2024/06/10 20:00

ねこ巫女籠城ゲーム開発(壁乗り越え用のメッシュ定義)

敵キャラが建物や壁を乗り越えるあたりを実装していきます。

やりたいこと

移動途中に建物や壁、石垣があったときにそれが提供する高さに沿って移動させます。
壁なら壁に沿ったパルスのように移動軌跡になるようにしたいです。

今回のテストでの建物配置は木柵と多門櫓にします。

↓ 建物の配置と移動してほしい移動軌跡

やったこと

まず、建物と敵を配置して移動させたところ「敵のパラメータがないっす!」というエラーになりました。

↓ エラーになって多門櫓の外壁で移動を停止した様子

エラーの原因だった敵キャラのパラメータ不足を修正したところ、多門櫓を素通りするようになりました。どうやら「移動先に建物があれば攻撃する」という処理があり、そのときにパラメータ参照しようとしてエラーになっていたようです。

そういえば、敵がいつ攻撃するかとか、建物や壁が攻撃されるとどうなるかについて改めて決めます。

敵が攻撃するタイミング

敵の種類は近接攻撃の「金棒」と遠距離攻撃の「弓」「火縄銃」です。決めるべきこととしては、

  • 近接攻撃の敵
    - 建物を攻撃するのかどうか。
    - 攻撃してきた少し離れたタレットに反撃するかどうか。

  • 遠距離攻撃の敵
    - 建物を攻撃するのかどうか。
    - 攻撃対象をどう選ぶか。

とかです。
案を書き出すと

  • 近接攻撃の敵
    - 移動経路上にある建物や壁は攻撃する。
    - 耐久の減った建物や壁は少し早く乗り越えられる。
    - 攻撃された場合、軍勢の数体には反撃させたいが、どうすればいいか未定。

  • 遠距離攻撃の敵
    - 攻撃したタレットとの射線判定を行い、判定先が攻撃可能なら攻撃する。
    - 耐久力の減った建物や壁は防弾比率が下がって配置されているタレットが壊れやすくなる。
    - 弓と火縄銃に対する防弾比率は個別に設定し、板塀は火縄銃に弱いとかを表現する。

くらいでしょうか。
書き出してみると「耐久が減った建物や壁は乗り越えやすくなる」が今回の実装に関係してそうです。

メッシュの種類と実装について

ここでのメッシュとは「建物や壁、石垣が提供する高さ」です。壁があったときに、壁を乗り越えるような移動軌跡を提供する機能です。

このメッシュの種類として、

  • 地面が提供するメッシュ
  • 石垣が提供するメッシュ
    • 石垣ブロックが提供するメッシュ
  • 建物が提供するメッシュ
  • 壁が提供するメッシュ

の5種類があります。しかも、建物はフィールどのタイルを専有するのに対し、壁はタイルの境界線にある仕様なので小難しいです。

このあたりの実装については、Dictionary<Vector3Int, MeshData> 型でメッシュデータを5種類それぞれで保持させて、5種類のメッシュの高さを順に評価する仕組みにしようと思います。「~という仕組みにしようと思います」と書きながら、小難しい実装なので割と心がつらいです。

心がつらいので次回にやります。着手を延期しているので、あまりよくはないです。

Unity のバージョンアップをした

今までは 2021.3 系でしたが、2022.3 系に更新しました。数十分かかっていくつかのエラーが出ましたが対処できました。よいです。

まとめと今後の予定

建物や壁、石垣を乗り越える移動まわりを実装しようとして、実装が小難しいのにたじろいだりしていました。

次回は、この続きに着手して少しでも実装を進めたいtです。あと、息抜きのためになんかこう適当な実装にも着手したいです。がんばります。

竹林ソフト 2024/06/03 20:00

ねこ巫女籠城ゲーム開発(敵の移動デモ)

敵の移動まわりに着手します。

やること

敵と移動先とを定義して、その途中に「斜面」「壁」「石垣」「建物」「橋」なんかを配置して、それらを適切に移動するかの確認をします。

とりあえずは、この動作確認のための準備を行います。

やったこと

とりあえず、今までに実装して機能を組み合わせて地面が描画されるようにします。

↓ しました。よいです。

次に、何も考えずに敵を配置します。

↓ しました。よいです。

そして、移動まわりのコードを書く前に今回は何を確認したいのかを列挙すると

  • 敵が平地を歩く様子
  • 敵が起伏のある地面を歩く様子
  • 敵が柵や壁を乗り越える様子
  • 敵が石垣を登る様子
  • 敵が橋の上を移動する様子

なので、敵は移動しつつ、地面のメッシュか建物や石垣や壁が提供するメッシュの上にいるものとして移動してくれればよさそうです。

とりあえず移動自体は必須なので動くようにしました。

↓ とりあえず移動している様子

移動速度が速いと思いましたが、今のところ速度変更は未実装です。後でまた実装します。

まだアニメーションしていませんが「平地を歩く」はここまでで動作したことにします。
次は、地面に起伏を作ってみて、その起伏に沿って移動するかを確認します。

↓ 地面に斜面を作って移動させた様子

このあたりまでは自キャラのために実装済みだったので動作して当然です。とはいえ実際に動作確認して適切に動作したのは良いです。

この敵にアニメーションを適用したり、建物や壁を乗り越えさせたり、移動速度を調整する機能を実装するのは次回にやります。

まとめと今後の予定

敵の移動まわりを実装するにあたり、動作確認のために専用のシーンを作ってとりあえず動作するようにしました。大変よいです。

次回は、この続きで壁や石垣を登るあたりに着手するか、Lua スクリプトでゲーム進捗を管理するあたりに着手します。がんばります。

竹林ソフト 2024/05/30 20:00

ねこ巫女籠城ゲーム開発(ゲーム管理の Lua スクリプトを導入する)

以前の記事 でゲーム進行を管理する Lua スクリプトをどう扱うかを検討したので、そのあたりを実装していきます。

やったこと

ゲーム開始の処理の確認

流れとしては

  • NewGame シーンでプレイヤーが地形を選んで「開始」する。
    • 地形データを new_game.dat という名前で保存しておく。
    • new_game.dat に Lua スクリプトを埋め込む。
  • Game シーンの読み込み
    • フィールドの生成と読み込み
    • Lua スクリプトの実行

という感じにします。地形や建物の読み込みが終わった後に、Lua スクリプトでの管理を始める予定です。
そして、とりあえずフリープレイ用の Lua スクリプトを作成しました。

↓ 仮作成した Lua スクリプト

よいです。

Lua スクリプトを実行する

次は、この Lua スクリプトを実際に実行して game:flag() とか game:setFlag() なんかを実行できるようにします。

このあたりは MoonSharp アセットでどうにかします。

そして、詳細は省略しますが最終的に Unity のゲームのメインループで Lua スクリプトのコルーチンがエラーなく動作するようにできました。

よいです。

まとめと今後の予定

ゲームのもろもろを管理するための Lua スクリプトを取り込みました。よいです。
住民や敵の追加も Lua スクリプトで管理したり、会話シーンを表示できるようにしたりとか、引き続き機能拡張していこうと思います。

次回は、この Lua スクリプトまわりの続きか、敵の移動に着手しようと思います。がんばります。

竹林ソフト 2024/05/23 20:00

ねこ巫女籠城ゲーム開発(敵の移動の仕様を考える)

攻めてくる敵の移動をそれっぽくするための仕様を書き出して検討します。

やりたいこと

概要から書き出してみると

  • 作った城郭の周囲に敵が配置されて、その敵がわらわらと押し寄せてくる。
  • 敵は門とかに集中しつつも、適当に斜面なり石垣を登ったりもしてほしい。

ということを実現したいです。
実装を前提にした仕様を考えていきます。

敵の経路探索について

基本的にはダイクストラ法を使って敵の攻撃対象である「拠点」として定義した建物に向かうようにします。
なんというか「大部分の敵は門に向かいつつも、ある程度の数の敵は門以外を攻めようとする」みたいなことを実現したいです。

具体的な経路探索については、

  • 拠点からダイクストラ法でタイルを評価していき「拠点に向かうにはこっちに移動する」という方向をタイルごとに8方向で定義する。
    • この評価はフレームごとに少しずつ行い、足元に移動方向が定義されたユニットは移動を開始する。
  • 全てのユニットの足元のタイルに移動方向の定義が終わったら、改めて最初からタイル評価を始める。
    • 門などでの渋滞を考慮して、渋滞が発生しているタイルの移動コストを高めにする。
    • 評価し直した結果は順次タイルに上書きしていく。

という処理を考えています。小難しいですね。
いつもそうなのですが、自分が実装する仕様を小難しいものにするのは大変つらいです。

敵のわらわら感は Boids っぽいもので実現する

Boids は群れっぽく移動させるアルゴリズムです。
とりあえず、1つのタイルに入れる敵の数を抑制する、とかの実装を考えていますがまた後で考えます。

1つのタイルといっても、石垣の斜面は1つのタイルに収めるつもりなのですが、石垣を登れる敵の数を抑制してもいいのかとか、思ったよりは簡単じゃないです。石垣だけ特別扱いすればいい気もしています。

建物や壁の敵の乗り越え方について

これは、建物や壁に対して移動用のメッシュを定義してあるので、それを利用するつもりです。壁はタイルの境界線上に配置されうるのですが、それは移動用メッシュをタイルごとになるように分割します。

↓ 過去に作った建物の移動用メッシュの例

その他

近接攻撃の敵の移動は、基本は拠点に向かいつつも近い距離にタレットがあったら移動して攻撃してもいいかな、とか考えています。

石垣の上にある隅櫓などについてですが、実物の櫓を見ると登って侵入できる気がしないのですが、ゲームなので櫓にとりついてある程度の移動時間が経過したら壁をすり抜けて建物内に移動できるようにします。
建物内に移動した敵が建物にどう影響するかはまた後で考えます。

まとめと今後の予定

今回は、敵の移動をどうするかを考えて書き出してみました。よいです。

次回は「敵がまっすぐ移動する」とかの基本動作に着手して、順に「壁があったら乗り越える」という機能を追加していきたいです。がんばります。

« 1 2 3 4 5 6 7

月別アーカイブ

限定特典から探す

記事を検索