简单重构拆分 SimulationWorld

This commit is contained in:
2026-09-18 17:43:41 +08:00
parent 1e4d3ef8d7
commit 92e1ea0d55
109 changed files with 2605 additions and 1817 deletions
@@ -1,50 +1,45 @@
using System.Collections.Generic;
using SepCore.Debugger;
using SepCore.Debugger;
using UnityEngine;
using UnityGameFramework.Runtime;
namespace SepCore.Simulation
{
public sealed partial class SimulationWorld : GameFrameworkComponent
public sealed partial class SimulationWorld : GameFrameworkComponent, ISimulationWorld
{
// Partial layout:
// - SimulationWorld.cs: 鏍稿績鐘舵€併€佸父閲忓拰 Unity 鐢熷懡鍛ㄦ湡鍏ュ彛鐐广€?
// - SimulationWorld.RuntimeModules.cs: 杩愯鏃跺煙瀵硅薄銆侀厤缃拰鐘舵€佷唬鐞嗐€?
// - SimulationWorld.SimEntityState.cs: 妯℃嫙鐘舵€佺殑澧炲垹鏀规煡鍜岀敓鍛藉懆鏈熸敞鍐屻€?
// - SimulationWorld.EntityToSimData.cs: Unity 瀹炰綋鍒?sim data 鐨勫垵濮嬪寲閫傞厤銆?
// - SimulationWorld.EntitySync.cs: GameFramework 瀹炰綋 show/hide 浜嬩欢妗ャ€?
// - SimulationWorld.TargetSelectionSpatialIndex.cs: 鏈€杩戞晫绌洪棿绱㈠紩鏌ヨ銆?
// - Presentation/SimulationWorld.TransformSync.cs: late-update transform 鍚屾妗ャ€?
// - Presentation/SimulationWorld.HitPresentation.cs: 鎶曞皠鐗╁懡涓簨浠惰〃鐜版ˉ銆?
// - DataChannel/SimulationWorld.JobDataChannel.cs: Job 閫氶亾鍏变韩瀛楁銆佸父閲忓拰杩愯鏃剁姸鎬併€?
// - DataChannel/SimulationWorld.JobDataLifecycle.cs: Native 閫氶亾鍒濆鍖栥€佹竻鐞嗗拰 clear銆?
// - DataChannel/SimulationWorld.JobDataConversion.cs: sim/job 鏁版嵁杞崲涓庤緭鍏ヨ緭鍑虹紦鍐插噯澶囥€?
// - DataChannel/SimulationWorld.CollisionTransient.cs: 纰版挒涓存椂閫氶亾鍜岃繍琛屾椂缁熻銆?
// - DataChannel/SimulationWorld.EnemySeparationTemporal.cs: 鏁屼汉鍒嗙鐨勫抚闂翠复鏃剁姸鎬併€?
// - DataChannel/SimulationWorld.JobOutputCommit.cs: Job 杈撳嚭鍥炲啓涓诲鍣ㄣ€?
// - Jobs/SimulationWorld.EnemyJobs.cs: 妯℃嫙閫氶亾 缂栨帓 + 鏁屼汉绉诲姩/鍒嗙 椤哄簭鎵ц
// - Jobs/SimulationWorld.ProjectileJobs.cs: 鎶曞皠鐗╃Щ鍔ㄤ笌鍥炴敹
// - Jobs/SimulationWorld.CollisionPipeline.cs: 纰版挒绠$嚎鍏变韩閰嶇疆鍜岀姸鎬?
// - Jobs/SimulationWorld.CollisionRequests.cs: area/sector 璇锋眰缂撳啿
// - Jobs/SimulationWorld.CollisionBroadPhase.cs: broad-phase 鍊欓€夋瀯寤哄拰 Job 璋冨害
// - Jobs/SimulationWorld.CollisionResolve.cs: 涓荤嚎绋嬪懡涓粨绠椾笌 area settle
// - Jobs/SimulationWorld.CollisionPresentation.cs: 鍛戒腑琛ㄧ幇浜嬩欢鍜屽疄浣?impact 瑙f瀽
// - JobStruct/*.cs: burst job 鍐呮牳鍜岄潰鍚?job 鐨勬暟鎹粨鏋?
private const float DefaultAttackRange = 1f;
private const int EnemyStateIdle = 0;
private const int EnemyStateChasing = 1;
private const int EnemyStateInAttackRange = 2;
private const int ProjectileStateActive = 0;
private const int ProjectileStateExpired = 1;
// - SimulationWorld.cs: 核心状态、常量和 Unity 生命周期入口点。
// - SimulationWorld.RuntimeModules.cs: 运行时域对象、配置和状态代理。
// - SimulationWorld.SimEntityState.cs: 模拟状态的增删改查和生命周期注册。
// - SimulationWorld.EntityToSimData.cs: Unity 实体与组件列/快照之间的边界转换。
// - SimulationWorld.EntitySync.cs: GameFramework 实体 show/hide 事件桥。
// - SimulationWorld.TargetSelectionSpatialIndex.cs: 最近敌空间索引查询。
// - SimulationWorld.PlayerMovement.cs: 玩家模拟移动输入与步进。
// - Components/*: 敌人/投射物/掉落物 SoA 组件列与存储。
// - Presentation/SimulationWorld.TransformSync.cs: late-update transform 同步桥。
// - Presentation/SimulationWorld.HitPresentation.cs: 投射物命中事件表现桥。
// - DataChannel/*: Job 通道与帧间临时状态。
// - Systems/*: 独立数据并行系统(移动/分离/碰撞查询)。
// - Jobs/*: 模拟管线编排、碰撞调度与结算。
// - JobStruct/*: 面向 job 的瞬时数据结构。
// 模拟数据以组件列(SoA)为唯一存储,XxxSimData 只作为生成/查询边界的快照结构。
private const float MinFixedStepSeconds = 0.0001f;
private const double FixedStepEpsilonScale = 1e-4;
[Header("固定步长模拟")]
[Tooltip("开启后按固定步长累积时间,一帧内可能执行多次模拟步进。")]
[SerializeField]
private bool _fixedStepEnabled = true;
[Tooltip("固定步长(秒)。")]
[SerializeField]
private float _fixedStepSeconds = 1f / 60f;
private double _fixedStepAccumulator;
private EntitySync _entitySync;
private TransformSync _transformSync;
private HitPresentation _hitPresentation;
public IReadOnlyList<EnemySimData> Enemies => _enemies;
public IReadOnlyList<ProjectileSimData> Projectiles => _projectiles;
public IReadOnlyList<PickupSimData> Pickups => _pickups;
#region Lifecycle
protected override void Awake()
@@ -64,9 +59,30 @@ namespace SepCore.Simulation
public void Tick(in SimulationTickContext context)
{
Vector3 playerPosition = ResolvePlayerPositionForTick(in context);
SimulationTickContext resolvedContext =
new SimulationTickContext(context.DeltaTime, context.RealDeltaTime, playerPosition);
if (!_fixedStepEnabled)
{
TickSimulationStep(context.PlayerPosition, context.DeltaTime);
return;
}
double fixedStep = Mathf.Max(MinFixedStepSeconds, _fixedStepSeconds);
double stepEpsilon = fixedStep * FixedStepEpsilonScale;
_fixedStepAccumulator += context.DeltaTime;
while (_fixedStepAccumulator + stepEpsilon >= fixedStep)
{
TickSimulationStep(context.PlayerPosition, (float)fixedStep);
_fixedStepAccumulator -= fixedStep;
if (_fixedStepAccumulator < 0d)
{
_fixedStepAccumulator = 0d;
}
}
}
private void TickSimulationStep(Vector3 fallbackPlayerPosition, float deltaTime)
{
Vector3 playerPosition = ResolvePlayerPositionForTick(fallbackPlayerPosition, deltaTime);
SimulationTickContext resolvedContext = new SimulationTickContext(deltaTime, playerPosition);
using (CustomProfilerMarker.TickEnemies.Auto())
{
TickSimulationPipeline(in resolvedContext);
@@ -91,4 +107,3 @@ namespace SepCore.Simulation
#endregion
}
}