This commit is contained in:
ohgushiyuga
2026-07-14 16:38:14 +09:00
parent 1ab733c127
commit 55de0be73c
5 changed files with 143 additions and 89 deletions

View File

@@ -265,17 +265,41 @@ public class SpiderCeilingAttackState : SpiderStateBase
}
}
private void ExecuteRandomWebAttack()
private void ExecuteRandomWebAttack()
{
// インスペクターで設定された半径AttackRadiusを基準にランダム座標を計算
Vector2 randomCircle = Random.insideUnitCircle * boss.AttackRadius;
Vector3 targetGroundPos = new Vector3(
boss.groundAnchor.position.x + randomCircle.x,
boss.groundAnchor.position.y,
boss.groundAnchor.position.z + randomCircle.y
);
Vector3 targetGroundPos = Vector3.zero;
int maxAttempts = 15; // 無限ループ(フリーズ)を防止するための最大再抽選回数
for (int i = 0; i < maxAttempts; i++)
{
// 1. 一旦ランダムな座標を算出
Vector2 randomCircle = Random.insideUnitCircle * boss.AttackRadius;
targetGroundPos = new Vector3(
boss.groundAnchor.position.x + randomCircle.x,
boss.groundAnchor.position.y,
boss.groundAnchor.position.z + randomCircle.y
);
// ★リファクタリング:予兆マークのディレイや糸の生存時間もインスペクターと完全連動
// 2. 現在アクティブなすべての糸との距離を計測する
bool isTooClose = false;
foreach (Vector3 existingPos in boss.ActiveWebPositions)
{
// 設定された回避半径WebAvoidanceRadiusより近い既存の糸があるか
if (Vector3.Distance(targetGroundPos, existingPos) < boss.WebAvoidanceRadius)
{
isTooClose = true;
break; // 被り検知、この座標は使えないのでチェックを抜けて再抽選へ
}
}
// 3. 誰とも被っていなければ、このクリーンな座標で確定
if (!isTooClose)
{
break;
}
}
// 確定した(または上限に達して安全が担保された)座標へ向けて発射命令
boss.SpawnWarningAndWeb(targetGroundPos, boss.WebWarningDelay, boss.WebDuration);
}
}