ActiveProtect/docs/Design.md

5.6 KiB
Raw Permalink Blame History

导弹仿真系统设计文档

系统架构设计思路

在处理导弹、坦克、告警设备、干扰设备等复杂交互关系时,我们采用了以下几种程序架构和设计模式的组合:

1. 事件驱动架构Event-Driven Architecture

事件驱动架构非常适合处理复杂的交互关系。每个实体(如导弹、坦克等)可以发布事件,其他实体可以订阅这些事件并作出反应。

csharp public class EventManager { private Dictionary<string, List<Action<object>>> eventSubscribers = new Dictionary<string, List<Action<object>>>(); public void Subscribe(string eventName, Action<object> listener) { ... } public void Publish(string eventName, object eventData) { ... } }

2. 组件系统Component System

将每个实体分解为多个组件,每个组件负责特定的功能。这样可以更灵活地组合不同的功能。

csharp public class Entity { public PositionComponent Position { get; set; } public VelocityComponent Velocity { get; set; } public HealthComponent Health { get; set; } }

3. 观察者模式Observer Pattern

类似于事件驱动架构,但更加面向对象。每个实体可以作为观察者或被观察者。

``csharp public interface IObserver { void Update(ISubject subject); }

public interface ISubject { void Attach(IObserver observer); void Detach(IObserver observer); void Notify(); } ``

4. 状态机State Machine

对于有明确状态转换的实体(如导弹的飞行阶段),使用状态机可以更清晰地管理状态转换。

``csharp public enum MissileState { Idle, Tracking, Locking, Firing, Exploding }

public class Missile { public MissileState State { get; set; } public void ChangeState(MissileState newState) { ... } }

csharp public interface IState { void Enter(); void Update(); void Exit(); } public class MissileStateMachine { private IState currentState; public void ChangeState(IState newState) { ... } public void Update() { ... } }

5. 命令模式Command Pattern

用于封装各种操作,使得可以轻松地添加新的交互行为。

``csharp public interface ICommand { void Execute(); }

public class FireMissileCommand : ICommand { public void Execute() { ... } } ``

架构组合使用

在实际应用中,我们将这些模式组合使用:

  1. 使用事件驱动架构作为整体框架,处理系统中的各种事件。
  2. 采用组件系统来构建各个实体(如导弹、坦克、告警设备等)。
  3. 使用状态机来管理导弹的飞行阶段。
  4. 应用观察者模式来处理告警设备的通知机制。
  5. 使用命令模式来封装各种交互操作,如发射导弹、激活干扰设备等。

这种组合架构允许我们灵活地处理复杂的交互关系,同时保持代码的可维护性和可扩展性。

下一步计划

  • 实现核心实体(导弹、坦克、告警设备、干扰设备)的基本功能。
  • 设计并实现事件系统,处理实体间的交互。
  • 开发状态机,管理导弹的飞行阶段。
  • 实现观察者模式,处理告警通知。
  • 使用命令模式封装关键操作。
  • 进行单元测试和集成测试,确保系统的正确性和稳定性。

数据库访问架构

在Unity3D环境中考虑到兼容性和易用性我推荐使用第二种方法值对象模式。这种方式有以下几个优点

  1. 分离关注点数据库实体MissileConfigEntity和游戏中使用的配置对象MissileConfig是分开的这样可以避免 ORM 相关的属性和特性污染游戏逻辑。
  2. 灵活性:可以轻松地在数据库实体和游戏配置对象之间进行转换,而不影响现有的游戏逻辑。
  3. 序列化友好Unity 经常需要序列化对象,使用纯粹的 C# 对象(如 MissileConfig更容易进行序列化和反序列化。
  4. 兼容性好:这种方法不依赖于特定的 ORM 框架,如果将来需要更换数据库或 ORM 系统,影响会较小。

数据访问层使用了 Dapper一个轻量级的 ORM它在 Unity 中使用较为简单。

数据库设计

1. 导弹数据库设计

导弹数据库设计需要考虑导弹的属性、状态、行为等。

1.1 导弹属性

导弹属性包括导弹的初始位置、初始速度、最大速度、目标索引、最大飞行时间、最大飞行距离、飞行阶段配置、推力加速度、最大发动机燃烧时间、最大加速度、距离参数、比例导引系数、类型等。

1.2 导弹状态

导弹状态包括导弹的当前位置、当前速度、当前加速度、当前飞行阶段、当前目标索引、当前最大速度、当前最大加速度、当前最大飞行距离、当前最大飞行时间、当前比例导引系数等。

1.3 导弹行为

导弹行为包括导弹的飞行行为、攻击行为、躲避行为、跟踪行为、锁定行为、发射行为、爆炸行为等。

在激光驾束制导中, 为了实现更平滑的控制同时将加速度控制在25 m/s²以下并保持偏移在1.5米以内,我们可以采用以下几种方法

  1. 使用PID控制器 PID比例-积分-微分)控制器可以提供更平滑和精确的控制。它考虑了误差的历史、当前值和变化率。
  2. 非线性增益: 使用非线性函数来计算增益,使得在接近目标时增益减小,远离目标时增益增大。
  3. 低通滤波: 对计算出的加速度进行低通滤波,以减少高频振荡。
  4. 预测控制: 基于当前状态预测未来的位置,提前做出调整。