年齢確認

このサイトは成人向けゲームの開発記録です。

技術的な内容に加えて、作品のグラフィックやテーマについても言及することがあります。

18歳未満の方は閲覧をご遠慮ください。

ダッシュと攻撃

2026/7/4

現状のゲーム画面はこんな感じ。

ここまで記事を追って見てくれた方がいるなら一気に状況が飛んで見えるかもしれないが、実はこのサイトを作成した段階のゲーム進行度はここである。

追加で実装した機能は
 ・身体の回転が一瞬で反映されず、間の角度が補完される。
 ・カメラが移動に対して(一瞬遅れながら)自動追従する。
 ・移動をやめた時点でカメラの追従が中断する。
 ・マウスや右スティックでカメラが操作でき、カメラを操作したあと数秒は自動追従が停止する。
 ・ゲーム中マウスカーソルが消え、画面中央に固定される。
 ・カメラが壁を貫通しない。
 ・カメラがプレイヤーに埋まったらプレイヤーを非表示にする。
 ・武器を手に持つ。
 ・武器を切り替えられる。
 ・ダッシュができる。
 ・攻撃ができる。
 ・攻撃をダッシュキャンセルできる。
 ・動きに合わせて胸と髪が揺れる。
この辺りだろうか、こうしてみると色々増えているか。

以下、引っかかった点など

・カメラが壁を突き抜ける
カメラが壁を突き抜けたり、プレイヤー自身の当たり判定にぶつかることがあった。

カメラ

壁を突き抜けるのは聞いての通りだが、天井にぶつかったカメラが押し出されたあと自分の当たり判定にぶつかってさらに押し出された結果床しか見えないという症状もあった。
三人称視点は一人称視点よりもパースが緩い方が自然に見えるため、カメラの視野角はできるだけ狭くしたかった。
そのためこのゲームではカメラの視野角を28°まで狭めており、結果通路の幅が4.8mしかないにも関わらずカメラがキャラクターから4mも離れることになってしまったためこれらの問題は深刻だった。

結局、これらはカメラの接続の仕方や位置に問題があった。

カメラ接続

現在のカメラのノード構成は
「キャラクターの足元に追従するCameraRig(Node3D)」
 └─ 「カメラの回転の基準点になるCameraPitch(Node3D)」
  └─ 「物体にぶつかると自動で曲がってくれるSpringArm3D」
   └─ 「カメラ本体」
となっている。
図の左が正常に動いている今の配置で、右のSpringArm3Dが斜め向きに伸びている配置だと少し上に伸びている分が悪さをするようで壁に押し付けた際に壁を回り込んでしまうことがあった。
カメラがキャラクター自身にぶつかっていた際のそれぞれの位置は忘れてしまったが、それもカメラ周りのノードの位置を整えることで発生しなくなった。

・武器のスケール
武器を手に持たせる処理は手のひらに武器を接続する用の小さなボーンがあり、それに武器をくっつけている。
しかし、モデリングの記事に書いたようにこの主人公のモデルはスケールが適用されておらず、中のアーマーチュアが0.1倍に縮小された状態で使用されている。
キャラクターのアーマーチュア内のボーンに追従するように武器を接続すると、アーマーチュアのスケールが武器にも反映されてしまい武器が0.1倍のサイズになってしまう。
繰り返すようだが絶対にリギングする前にモデルのスケールは適用しよう。
あれこれ検討したもののこれはどうしようもないと結論付け、コードで武器のスケールを直接1.0に設定している。

・攻撃モーションのステータス
ダッシュや攻撃はアニメーションを再生したり移動したりするだけではなく、状態を保存するフラグを作っておき
 IDLE # 攻撃していない
 STARTUP # 攻撃後、判定発生前
 ACTIVE # 攻撃判定発生中
 RECOVERY # 攻撃判定終了
のように推移するようにしてある。

これによって「IDLE状態でないと攻撃はできない」「STARTUPの間は移動できない」「ACTIVE以降はダッシュで上書きできる」などの処理が簡単になり、今後ノックバックや無敵など新たな状態が増えたときも管理が楽になる予定。
行動ごとに各ステータスの長さを設定できるようになっているので、いろんな攻撃モーションを実装した後もこれらの秒数を登録するだけで移動不能時間やキャンセル可能タイミングなどが勝手に機能してくれるはず。

・揺れものの設定
胸や髪が動きに合わせて揺れるようにボーンを追加した。
これらのボーンにGodotのSpringBoneという機能を有効にすれば揺らすことができるとのことだったのだが、これはあまりうまくいかなかった。
揺れる際に衝突判定をおいて動きを抑制できる、つまり髪が額や肩ににめり込んだりしなくなる機能があるようなのだがこれが機能しなかった。
AIに聞いても的外れな回答しか返ってこず、自分で調べても回答は得られず、結局SpringBone周りはGodotの新機能でまだ機能自体にうまくいっていない部分があるのではないか、と結論付けるしかなかった。 前髪などはどんなにパラメーターを調整したり当たり判定をいじってもダッシュの際に盛大に額にめり込んでしまうため、ツインテールなど大きな部分のみをわずかに揺らすのみにとどめた。

この際にSpringBoneの揺れの基準をどこにするかが指定でき、基準を「世界」にすることでキャラクターが前に進むと髪が後ろになびいたりしてくれるわけだが、これだけだとモーションに違和感があった。

走っている最中に身体が左右に揺れることでツインテールや胸が左右に揺れるのがイメージ通りなのだが、キャラクターがまっすぐ走っているとき、髪や胸は世界を基準にするとほとんどまっすぐ進んでいるだけとなり左右揺れが起こらなかった。
そこでSpringBoneを2つ設定し、一方は「世界」を基準に、もう一方はキャラクターの足元にある「Rootボーン」を基準に揺れるようにした。
結果、世界基準の「移動による揺れ」とモーション基準の「体勢による揺れ」が少しずつ混ざった動きになり、どうにも使いづらかったSpringBoneだが一応それっぽい動きにはなった。

書いていて思ったがそういえばSpringBone周りはまだGeminiには聞いてみてなかった。
聞けば何か発見があるかもしれないが現状で一応動いているし、他にも作りたい機能が渋滞しているので後にしよう。