// ============================================================ // 文件:FishSpawnTimerJob.cs // 职责:用 Unity Job System(Burst 编译)并行更新所有鱼的生成计时器 // 优化点: // 1. 移除错误的 static List(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; /// /// 鱼生成计时器 Job(Burst 编译,Worker 线程并行执行)。 /// 每帧累加 deltaTime,到达 frequencies[i] 后将 shouldSpawn[i] 置为 1, /// 表示该鱼本帧可以触发生成逻辑。 /// [BurstCompile] public struct FishSpawnTimerJob : IJob { // ---------------------------------------------------------------- // 输入 // ---------------------------------------------------------------- /// 本帧 Time.deltaTime(由主线程传入) public float deltaTime; /// 每条鱼的生成频率(间隔秒数),只读 [ReadOnly] public NativeArray frequencies; // ---------------------------------------------------------------- // 读写 // ---------------------------------------------------------------- /// 每条鱼的累计计时器(秒),由 Job 更新 public NativeArray timers; /// /// 生成标志位: /// 0 = 冷却中,Job 正在计时 /// 1 = 计时到期,本帧可触发生成(主线程处理后将其重置为 0) /// public NativeArray 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; } } } }