ActiveProtect/Design.md
2024-10-16 11:07:06 +08:00

151 lines
4.9 KiB
Markdown
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.

# 导弹仿真系统设计文档
## 系统架构设计思路
在处理导弹、坦克、告警设备、干扰设备等复杂交互关系时,我们采用了以下几种程序架构和设计模式的组合:
### 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 导弹行为
导弹行为包括导弹的飞行行为、攻击行为、躲避行为、跟踪行为、锁定行为、发射行为、爆炸行为等。