imechenn
This commit is contained in:
@@ -19,18 +19,18 @@ public class BossController : MonoBehaviour, IDamageble
|
||||
|
||||
[SerializeField] public Transform ceilingAnchor;
|
||||
[SerializeField] public Transform groundAnchor;
|
||||
[field: SerializeField] public float AttackRadius { get; private set; } = 10f;
|
||||
[field: SerializeField] public float JumpRoarDuration { get; private set; } = 5f;
|
||||
[field: SerializeField] public float AttackRadius { get; private set; } = 15f;
|
||||
[field: SerializeField] public float JumpRoarDuration { get; private set; } = 2f;
|
||||
[field: SerializeField] public float CeilingAttackDuration { get; private set; } = 8.0f;
|
||||
|
||||
[Tooltip("★新設:糸を降らせる時間間隔(秒)。数値を小さくする(例: 0.1)ほど弾数が激増して密度が上がります")]
|
||||
[field: SerializeField] public float CeilingShotInterval { get; private set; } = 0.2f;
|
||||
|
||||
[Tooltip("★新設:地面に赤マーク(予兆)が出てから、本物の糸が降ってくるまでのタイムラグ(秒)")]
|
||||
[field: SerializeField] public float WebWarningDelay { get; private set; } = 0.8f;
|
||||
|
||||
[Tooltip("★新設:地面に生成された糸が消えずに残り続ける時間(秒)")]
|
||||
[field: SerializeField] public float WebDuration { get; private set; } = 3.0f;
|
||||
|
||||
[Tooltip("★新設:すでに糸がある場所から、最低何メートル離すか(被り防止の半径)")]
|
||||
[field: SerializeField] public float WebAvoidanceRadius { get; private set; } = 2.5f;
|
||||
|
||||
// ★新設:現在ステージ上に存在している(または予兆がある)糸の座標リスト
|
||||
public List<Vector3> ActiveWebPositions { get; private set; } = new List<Vector3>();
|
||||
[SerializeField] private GameObject warningMarkerPrefab;
|
||||
[SerializeField] private GameObject webPrefab;
|
||||
|
||||
@@ -163,6 +163,10 @@ public class BossController : MonoBehaviour, IDamageble
|
||||
|
||||
private System.Collections.IEnumerator SpawnWebRoutine(Vector3 pos, float delay, float duration)
|
||||
{
|
||||
// 1. 生成する座標をアクティブリストに登録(この場所への他の割り込みを禁止する)
|
||||
ActiveWebPositions.Add(pos);
|
||||
|
||||
// 2. 地面に予兆マークを生成
|
||||
GameObject marker = null;
|
||||
if (warningMarkerPrefab != null)
|
||||
{
|
||||
@@ -172,14 +176,23 @@ public class BossController : MonoBehaviour, IDamageble
|
||||
yield return new WaitForSeconds(delay);
|
||||
if (marker != null) Destroy(marker);
|
||||
|
||||
// 3. 本物の糸オブジェクトを生成(X軸90度回転)
|
||||
if (webPrefab != null)
|
||||
{
|
||||
Quaternion webRotation = Quaternion.Euler(270f, 0f, 0f);
|
||||
|
||||
GameObject web = Instantiate(webPrefab, pos + new Vector3(0, 0.5f, 0), webRotation);
|
||||
|
||||
Destroy(web, duration);
|
||||
|
||||
// ★持続時間(duration)が終わるまで待機してからDestroyする形に変更
|
||||
yield return new WaitForSeconds(duration);
|
||||
if (web != null) Destroy(web);
|
||||
}
|
||||
else
|
||||
{
|
||||
yield return new WaitForSeconds(duration);
|
||||
}
|
||||
|
||||
// 4. 糸が消滅したので、リストから座標を削除してスペースを解放する
|
||||
ActiveWebPositions.Remove(pos);
|
||||
}
|
||||
|
||||
public void ResetAllAnimationTriggers()
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user