简单重构拆分 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
@@ -36,7 +36,7 @@ namespace SepCore.Simulation
for (int i = 0; i < _collisionCandidates.Length; i++)
{
CollisionCandidateData candidate = _collisionCandidates[i];
if (candidate.SourceType == CollisionSourceTypeProjectile)
if (candidate.SourceType == SimulationCollision.SourceTypeProjectile)
{
int projectileEntityId = candidate.SourceEntityId;
if (_projectileResolvedEntityIds.Contains(projectileEntityId))
@@ -44,7 +44,7 @@ namespace SepCore.Simulation
continue;
}
if (!TryGetActiveProjectileSimData(projectileEntityId, out _, out ProjectileSimData projectile))
if (!TryGetActiveProjectileIndex(projectileEntityId, out int projectileIndex))
{
_projectileResolvedEntityIds.Add(projectileEntityId);
continue;
@@ -53,14 +53,15 @@ namespace SepCore.Simulation
bool shouldExpireProjectile = true;
bool shouldDispatchPresentation = false;
int damage = 0;
Vector3 hitPosition = projectile.Position;
Vector3 projectilePosition = ToVector3(_projectiles.Transform[projectileIndex].Position);
Vector3 hitPosition = projectilePosition;
if (TryGetAliveTargetableEntity(candidate.TargetEntityId, out TargetableObject target))
{
EntityBase sourceEntity = TryGetEntityById(candidate.SourceEntityId);
EntityBase ownerEntity = TryGetEntityById(candidate.SourceOwnerEntityId);
shouldExpireProjectile = ResolveProjectileHitAgainstTarget(target, sourceEntity,
ownerEntity,
in projectile,
in projectilePosition,
out damage, out hitPosition, out shouldDispatchPresentation);
}
@@ -79,7 +80,7 @@ namespace SepCore.Simulation
continue;
}
if (candidate.SourceType == CollisionSourceTypeArea)
if (candidate.SourceType == SimulationCollision.SourceTypeArea)
{
long dedupKey = (((long)candidate.QueryId) << 32) ^ (uint)candidate.TargetEntityId;
if (!_areaCollisionHitDedupKeys.Add(dedupKey))
@@ -112,11 +113,11 @@ namespace SepCore.Simulation
private bool ResolveProjectileHitAgainstTarget(TargetableObject target, EntityBase sourceEntity,
EntityBase ownerEntity,
in ProjectileSimData projectile, out int damage, out Vector3 hitPosition,
in Vector3 projectilePosition, out int damage, out Vector3 hitPosition,
out bool shouldDispatchPresentation)
{
damage = 0;
hitPosition = projectile.Position;
hitPosition = projectilePosition;
shouldDispatchPresentation = false;
if (target == null || !target.Available || target.IsDead)
@@ -167,7 +168,7 @@ namespace SepCore.Simulation
{
AreaCollisionHitEventData hitEvent = _areaCollisionHitEvents[i];
if (!TryGetCollisionQueryByQueryId(hitEvent.QueryId, out CollisionQueryData query) ||
query.SourceType != CollisionSourceTypeArea)
query.SourceType != SimulationCollision.SourceTypeArea)
{
continue;
}
@@ -238,9 +239,9 @@ namespace SepCore.Simulation
return 0f;
}
if (target is EnemyBase && TryGetEnemyData(target.Id, out EnemySimData enemyData))
if (target is EnemyBase && _enemies.TryGetSimulationIndex(target.Id, out int enemyIndex))
{
return Mathf.Max(0f, enemyData.EnemyBodyRadius);
return Mathf.Max(0f, _enemies.MoveConfig[enemyIndex].BodyRadius);
}
MovementComponent movementComponent = target.GetComponent<MovementComponent>();
@@ -267,7 +268,7 @@ namespace SepCore.Simulation
return false;
}
if (query.ShapeType == CollisionShapeRectangle)
if (query.ShapeType == SimulationCollision.ShapeRectangle)
{
Vector3 forwardRect = new Vector3(query.Direction.x, query.Direction.y, query.Direction.z);
forwardRect.y = 0f;
@@ -288,7 +289,7 @@ namespace SepCore.Simulation
return Mathf.Abs(forwardDistance) <= halfLength && Mathf.Abs(lateralDistance) <= halfWidth;
}
if (query.ShapeType != CollisionShapeSector)
if (query.ShapeType != SimulationCollision.ShapeSector)
{
return true;
}
@@ -314,47 +315,34 @@ namespace SepCore.Simulation
return angle <= halfAngle;
}
private bool TryGetActiveProjectileSimData(int projectileEntityId, out int simulationIndex,
out ProjectileSimData projectile)
private bool TryGetActiveProjectileIndex(int projectileEntityId, out int simulationIndex)
{
simulationIndex = -1;
projectile = default;
if (!ProjectileBinding.TryGetSimulationIndex(projectileEntityId, out int foundIndex) || foundIndex < 0 ||
foundIndex >= _projectiles.Count)
{
return false;
}
ProjectileSimData data = _projectiles[foundIndex];
if (!data.Active || data.State != ProjectileStateActive)
if (!_projectiles.TryGetSimulationIndex(projectileEntityId, out int foundIndex) ||
!_projectiles.Life[foundIndex].Active)
{
return false;
}
simulationIndex = foundIndex;
projectile = data;
return true;
}
private bool MarkProjectileAsExpired(int projectileEntityId)
{
if (!ProjectileBinding.TryGetSimulationIndex(projectileEntityId, out int simulationIndex) ||
simulationIndex < 0 || simulationIndex >= _projectiles.Count)
if (!_projectiles.TryGetSimulationIndex(projectileEntityId, out int simulationIndex))
{
return false;
}
ProjectileSimData projectile = _projectiles[simulationIndex];
projectile.Active = false;
projectile.State = ProjectileStateExpired;
projectile.RemainingLifetime = 0f;
if (projectile.LifeTime > 0f && projectile.Age < projectile.LifeTime)
ProjectileLifeSim life = _projectiles.Life[simulationIndex];
life.Active = false;
if (life.LifeTime > 0f && life.Age < life.LifeTime)
{
projectile.Age = projectile.LifeTime;
life.Age = life.LifeTime;
}
_projectiles[simulationIndex] = projectile;
_projectiles.Life[simulationIndex] = life;
return true;
}