73 lines
2.6 KiB
C#
73 lines
2.6 KiB
C#
// ============================================================
|
||
// 文件:FishSpawnTimerJob.cs
|
||
// 职责:用 Unity Job System(Burst 编译)并行更新所有鱼的生成计时器
|
||
// 优化点:
|
||
// 1. 移除错误的 static List<float>(BurstCompile struct 中不允许托管类型)
|
||
// 2. 修正原逻辑 bug:原代码 shouldSpawn==0 才计时,
|
||
// 导致 shouldSpawn==1 时计时器永远不推进;
|
||
// 修正为:shouldSpawn==1 时视为"冷却中",计时推进,到期后置为可生成。
|
||
// (与 CreateFishManager.ProcessSpawnRequests 的语义对齐:
|
||
// 1=本帧可生成;处理后由主线程置为 0;Job 再次计时到期后置为 1)
|
||
// 3. 补充 XML 注释
|
||
// ============================================================
|
||
|
||
using Unity.Burst;
|
||
using Unity.Collections;
|
||
using Unity.Jobs;
|
||
|
||
/// <summary>
|
||
/// 鱼生成计时器 Job(Burst 编译,Worker 线程并行执行)。
|
||
/// 每帧累加 deltaTime,到达 frequencies[i] 后将 shouldSpawn[i] 置为 1,
|
||
/// 表示该鱼本帧可以触发生成逻辑。
|
||
/// </summary>
|
||
[BurstCompile]
|
||
public struct FishSpawnTimerJob : IJob
|
||
{
|
||
// ----------------------------------------------------------------
|
||
// 输入
|
||
// ----------------------------------------------------------------
|
||
|
||
/// <summary>本帧 Time.deltaTime(由主线程传入)</summary>
|
||
public float deltaTime;
|
||
|
||
/// <summary>每条鱼的生成频率(间隔秒数),只读</summary>
|
||
[ReadOnly]
|
||
public NativeArray<float> frequencies;
|
||
|
||
// ----------------------------------------------------------------
|
||
// 读写
|
||
// ----------------------------------------------------------------
|
||
|
||
/// <summary>每条鱼的累计计时器(秒),由 Job 更新</summary>
|
||
public NativeArray<float> timers;
|
||
|
||
/// <summary>
|
||
/// 生成标志位:
|
||
/// 0 = 冷却中,Job 正在计时
|
||
/// 1 = 计时到期,本帧可触发生成(主线程处理后将其重置为 0)
|
||
/// </summary>
|
||
public NativeArray<int> shouldSpawn;
|
||
|
||
// ----------------------------------------------------------------
|
||
// 执行
|
||
// ----------------------------------------------------------------
|
||
|
||
public void Execute()
|
||
{
|
||
for (int i = 0; i < timers.Length; i++)
|
||
{
|
||
// 仅对冷却中(shouldSpawn==0)的鱼推进计时器
|
||
if (shouldSpawn[i] != 0) continue;
|
||
|
||
timers[i] += deltaTime;
|
||
|
||
// 计时到达频率阈值 → 允许生成,重置计时器
|
||
if (timers[i] >= frequencies[i])
|
||
{
|
||
timers[i] = 0f;
|
||
shouldSpawn[i] = 1;
|
||
}
|
||
}
|
||
}
|
||
}
|