ゲームバランス調整のためのパラメータ設計
2025-12-22 ・ 読了目安 5分
ゲームバランス調整の課題
- 様々なパラメータを調整する必要がある
- 物理演算のパラメータ(摩擦、反発、減衰など)
- ゲームプレイのパラメータ(投げる力、カメラの位置など)
- オブジェクトのサイズや配置
- パラメータが散在していると調整が困難
- コードのあちこちにパラメータが散らばっていると、調整時に見つけにくい
- 関連するパラメータをまとめて調整したい
GameParamsによる一元管理
- すべてのパラメータを一つのオブジェクトに集約
- GameParamsオブジェクトに、カテゴリごとにパラメータを整理
- plate(お皿)、ball(ボール)、physics(物理)、camera(カメラ)など、機能ごとに分類
- 型安全性の確保
- TypeScriptの
as constを使って、パラメータの変更を防ぐ - 定数として扱うことで、誤って変更されることを防ぐ
- TypeScriptの
- 参照の一元化
- すべてのクラスが同じ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: 当たり判定を表示するかどうか
- 開発時に有効化することで、物理演算の挙動を確認できる