ゲームバランス調整のためのパラメータ設計

2025-12-22 ・ 読了目安 5分

ゲームバランス調整の課題

  • 様々なパラメータを調整する必要がある
    • 物理演算のパラメータ(摩擦、反発、減衰など)
    • ゲームプレイのパラメータ(投げる力、カメラの位置など)
    • オブジェクトのサイズや配置
  • パラメータが散在していると調整が困難
    • コードのあちこちにパラメータが散らばっていると、調整時に見つけにくい
    • 関連するパラメータをまとめて調整したい

GameParamsによる一元管理

  • すべてのパラメータを一つのオブジェクトに集約
    • GameParamsオブジェクトに、カテゴリごとにパラメータを整理
    • plate(お皿)、ball(ボール)、physics(物理)、camera(カメラ)など、機能ごとに分類
  • 型安全性の確保
    • TypeScriptのas constを使って、パラメータの変更を防ぐ
    • 定数として扱うことで、誤って変更されることを防ぐ
  • 参照の一元化
    • すべてのクラスが同じGameParamsを参照することで、一箇所の変更が全体に反映される

GameParamsの実装例

export const GameParams = {
  // 皿の設定
  plate: {
    radius: 0.67,        // 皿の半径
    height: 0.033,       // 皿の高さ
    thickness: 0.015,    // 皿の厚み
    rimThickness: 0.047, // 縁の当たり判定の厚み
    rimWallHeight: 0.117, // 縁の当たり判定の高さ
  },

  // ボールの設定
  ball: {
    radius: 0.15,                    // ボールの半径
    mass: 0.3,                      // 質量
    connectionDistance: 0.35,        // くっつく判定距離
    idealConnectionDistance: 0.3,    // 理想的なくっつき距離
    squashY: 1.0,                   // Y軸方向の潰し具合
    colliderSquashY: 0.75,          // 当たり判定のY軸方向の潰し具合
    colliderRadiusScale: 0.95,      // 当たり判定半径の倍率
  },

  // 物理設定
  physics: {
    friction: 0.25,                  // 摩擦係数(0.0〜1.0)
    restitution: 0.0,               // 反発係数(0.0〜1.0)
    linearDamping: 0.15,            // 並進の減衰
    angularDamping: 0.55,           // 回転の減衰
    contactEquationStiffness: 1e6,  // 接触の「硬さ」
    contactEquationRelaxation: 4,    // 接触の緩和
    frictionEquationStiffness: 1e6,  // 摩擦の「硬さ」
    frictionEquationRelaxation: 4,   // 摩擦の緩和
  },

  // カメラの設定
  camera: {
    distance: 3,                    // お皿からの距離
    height: 2,                      // カメラの高さ
    rotationSensitivity: 0.1,       // 回転の感度
    maxRotationAngle: Math.PI / 2,  // 最大回転角度(±90度)
  },

  // 投げる力の設定
  throw: {
    speedMultiplier: 4,  // 速度の倍率
    minSpeed: 0.8,       // 最小速度
    maxSpeed: 2.0,       // 最大速度
    upFactor: 1,         // 上方向への力の倍率
  },

  // デバッグ設定
  debug: {
    showColliders: false,  // 当たり判定を表示するかどうか
  },
} as const;

使用例

// ボールの半径を取得
const ballRadius = GameParams.ball.radius;

// 物理演算の摩擦係数を取得
const friction = GameParams.physics.friction;

// 投げる力の計算
const speed = Math.min(
  GameParams.throw.maxSpeed,
  Math.max(
    GameParams.throw.minSpeed,
    power * GameParams.throw.speedMultiplier
  )
);

物理演算のパラメータ設計

  • 摩擦と反発の設定
    • friction: 摩擦係数(0.0〜1.0、大きいほど滑りにくい)
    • restitution: 反発係数(0.0〜1.0、大きいほど跳ね返る)
    • みかんがお皿の上で安定するように、適切な値を設定
  • 減衰の設定
    • linearDamping: 並進の減衰(暴走・跳ねを抑える)
    • angularDamping: 回転の減衰(暴走・跳ねを抑える)
    • 値が大きすぎると、みかんがすぐに止まってしまう
  • 接触の硬さの設定
    • contactEquationStiffness: 接触の「硬さ」を設定
    • 硬すぎると貫通→解決で吹っ飛びやすい
    • 柔らかすぎると、みかんが沈み込んでしまう

ゲームプレイのパラメータ設計

  • 投げる力の設定
    • minSpeed / maxSpeed: 投げる力の最小値と最大値
    • speedMultiplier: 速度の倍率(全体の調整用)
    • upFactor: 上方向への力の倍率(弧を描く軌道の調整)
  • カメラの設定
    • distance: お皿からの距離
    • height: カメラの高さ
    • 適切な値に設定することで、見やすい視点を実現
  • お皿とボールのサイズ
    • plate.radius: お皿の半径(ゲームの難易度に直結)
    • ball.radius: ボールの半径
    • サイズの比率を調整することで、ゲームの難易度を調整

パラメータ調整の実践

  • 段階的な調整
    • まず物理演算のパラメータを調整して、基本的な挙動を安定させる
    • 次にゲームプレイのパラメータを調整して、難易度を調整
  • 関連パラメータの同時調整
    • お皿のサイズを変えたら、ボールのサイズも調整する必要がある場合がある
    • パラメータが一箇所に集約されていると、関連するパラメータを同時に確認できる
  • デバッグ用のパラメータ
    • debug.showColliders: 当たり判定を表示するかどうか
    • 開発時に有効化することで、物理演算の挙動を確認できる