Files
5.24BuYu/Assets/MyGame/Scripts/Manager/FishSpawnTimerJob.cs
T
2026-04-29 01:18:39 +08:00

73 lines
2.6 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// ============================================================
// 文件: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;
}
}
}
}