简单重构拆分 SimulationWorld
This commit is contained in:
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user