百鬼無双
1. プロジェクト概要
- ジャンル: 3Dアクション
- 制作期間: 制作中 (修士1年6月から)
- 体制・担当: ソロ制作
- 使用技術: Unity, C#, 3D Action
2. 作品概要
プレイヤーが思い通りにキャラクターを操作でき、「移動しているだけで楽しい」と感じられる最高の手触りを最重視して制作している3Dアクションゲームです。現在は未完成であり、将来的な機能追加や継続的なアップデートを前提として開発を進めています。
3. ゲームの面白さのための工夫
-
プレイヤーの直感に寄り添うジャンプ補正(コヨーテタイム)
足場から飛び出した直後でも一定時間ジャンプを受け付けることで、「今なら跳べるはず」というプレイヤーの感覚と実際の挙動を合致させています。さらに、地面付近でのジャンプ入力に対しては2段ジャンプを消費させず通常ジャンプとして扱うよう判定を甘くし、ストレスのない操作感を実現しました。
-
状況を読み取る自然なローリング判定
着地時の落下速度や入力状況など複数の条件を計算し、プレイヤーが「勢いよく着地したい」と感じる文脈でのみ、自然にローリングアクションが発生するように細かく調整しています。
-
意図を汲み取る壁走り(ウォールラン)のベクトル補正
壁に対してやや下向きに進入した場合、そのままでは物理演算上、下方向へ走ってしまいます。そこへプレイヤーの「壁を走りたい」という意図を優先して強制的に上方向へ移動ベクトルを補正する処理を入れ、直感的で快適なパルクール挙動を成立させました。
4. 技術的な取り組み
-
移動状態とアクション状態の独立管理
キャラクターの「移動ステート」と「アクションステート」を完全に独立して管理するアーキテクチャを構築しました。これにより、移動と様々なアクションをバグなく柔軟に組み合わせることが可能になっています。
-
保守性と拡張性を担保したクラス設計
継続的なアップデートを見据え、各機能の責務を明確に分離しました。新しい武器や敵、アクションを追加する際にも、既存のコアロジックを極力変更せずに機能を安全に拡張できる、再利用性の高い設計を行っています。
5. 直面した課題と解決へのプロセス
課題①:アップデートを見据えたシステムの拡張性の確保
- 直面した問題: 今後継続的に武器や敵キャラクター、アクションなどの要素を拡張していく計画の中で、初期の設計のままではコードが密結合になり、機能追加時に予期せぬバグを誘発する恐れがありました。
- 解決プロセス: 前述の通りステート管理を分離させるとともに、武器や敵の挙動をインターフェースで定義しました。ポリモーフィズムを活用することで、既存の処理に手を入れずとも新しい要素を追加できる拡張性の高いアーキテクチャへと設計を見直しました。
- 得られた知見: 設計段階で各機能の責務を明確に分離し、拡張性を担保しておくことで、後からの機能追加が劇的に安全かつスムーズになることを実務レベルで体得しました。
課題②:壁走り判定における直角コーナーでのバグ究明
- 直面した問題: プレイヤーが家の角など、90度になっている壁に向かって壁走りを開始・移行しようとすると、壁の判定が上手く行われず挙動が破綻するバグが発生しました。
- 解決プロセス: デバッガでのブレークポイントの活用に加え、判定用レイ(Raycast)を可視化するビジュアルデバッグを行うことで、角の境界線におけるレイの衝突条件の抜け漏れを特定し、ロジックを修正しました。
- 得られた知見: 3D空間の物理判定が絡むバグにおいては、単なる数値の追跡だけでなく、エディタ上での視覚的なデバッグ(Gizmosやレイの可視化)が原因究明に極めて有効であることを学びました。
課題③:Cinemachineを用いた壁走りカメラとフリールックの両立
- 直面した問題: 壁走り時に画面を傾けるためCinemachineの「Lock To Target」を使用しましたが、プレイヤーを直接ターゲットにするとWASDによる旋回(Yaw回転)にカメラが強制追従してしまい、自由な視点操作(フリールック)が完全に失われる問題が発生しました。
- 解決プロセス: プレイヤーのYaw回転から完全に独立し、「位置」と「壁の傾き(Upベクトル)」だけを同期する中間層クラス(
CameraTargetFollower)を作成し、VContainerで注入しました。プレイヤーの上方向の変化にのみ追従する仮想の正面方向を計算し、状態移行時にCinemachineの入力蓄積をリセットする処理を組み込むことで解決しました。 - 得られた知見: 複雑なカメラ制御においては、対象を直接追従させるのではなく、描画・演出用の中間ターゲット(プロキシ)を挟むことで要件を両立できるという、柔軟な設計アプローチを習得しました。