mirror of
https://github.com/GeWuYou/GFramework.git
synced 2026-03-22 02:24:30 +08:00
refactor(ecs): 移除Arch ECS模块及相关组件和系统
- 删除Position组件结构体定义 - 删除Velocity组件结构体定义 - 删除MovementSystem移动系统实现 - 移除ArchEcsModule ECS模块管理器 - 删除ArchSystemAdapter适配器基类 - 从ServiceModuleManager中移除ECS模块注册逻辑 - 从ArchitectureProperties中移除EnableEcs配置选项 - 删除ECS相关的单元测试文件 - 从项目文件中移除Arch和Arch.System包引用 - 从解决方案文件中移除ECS相关项目引用 - 更新项目配置文件中的目标框架和测试项目属性
This commit is contained in:
parent
23f186d395
commit
af76e0ab0b
@ -0,0 +1,35 @@
|
||||
namespace GFramework.Core.Abstractions.architecture;
|
||||
|
||||
/// <summary>
|
||||
/// 架构模块注册表 - 用于外部模块的自动注册
|
||||
/// </summary>
|
||||
public static class ArchitectureModuleRegistry
|
||||
{
|
||||
private static readonly List<Func<IServiceModule>> _factories = [];
|
||||
|
||||
/// <summary>
|
||||
/// 注册模块工厂
|
||||
/// </summary>
|
||||
/// <param name="factory">模块工厂函数</param>
|
||||
public static void Register(Func<IServiceModule> factory)
|
||||
{
|
||||
_factories.Add(factory);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 创建所有已注册的模块实例
|
||||
/// </summary>
|
||||
/// <returns>模块实例集合</returns>
|
||||
public static IEnumerable<IServiceModule> CreateModules()
|
||||
{
|
||||
return _factories.Select(f => f());
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 清空注册表(主要用于测试)
|
||||
/// </summary>
|
||||
public static void Clear()
|
||||
{
|
||||
_factories.Clear();
|
||||
}
|
||||
}
|
||||
@ -17,10 +17,4 @@ public sealed class ArchitectureProperties
|
||||
/// 默认值为 false,表示不启用严格验证。
|
||||
/// </summary>
|
||||
public bool StrictPhaseValidation { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 启用 ECS(Entity Component System)功能的开关。
|
||||
/// 当设置为 true 时,架构将启用 ECS 相关功能。
|
||||
/// </summary>
|
||||
public bool EnableEcs { get; set; }
|
||||
}
|
||||
@ -1,9 +1,11 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFrameworks>net8.0;net10.0</TargetFrameworks>
|
||||
<ImplicitUsings>disable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
<TargetFrameworks>net10.0;net8.0</TargetFrameworks>
|
||||
<IsPackable>false</IsPackable>
|
||||
<IsTestProject>true</IsTestProject>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Mediator.Abstractions" Version="3.0.1"/>
|
||||
|
||||
@ -15,7 +15,6 @@ using GFramework.Core.events;
|
||||
using GFramework.Core.ioc;
|
||||
using GFramework.Core.query;
|
||||
using Mediator;
|
||||
using NUnit.Framework;
|
||||
using ICommand = GFramework.Core.Abstractions.command.ICommand;
|
||||
|
||||
namespace GFramework.Core.Tests.architecture;
|
||||
@ -269,27 +268,6 @@ public class ArchitectureServicesTests
|
||||
{
|
||||
Assert.That(_services!.ModuleManager, Is.Not.Null);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 测试EnableEcs配置开关
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void EnableEcs_Should_Control_Ecs_Module_Registration()
|
||||
{
|
||||
var propertiesWithEcs = new ArchitectureProperties { EnableEcs = true };
|
||||
var propertiesWithoutEcs = new ArchitectureProperties { EnableEcs = false };
|
||||
|
||||
var servicesWithEcs = new ArchitectureServices();
|
||||
servicesWithEcs.ModuleManager.RegisterBuiltInModules(servicesWithEcs.Container, propertiesWithEcs);
|
||||
|
||||
var servicesWithoutEcs = new ArchitectureServices();
|
||||
servicesWithoutEcs.ModuleManager.RegisterBuiltInModules(servicesWithoutEcs.Container, propertiesWithoutEcs);
|
||||
|
||||
var modulesWithEcs = servicesWithEcs.ModuleManager.GetModules();
|
||||
var modulesWithoutEcs = servicesWithoutEcs.ModuleManager.GetModules();
|
||||
|
||||
Assert.That(modulesWithEcs.Count, Is.GreaterThan(modulesWithoutEcs.Count));
|
||||
}
|
||||
}
|
||||
|
||||
#region Test Classes
|
||||
|
||||
@ -13,7 +13,5 @@
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="10.0.3"/>
|
||||
<PackageReference Include="Microsoft.Bcl.AsyncInterfaces" Version="8.0.0"/>
|
||||
<PackageReference Include="Arch" Version="2.1.0"/>
|
||||
<PackageReference Include="Arch.System" Version="1.1.0"/>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
|
||||
@ -3,7 +3,6 @@ using GFramework.Core.Abstractions.ioc;
|
||||
using GFramework.Core.Abstractions.lifecycle;
|
||||
using GFramework.Core.Abstractions.logging;
|
||||
using GFramework.Core.Abstractions.properties;
|
||||
using GFramework.Core.ecs;
|
||||
using GFramework.Core.logging;
|
||||
using GFramework.Core.services.modules;
|
||||
|
||||
@ -44,11 +43,11 @@ public sealed class ServiceModuleManager : IServiceModuleManager
|
||||
|
||||
/// <summary>
|
||||
/// 注册内置服务模块,并根据优先级排序后完成服务注册。
|
||||
/// 内置模块包括事件总线、命令执行器、查询执行器等核心模块,
|
||||
/// 并根据配置决定是否启用ECS模块。
|
||||
/// 内置模块包括事件总线、命令执行器、查询执行器等核心模块。
|
||||
/// 同时注册通过 ModuleInitializer 自动注册的外部模块。
|
||||
/// </summary>
|
||||
/// <param name="container">IoC容器实例,用于模块服务注册。</param>
|
||||
/// <param name="properties">架构属性配置,用于判断是否启用ECS模块。</param>
|
||||
/// <param name="properties">架构属性配置。</param>
|
||||
public void RegisterBuiltInModules(IIocContainer container, ArchitectureProperties properties)
|
||||
{
|
||||
if (_builtInModulesRegistered)
|
||||
@ -57,21 +56,25 @@ public sealed class ServiceModuleManager : IServiceModuleManager
|
||||
return;
|
||||
}
|
||||
|
||||
// 注册内置模块
|
||||
RegisterModule(new EventBusModule());
|
||||
RegisterModule(new CommandExecutorModule());
|
||||
RegisterModule(new QueryExecutorModule());
|
||||
RegisterModule(new AsyncQueryExecutorModule());
|
||||
|
||||
if (properties.EnableEcs)
|
||||
// 注册外部模块(通过 ModuleInitializer 自动注册)
|
||||
foreach (var module in ArchitectureModuleRegistry.CreateModules())
|
||||
{
|
||||
RegisterModule(new ArchEcsModule(enabled: true));
|
||||
_logger.Info("ECS module enabled via configuration");
|
||||
RegisterModule(module);
|
||||
_logger.Info($"External module registered: {module.ModuleName}");
|
||||
}
|
||||
|
||||
// 按优先级排序
|
||||
var sortedModules = _modules.OrderBy(m => m.Priority).ToList();
|
||||
_modules.Clear();
|
||||
_modules.AddRange(sortedModules);
|
||||
|
||||
// 注册服务
|
||||
foreach (var module in _modules.Where(module => module.IsEnabled))
|
||||
{
|
||||
_logger.Debug($"Registering services for module: {module.ModuleName}");
|
||||
@ -79,7 +82,7 @@ public sealed class ServiceModuleManager : IServiceModuleManager
|
||||
}
|
||||
|
||||
_builtInModulesRegistered = true;
|
||||
_logger.Info($"Registered {_modules.Count} built-in service modules");
|
||||
_logger.Info($"Registered {_modules.Count} service modules");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
22
GFramework.Ecs.Arch.Abstractions/ArchOptions.cs
Normal file
22
GFramework.Ecs.Arch.Abstractions/ArchOptions.cs
Normal file
@ -0,0 +1,22 @@
|
||||
namespace GFramework.Ecs.Arch.Abstractions;
|
||||
|
||||
/// <summary>
|
||||
/// Arch ECS 配置选项
|
||||
/// </summary>
|
||||
public sealed class ArchOptions
|
||||
{
|
||||
/// <summary>
|
||||
/// World 初始容量
|
||||
/// </summary>
|
||||
public int WorldCapacity { get; set; } = 1000;
|
||||
|
||||
/// <summary>
|
||||
/// 是否启用统计信息
|
||||
/// </summary>
|
||||
public bool EnableStatistics { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 模块优先级
|
||||
/// </summary>
|
||||
public int Priority { get; set; } = 50;
|
||||
}
|
||||
18
GFramework.Ecs.Arch.Abstractions/Directory.Build.props
Normal file
18
GFramework.Ecs.Arch.Abstractions/Directory.Build.props
Normal file
@ -0,0 +1,18 @@
|
||||
<Project>
|
||||
<PropertyGroup>
|
||||
<TargetFramework>netstandard2.1</TargetFramework>
|
||||
<ContinuousIntegrationBuild>true</ContinuousIntegrationBuild>
|
||||
<EmbedUntrackedSources>true</EmbedUntrackedSources>
|
||||
<LangVersion>preview</LangVersion>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Meziantou.Analyzer" Version="2.0.264">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
|
||||
</PackageReference>
|
||||
<PackageReference Include="Meziantou.Polyfill" Version="1.0.71">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
|
||||
</PackageReference>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
@ -0,0 +1,13 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<PackageId>GeWuYou.$(AssemblyName)</PackageId>
|
||||
<GenerateDocumentationFile>true</GenerateDocumentationFile>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\GFramework.Core.Abstractions\GFramework.Core.Abstractions.csproj" PrivateAssets="all"/>
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
3
GFramework.Ecs.Arch.Abstractions/GlobalUsings.cs
Normal file
3
GFramework.Ecs.Arch.Abstractions/GlobalUsings.cs
Normal file
@ -0,0 +1,3 @@
|
||||
global using System;
|
||||
global using System.Collections.Generic;
|
||||
global using System.Threading.Tasks;
|
||||
15
GFramework.Ecs.Arch.Abstractions/IArchEcsModule.cs
Normal file
15
GFramework.Ecs.Arch.Abstractions/IArchEcsModule.cs
Normal file
@ -0,0 +1,15 @@
|
||||
using GFramework.Core.Abstractions.architecture;
|
||||
|
||||
namespace GFramework.Ecs.Arch.Abstractions;
|
||||
|
||||
/// <summary>
|
||||
/// Arch ECS 模块接口 - 定义 ECS 模块的核心契约
|
||||
/// </summary>
|
||||
public interface IArchEcsModule : IServiceModule
|
||||
{
|
||||
/// <summary>
|
||||
/// 更新所有 ECS 系统
|
||||
/// </summary>
|
||||
/// <param name="deltaTime">帧间隔时间</param>
|
||||
void Update(float deltaTime);
|
||||
}
|
||||
16
GFramework.Ecs.Arch.Abstractions/IArchSystemAdapter.cs
Normal file
16
GFramework.Ecs.Arch.Abstractions/IArchSystemAdapter.cs
Normal file
@ -0,0 +1,16 @@
|
||||
using GFramework.Core.Abstractions.system;
|
||||
|
||||
namespace GFramework.Ecs.Arch.Abstractions;
|
||||
|
||||
/// <summary>
|
||||
/// Arch 系统适配器接口 - 桥接 Arch.System.ISystem<T> 到框架上下文
|
||||
/// </summary>
|
||||
/// <typeparam name="T">系统数据类型(通常是 float 表示 deltaTime)</typeparam>
|
||||
public interface IArchSystemAdapter<T> : ISystem
|
||||
{
|
||||
/// <summary>
|
||||
/// 更新系统
|
||||
/// </summary>
|
||||
/// <param name="t">系统数据参数(通常是 deltaTime)</param>
|
||||
void Update(in T t);
|
||||
}
|
||||
25
GFramework.Ecs.Arch.Tests/GFramework.Ecs.Arch.Tests.csproj
Normal file
25
GFramework.Ecs.Arch.Tests/GFramework.Ecs.Arch.Tests.csproj
Normal file
@ -0,0 +1,25 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFrameworks>net8.0;net10.0</TargetFrameworks>
|
||||
<ImplicitUsings>disable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
<IsPackable>false</IsPackable>
|
||||
<IsTestProject>true</IsTestProject>
|
||||
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="coverlet.collector" Version="6.0.2"/>
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.3.0"/>
|
||||
<PackageReference Include="Moq" Version="4.20.72"/>
|
||||
<PackageReference Include="NUnit" Version="4.5.0"/>
|
||||
<PackageReference Include="NUnit3TestAdapter" Version="6.1.0"/>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\GFramework.Ecs.Arch\GFramework.Ecs.Arch.csproj"/>
|
||||
<ProjectReference Include="..\GFramework.Core\GFramework.Core.csproj"/>
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
5
GFramework.Ecs.Arch.Tests/GlobalUsings.cs
Normal file
5
GFramework.Ecs.Arch.Tests/GlobalUsings.cs
Normal file
@ -0,0 +1,5 @@
|
||||
global using System;
|
||||
global using System.Collections.Generic;
|
||||
global using System.Threading.Tasks;
|
||||
global using NUnit.Framework;
|
||||
global using GFramework.Ecs.Arch;
|
||||
@ -2,13 +2,11 @@ using System.Diagnostics.CodeAnalysis;
|
||||
using Arch.Core;
|
||||
using GFramework.Core.Abstractions.rule;
|
||||
using GFramework.Core.architecture;
|
||||
using GFramework.Core.ecs;
|
||||
using GFramework.Core.ecs.components;
|
||||
using GFramework.Core.ecs.systems;
|
||||
using GFramework.Core.ioc;
|
||||
using NUnit.Framework;
|
||||
using GFramework.Ecs.Arch.components;
|
||||
using GFramework.Ecs.Arch.systems;
|
||||
|
||||
namespace GFramework.Core.Tests.ecs;
|
||||
namespace GFramework.Ecs.Arch.Tests.ecs;
|
||||
|
||||
/// <summary>
|
||||
/// ECS 高级功能测试类 - 使用 Arch 原生 API
|
||||
@ -2,13 +2,11 @@ using System.Diagnostics.CodeAnalysis;
|
||||
using Arch.Core;
|
||||
using GFramework.Core.Abstractions.rule;
|
||||
using GFramework.Core.architecture;
|
||||
using GFramework.Core.ecs;
|
||||
using GFramework.Core.ecs.components;
|
||||
using GFramework.Core.ecs.systems;
|
||||
using GFramework.Core.ioc;
|
||||
using NUnit.Framework;
|
||||
using GFramework.Ecs.Arch.components;
|
||||
using GFramework.Ecs.Arch.systems;
|
||||
|
||||
namespace GFramework.Core.Tests.ecs;
|
||||
namespace GFramework.Ecs.Arch.Tests.ecs;
|
||||
|
||||
/// <summary>
|
||||
/// ECS 基础功能测试类 - 使用 Arch 原生 API
|
||||
@ -2,13 +2,11 @@ using System.Diagnostics.CodeAnalysis;
|
||||
using Arch.Core;
|
||||
using GFramework.Core.Abstractions.rule;
|
||||
using GFramework.Core.architecture;
|
||||
using GFramework.Core.ecs;
|
||||
using GFramework.Core.ecs.components;
|
||||
using GFramework.Core.ecs.systems;
|
||||
using GFramework.Core.ioc;
|
||||
using NUnit.Framework;
|
||||
using GFramework.Ecs.Arch.components;
|
||||
using GFramework.Ecs.Arch.systems;
|
||||
|
||||
namespace GFramework.Core.Tests.ecs;
|
||||
namespace GFramework.Ecs.Arch.Tests.ecs;
|
||||
|
||||
/// <summary>
|
||||
/// ECS 集成测试类 - 使用 Arch 原生 API
|
||||
@ -0,0 +1,75 @@
|
||||
using System.Linq;
|
||||
using Arch.Core;
|
||||
using GFramework.Core.Abstractions.properties;
|
||||
using GFramework.Core.architecture;
|
||||
using GFramework.Core.ioc;
|
||||
using GFramework.Ecs.Arch.Abstractions;
|
||||
|
||||
namespace GFramework.Ecs.Arch.Tests.integration;
|
||||
|
||||
/// <summary>
|
||||
/// 自动注册集成测试
|
||||
/// </summary>
|
||||
[TestFixture]
|
||||
public class AutoRegistrationTests
|
||||
{
|
||||
[SetUp]
|
||||
public void Setup()
|
||||
{
|
||||
_container = new MicrosoftDiContainer();
|
||||
_context = new ArchitectureContext(_container);
|
||||
}
|
||||
|
||||
[TearDown]
|
||||
public void TearDown()
|
||||
{
|
||||
_container?.Clear();
|
||||
_context = null;
|
||||
}
|
||||
|
||||
private MicrosoftDiContainer? _container;
|
||||
private ArchitectureContext? _context;
|
||||
|
||||
/// <summary>
|
||||
/// 测试 Arch ECS 模块是否自动注册
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void ArchEcsModule_Should_Be_Auto_Registered()
|
||||
{
|
||||
// Arrange - 手动触发模块初始化器(模拟自动注册)
|
||||
ArchModuleInitializer.Initialize();
|
||||
|
||||
var services = new ArchitectureServices();
|
||||
var properties = new ArchitectureProperties();
|
||||
|
||||
// Act
|
||||
services.ModuleManager.RegisterBuiltInModules(services.Container, properties);
|
||||
var modules = services.ModuleManager.GetModules();
|
||||
|
||||
// Assert
|
||||
var archModule = modules.FirstOrDefault(m => m.ModuleName == nameof(ArchEcsModule));
|
||||
Assert.That(archModule, Is.Not.Null, "ArchEcsModule should be auto-registered");
|
||||
Assert.That(archModule, Is.InstanceOf<IArchEcsModule>());
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 测试 World 是否正确注册到容器
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void World_Should_Be_Registered_In_Container()
|
||||
{
|
||||
// Arrange - 手动触发模块初始化器
|
||||
ArchModuleInitializer.Initialize();
|
||||
|
||||
var services = new ArchitectureServices();
|
||||
var properties = new ArchitectureProperties();
|
||||
|
||||
// Act
|
||||
services.ModuleManager.RegisterBuiltInModules(services.Container, properties);
|
||||
services.ModuleManager.InitializeAllAsync(false).Wait();
|
||||
|
||||
// Assert
|
||||
var world = services.Container.Get<World>();
|
||||
Assert.That(world, Is.Not.Null, "World should be registered in container");
|
||||
}
|
||||
}
|
||||
@ -1,13 +1,12 @@
|
||||
using Arch.Core;
|
||||
using GFramework.Core.Abstractions.architecture;
|
||||
using GFramework.Core.Abstractions.ioc;
|
||||
|
||||
namespace GFramework.Core.ecs;
|
||||
namespace GFramework.Ecs.Arch;
|
||||
|
||||
/// <summary>
|
||||
/// Arch ECS 模块 - 核心适配器,桥接 Arch 到框架生命周期
|
||||
/// </summary>
|
||||
public sealed class ArchEcsModule : IServiceModule
|
||||
public sealed class ArchEcsModule : IArchEcsModule
|
||||
{
|
||||
private readonly List<ArchSystemAdapter<float>> _systems = [];
|
||||
private IIocContainer? _container;
|
||||
21
GFramework.Ecs.Arch/ArchModuleInitializer.cs
Normal file
21
GFramework.Ecs.Arch/ArchModuleInitializer.cs
Normal file
@ -0,0 +1,21 @@
|
||||
using System.Runtime.CompilerServices;
|
||||
using GFramework.Core.Abstractions.architecture;
|
||||
|
||||
namespace GFramework.Ecs.Arch;
|
||||
|
||||
/// <summary>
|
||||
/// Arch ECS 模块自动初始化器
|
||||
/// 使用 ModuleInitializer 特性在程序启动时自动注册模块
|
||||
/// </summary>
|
||||
public static class ArchModuleInitializer
|
||||
{
|
||||
/// <summary>
|
||||
/// 模块初始化方法,在程序启动时自动调用
|
||||
/// </summary>
|
||||
[ModuleInitializer]
|
||||
public static void Initialize()
|
||||
{
|
||||
// 注册 Arch ECS 模块工厂
|
||||
ArchitectureModuleRegistry.Register(() => new ArchEcsModule(enabled: true));
|
||||
}
|
||||
}
|
||||
@ -3,19 +3,29 @@ using GFramework.Core.extensions;
|
||||
using GFramework.Core.system;
|
||||
using ArchSys = Arch.System;
|
||||
|
||||
namespace GFramework.Core.ecs;
|
||||
namespace GFramework.Ecs.Arch;
|
||||
|
||||
/// <summary>
|
||||
/// Arch 系统适配器 - 桥接 Arch.System.ISystem<T> 到框架上下文
|
||||
/// </summary>
|
||||
/// <typeparam name="T">系统数据类型(通常是 float 表示 deltaTime)</typeparam>
|
||||
public abstract class ArchSystemAdapter<T> : AbstractSystem, ArchSys.ISystem<T>
|
||||
public abstract class ArchSystemAdapter<T> : AbstractSystem, IArchSystemAdapter<T>, ArchSys.ISystem<T>
|
||||
{
|
||||
/// <summary>
|
||||
/// 获取或设置 Arch ECS 世界的实例
|
||||
/// </summary>
|
||||
public World World { get; private set; } = null!;
|
||||
|
||||
/// <summary>
|
||||
/// 显式实现 Arch.System.ISystem<T> 的主更新方法
|
||||
/// 调用受保护的虚方法 OnUpdate 以强制子类实现核心更新逻辑
|
||||
/// </summary>
|
||||
/// <param name="t">系统数据参数(通常是 deltaTime)</param>
|
||||
public void Update(in T t)
|
||||
{
|
||||
OnUpdate(in t);
|
||||
}
|
||||
|
||||
// ===== Arch 显式接口实现 =====
|
||||
|
||||
/// <summary>
|
||||
@ -37,16 +47,6 @@ public abstract class ArchSystemAdapter<T> : AbstractSystem, ArchSys.ISystem<T>
|
||||
OnBeforeUpdate(in t);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 显式实现 Arch.System.ISystem<T> 的主更新方法
|
||||
/// 调用受保护的虚方法 OnUpdate 以强制子类实现核心更新逻辑
|
||||
/// </summary>
|
||||
/// <param name="t">系统数据参数(通常是 deltaTime)</param>
|
||||
public void Update(in T t)
|
||||
{
|
||||
OnUpdate(in t);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 显式实现 Arch.System.ISystem<T> 的更新后回调方法
|
||||
/// 调用受保护的虚方法 OnAfterUpdate 以允许子类自定义后处理逻辑
|
||||
23
GFramework.Ecs.Arch/GFramework.Ecs.Arch.csproj
Normal file
23
GFramework.Ecs.Arch/GFramework.Ecs.Arch.csproj
Normal file
@ -0,0 +1,23 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<PackageId>GeWuYou.$(AssemblyName)</PackageId>
|
||||
<TargetFrameworks>net8.0;net9.0;net10.0</TargetFrameworks>
|
||||
<ImplicitUsings>disable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
<GenerateDocumentationFile>true</GenerateDocumentationFile>
|
||||
<GenerateAssemblyInfo>true</GenerateAssemblyInfo>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\GFramework.Core\GFramework.Core.csproj"
|
||||
PrivateAssets="all"/>
|
||||
<ProjectReference Include="..\GFramework.Ecs.Arch.Abstractions\GFramework.Ecs.Arch.Abstractions.csproj"/>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Arch" Version="2.1.0"/>
|
||||
<PackageReference Include="Arch.System" Version="1.1.0"/>
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
5
GFramework.Ecs.Arch/GlobalUsings.cs
Normal file
5
GFramework.Ecs.Arch/GlobalUsings.cs
Normal file
@ -0,0 +1,5 @@
|
||||
global using System;
|
||||
global using System.Collections.Generic;
|
||||
global using System.Threading.Tasks;
|
||||
global using GFramework.Core.Abstractions;
|
||||
global using GFramework.Ecs.Arch.Abstractions;
|
||||
170
GFramework.Ecs.Arch/README.md
Normal file
170
GFramework.Ecs.Arch/README.md
Normal file
@ -0,0 +1,170 @@
|
||||
# GFramework.Ecs.Arch
|
||||
|
||||
GFramework 的 Arch ECS 集成包,提供开箱即用的 ECS(Entity Component System)支持。
|
||||
|
||||
## 特性
|
||||
|
||||
- 🚀 **自动集成** - 引入 NuGet 包即可自动启用,无需手动配置
|
||||
- 🔌 **零依赖** - 不使用时,Core 包无 Arch 依赖
|
||||
- 🎯 **类型安全** - 完整的类型系统和编译时检查
|
||||
- ⚡ **高性能** - 基于 Arch ECS 的高性能实现
|
||||
- 🔧 **易扩展** - 简单的系统适配器模式
|
||||
|
||||
## 快速开始
|
||||
|
||||
### 1. 安装包
|
||||
|
||||
```bash
|
||||
dotnet add package GeWuYou.GFramework.Ecs.Arch
|
||||
```
|
||||
|
||||
### 2. 创建组件
|
||||
|
||||
```csharp
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public struct Position(float x, float y)
|
||||
{
|
||||
public float X { get; set; } = x;
|
||||
public float Y { get; set; } = y;
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public struct Velocity(float x, float y)
|
||||
{
|
||||
public float X { get; set; } = x;
|
||||
public float Y { get; set; } = y;
|
||||
}
|
||||
```
|
||||
|
||||
### 3. 创建系统
|
||||
|
||||
```csharp
|
||||
using Arch.Core;
|
||||
using GFramework.Ecs.Arch;
|
||||
|
||||
public sealed class MovementSystem : ArchSystemAdapter<float>
|
||||
{
|
||||
private QueryDescription _query;
|
||||
|
||||
protected override void OnArchInitialize()
|
||||
{
|
||||
_query = new QueryDescription()
|
||||
.WithAll<Position, Velocity>();
|
||||
}
|
||||
|
||||
protected override void OnUpdate(in float deltaTime)
|
||||
{
|
||||
World.Query(in _query, (ref Position pos, ref Velocity vel) =>
|
||||
{
|
||||
pos.X += vel.X * deltaTime;
|
||||
pos.Y += vel.Y * deltaTime;
|
||||
});
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 4. 注册系统
|
||||
|
||||
```csharp
|
||||
public class MyArchitecture : Architecture
|
||||
{
|
||||
protected override void OnRegisterSystem(IIocContainer container)
|
||||
{
|
||||
container.Register<MovementSystem>();
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 5. 创建实体
|
||||
|
||||
```csharp
|
||||
var world = this.GetService<World>();
|
||||
var entity = world.Create(
|
||||
new Position(0, 0),
|
||||
new Velocity(1, 1)
|
||||
);
|
||||
```
|
||||
|
||||
### 6. 更新系统
|
||||
|
||||
```csharp
|
||||
var ecsModule = this.GetService<IArchEcsModule>();
|
||||
ecsModule.Update(deltaTime);
|
||||
```
|
||||
|
||||
## 配置选项
|
||||
|
||||
可以通过配置文件或代码配置 Arch ECS:
|
||||
|
||||
### 代码配置
|
||||
|
||||
```csharp
|
||||
services.ConfigureArch(options =>
|
||||
{
|
||||
options.WorldCapacity = 2000;
|
||||
options.EnableStatistics = true;
|
||||
options.Priority = 50;
|
||||
});
|
||||
```
|
||||
|
||||
### 配置文件
|
||||
|
||||
```json
|
||||
{
|
||||
"GFramework": {
|
||||
"Modules": {
|
||||
"Arch": {
|
||||
"Enabled": true,
|
||||
"Priority": 50,
|
||||
"WorldCapacity": 1000,
|
||||
"EnableStatistics": false
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 架构说明
|
||||
|
||||
### 模块自动注册
|
||||
|
||||
本包使用 `ModuleInitializer` 特性实现自动注册,无需手动配置:
|
||||
|
||||
```csharp
|
||||
[ModuleInitializer]
|
||||
public static void Initialize()
|
||||
{
|
||||
ArchitectureModuleRegistry.Register(() => new ArchEcsModule(enabled: true));
|
||||
}
|
||||
```
|
||||
|
||||
### 系统适配器
|
||||
|
||||
`ArchSystemAdapter<T>` 桥接 Arch.System.ISystem<T> 到 GFramework 架构:
|
||||
|
||||
- 自动获取 World 实例
|
||||
- 集成到框架生命周期
|
||||
- 支持上下文感知(Context-Aware)
|
||||
|
||||
### 生命周期
|
||||
|
||||
1. **注册阶段** - 模块自动注册到架构
|
||||
2. **初始化阶段** - 创建 World,初始化系统
|
||||
3. **运行阶段** - 每帧调用 Update
|
||||
4. **销毁阶段** - 清理资源,销毁 World
|
||||
|
||||
## 示例
|
||||
|
||||
完整示例请参考 `GFramework.Ecs.Arch.Tests` 项目。
|
||||
|
||||
## 依赖
|
||||
|
||||
- GFramework.Core >= 1.0.0
|
||||
- Arch >= 2.1.0
|
||||
- Arch.System >= 1.1.0
|
||||
|
||||
## 许可证
|
||||
|
||||
MIT License
|
||||
@ -1,6 +1,6 @@
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace GFramework.Core.ecs.components;
|
||||
namespace GFramework.Ecs.Arch.components;
|
||||
|
||||
/// <summary>
|
||||
/// 位置组件,用于表示实体在二维空间中的坐标位置。
|
||||
@ -1,6 +1,6 @@
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace GFramework.Core.ecs.components;
|
||||
namespace GFramework.Ecs.Arch.components;
|
||||
|
||||
/// <summary>
|
||||
/// 速度结构体,用于表示二维空间中实体的瞬时速度向量
|
||||
34
GFramework.Ecs.Arch/extensions/ArchExtensions.cs
Normal file
34
GFramework.Ecs.Arch/extensions/ArchExtensions.cs
Normal file
@ -0,0 +1,34 @@
|
||||
using GFramework.Core.Abstractions.architecture;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
|
||||
namespace GFramework.Ecs.Arch.extensions;
|
||||
|
||||
/// <summary>
|
||||
/// Arch ECS 扩展方法
|
||||
/// </summary>
|
||||
public static class ArchExtensions
|
||||
{
|
||||
/// <summary>
|
||||
/// 配置 Arch ECS 选项
|
||||
/// </summary>
|
||||
public static IServiceCollection ConfigureArch(
|
||||
this IServiceCollection services,
|
||||
Action<ArchOptions> configure)
|
||||
{
|
||||
var options = new ArchOptions();
|
||||
configure(options);
|
||||
services.AddSingleton(options);
|
||||
return services;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 显式启用 Arch ECS 模块(备选方案)
|
||||
/// </summary>
|
||||
public static TArchitecture UseArch<TArchitecture>(this TArchitecture architecture)
|
||||
where TArchitecture : IArchitecture
|
||||
{
|
||||
// 此方法为显式注册提供支持
|
||||
// 实际注册由 ModuleInitializer 自动完成
|
||||
return architecture;
|
||||
}
|
||||
}
|
||||
@ -1,7 +1,7 @@
|
||||
using Arch.Core;
|
||||
using GFramework.Core.ecs.components;
|
||||
using GFramework.Ecs.Arch.components;
|
||||
|
||||
namespace GFramework.Core.ecs.systems;
|
||||
namespace GFramework.Ecs.Arch.systems;
|
||||
|
||||
/// <summary>
|
||||
/// 移动系统 - 继承 ArchSystemAdapter
|
||||
@ -1,9 +1,11 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFrameworks>net8.0;net10.0</TargetFrameworks>
|
||||
<ImplicitUsings>disable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
<TargetFrameworks>net10.0;net8.0</TargetFrameworks>
|
||||
<IsPackable>false</IsPackable>
|
||||
<IsTestProject>true</IsTestProject>
|
||||
</PropertyGroup>
|
||||
|
||||
|
||||
|
||||
@ -47,6 +47,9 @@
|
||||
<None Remove="GFramework.Godot.Abstractions\**"/>
|
||||
<None Remove="GFramework.Game.Abstractions\**"/>
|
||||
<None Remove="GFramework.Core.Tests\**"/>
|
||||
<None Remove="GFramework.Ecs.Arch.Tests\**"/>
|
||||
<None Remove="GFramework.Ecs.Arch\**"/>
|
||||
<None Remove="GFramework.Ecs.Arch.Abstractions\**"/>
|
||||
<None Remove="GFramework.Generator\**"/>
|
||||
<None Remove="GFramework.Generator.Attributes\**"/>
|
||||
<None Remove="GFramework.Godot.SourceGenerators.Attributes\**"/>
|
||||
@ -82,6 +85,9 @@
|
||||
<Compile Remove="GFramework.Godot.Abstractions\**"/>
|
||||
<Compile Remove="GFramework.Game.Abstractions\**"/>
|
||||
<Compile Remove="GFramework.Core.Tests\**"/>
|
||||
<Compile Remove="GFramework.Ecs.Arch.Tests\**"/>
|
||||
<Compile Remove="GFramework.Ecs.Arch\**"/>
|
||||
<Compile Remove="GFramework.Ecs.Arch.Abstractions\**"/>
|
||||
<Compile Remove="GFramework.Generator\**"/>
|
||||
<Compile Remove="GFramework.Generator.Attributes\**"/>
|
||||
<Compile Remove="GFramework.Godot.SourceGenerators.Attributes\**"/>
|
||||
@ -103,6 +109,9 @@
|
||||
<EmbeddedResource Remove="GFramework.Godot.Abstractions\**"/>
|
||||
<EmbeddedResource Remove="GFramework.Game.Abstractions\**"/>
|
||||
<EmbeddedResource Remove="GFramework.Core.Tests\**"/>
|
||||
<EmbeddedResource Remove="GFramework.Ecs.Arch.Tests\**"/>
|
||||
<EmbeddedResource Remove="GFramework.Ecs.Arch\**"/>
|
||||
<EmbeddedResource Remove="GFramework.Ecs.Arch.Abstractions\**"/>
|
||||
<EmbeddedResource Remove="GFramework.Generator\**"/>
|
||||
<EmbeddedResource Remove="GFramework.Generator.Attributes\**"/>
|
||||
<EmbeddedResource Remove="GFramework.Godot.SourceGenerators.Attributes\**"/>
|
||||
|
||||
155
GFramework.sln
155
GFramework.sln
@ -1,6 +1,6 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GFramework ", "GFramework.csproj", "{9BEDDD6C-DF8B-4E71-9C75-F44EC669ABBD}"
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GFramework", "GFramework.csproj", "{9BEDDD6C-DF8B-4E71-9C75-F44EC669ABBD}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GFramework.SourceGenerators", "GFramework.SourceGenerators\GFramework.SourceGenerators.csproj", "{E9D51809-0351-4B83-B85B-B5F469AAB3B8}"
|
||||
EndProject
|
||||
@ -26,63 +26,216 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GFramework.Game.Abstraction
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GFramework.Core.Tests", "GFramework.Core.Tests\GFramework.Core.Tests.csproj", "{759BCD95-A9D9-4D8F-9255-A9F1B661DF74}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GFramework.Ecs.Arch.Abstractions", "GFramework.Ecs.Arch.Abstractions\GFramework.Ecs.Arch.Abstractions.csproj", "{5E1488B2-6554-408D-83FB-EB2FFFABF545}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GFramework.Ecs.Arch", "GFramework.Ecs.Arch\GFramework.Ecs.Arch.csproj", "{E9B49EE9-25BC-47C1-83CE-92F636B9D491}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GFramework.Ecs.Arch.Tests", "GFramework.Ecs.Arch.Tests\GFramework.Ecs.Arch.Tests.csproj", "{112CF413-4596-4AA3-B3FE-65532802FDD6}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Debug|x64 = Debug|x64
|
||||
Debug|x86 = Debug|x86
|
||||
Release|Any CPU = Release|Any CPU
|
||||
Release|x64 = Release|x64
|
||||
Release|x86 = Release|x86
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{9BEDDD6C-DF8B-4E71-9C75-F44EC669ABBD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{9BEDDD6C-DF8B-4E71-9C75-F44EC669ABBD}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{9BEDDD6C-DF8B-4E71-9C75-F44EC669ABBD}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{9BEDDD6C-DF8B-4E71-9C75-F44EC669ABBD}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{9BEDDD6C-DF8B-4E71-9C75-F44EC669ABBD}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{9BEDDD6C-DF8B-4E71-9C75-F44EC669ABBD}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{9BEDDD6C-DF8B-4E71-9C75-F44EC669ABBD}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{9BEDDD6C-DF8B-4E71-9C75-F44EC669ABBD}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{9BEDDD6C-DF8B-4E71-9C75-F44EC669ABBD}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{9BEDDD6C-DF8B-4E71-9C75-F44EC669ABBD}.Release|x64.Build.0 = Release|Any CPU
|
||||
{9BEDDD6C-DF8B-4E71-9C75-F44EC669ABBD}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{9BEDDD6C-DF8B-4E71-9C75-F44EC669ABBD}.Release|x86.Build.0 = Release|Any CPU
|
||||
{E9D51809-0351-4B83-B85B-B5F469AAB3B8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{E9D51809-0351-4B83-B85B-B5F469AAB3B8}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{E9D51809-0351-4B83-B85B-B5F469AAB3B8}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{E9D51809-0351-4B83-B85B-B5F469AAB3B8}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{E9D51809-0351-4B83-B85B-B5F469AAB3B8}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{E9D51809-0351-4B83-B85B-B5F469AAB3B8}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{E9D51809-0351-4B83-B85B-B5F469AAB3B8}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{E9D51809-0351-4B83-B85B-B5F469AAB3B8}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{E9D51809-0351-4B83-B85B-B5F469AAB3B8}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{E9D51809-0351-4B83-B85B-B5F469AAB3B8}.Release|x64.Build.0 = Release|Any CPU
|
||||
{E9D51809-0351-4B83-B85B-B5F469AAB3B8}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{E9D51809-0351-4B83-B85B-B5F469AAB3B8}.Release|x86.Build.0 = Release|Any CPU
|
||||
{84C5C3C9-5620-4924-BA04-92F813F2B70F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{84C5C3C9-5620-4924-BA04-92F813F2B70F}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{84C5C3C9-5620-4924-BA04-92F813F2B70F}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{84C5C3C9-5620-4924-BA04-92F813F2B70F}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{84C5C3C9-5620-4924-BA04-92F813F2B70F}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{84C5C3C9-5620-4924-BA04-92F813F2B70F}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{84C5C3C9-5620-4924-BA04-92F813F2B70F}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{84C5C3C9-5620-4924-BA04-92F813F2B70F}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{84C5C3C9-5620-4924-BA04-92F813F2B70F}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{84C5C3C9-5620-4924-BA04-92F813F2B70F}.Release|x64.Build.0 = Release|Any CPU
|
||||
{84C5C3C9-5620-4924-BA04-92F813F2B70F}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{84C5C3C9-5620-4924-BA04-92F813F2B70F}.Release|x86.Build.0 = Release|Any CPU
|
||||
{A6D5854D-79EA-487A-9ED9-396E6A1F8031}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{A6D5854D-79EA-487A-9ED9-396E6A1F8031}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{A6D5854D-79EA-487A-9ED9-396E6A1F8031}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{A6D5854D-79EA-487A-9ED9-396E6A1F8031}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{A6D5854D-79EA-487A-9ED9-396E6A1F8031}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{A6D5854D-79EA-487A-9ED9-396E6A1F8031}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{A6D5854D-79EA-487A-9ED9-396E6A1F8031}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{A6D5854D-79EA-487A-9ED9-396E6A1F8031}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{A6D5854D-79EA-487A-9ED9-396E6A1F8031}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{A6D5854D-79EA-487A-9ED9-396E6A1F8031}.Release|x64.Build.0 = Release|Any CPU
|
||||
{A6D5854D-79EA-487A-9ED9-396E6A1F8031}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{A6D5854D-79EA-487A-9ED9-396E6A1F8031}.Release|x86.Build.0 = Release|Any CPU
|
||||
{FC56D81A-3A3B-4B49-B318-363DFA0D8206}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{FC56D81A-3A3B-4B49-B318-363DFA0D8206}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{FC56D81A-3A3B-4B49-B318-363DFA0D8206}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{FC56D81A-3A3B-4B49-B318-363DFA0D8206}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{FC56D81A-3A3B-4B49-B318-363DFA0D8206}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{FC56D81A-3A3B-4B49-B318-363DFA0D8206}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{FC56D81A-3A3B-4B49-B318-363DFA0D8206}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{FC56D81A-3A3B-4B49-B318-363DFA0D8206}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{FC56D81A-3A3B-4B49-B318-363DFA0D8206}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{FC56D81A-3A3B-4B49-B318-363DFA0D8206}.Release|x64.Build.0 = Release|Any CPU
|
||||
{FC56D81A-3A3B-4B49-B318-363DFA0D8206}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{FC56D81A-3A3B-4B49-B318-363DFA0D8206}.Release|x86.Build.0 = Release|Any CPU
|
||||
{0B00816B-E8B2-4562-8C11-0C06CE761638}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{0B00816B-E8B2-4562-8C11-0C06CE761638}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{0B00816B-E8B2-4562-8C11-0C06CE761638}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{0B00816B-E8B2-4562-8C11-0C06CE761638}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{0B00816B-E8B2-4562-8C11-0C06CE761638}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{0B00816B-E8B2-4562-8C11-0C06CE761638}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{0B00816B-E8B2-4562-8C11-0C06CE761638}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{0B00816B-E8B2-4562-8C11-0C06CE761638}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{0B00816B-E8B2-4562-8C11-0C06CE761638}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{0B00816B-E8B2-4562-8C11-0C06CE761638}.Release|x64.Build.0 = Release|Any CPU
|
||||
{0B00816B-E8B2-4562-8C11-0C06CE761638}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{0B00816B-E8B2-4562-8C11-0C06CE761638}.Release|x86.Build.0 = Release|Any CPU
|
||||
{C56FD287-CBC6-4C44-B3DF-103FA3660CA0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{C56FD287-CBC6-4C44-B3DF-103FA3660CA0}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{C56FD287-CBC6-4C44-B3DF-103FA3660CA0}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{C56FD287-CBC6-4C44-B3DF-103FA3660CA0}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{C56FD287-CBC6-4C44-B3DF-103FA3660CA0}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{C56FD287-CBC6-4C44-B3DF-103FA3660CA0}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{C56FD287-CBC6-4C44-B3DF-103FA3660CA0}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{C56FD287-CBC6-4C44-B3DF-103FA3660CA0}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{C56FD287-CBC6-4C44-B3DF-103FA3660CA0}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{C56FD287-CBC6-4C44-B3DF-103FA3660CA0}.Release|x64.Build.0 = Release|Any CPU
|
||||
{C56FD287-CBC6-4C44-B3DF-103FA3660CA0}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{C56FD287-CBC6-4C44-B3DF-103FA3660CA0}.Release|x86.Build.0 = Release|Any CPU
|
||||
{3A1132B7-EC3B-4BB6-A752-8ADC92BC08A0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{3A1132B7-EC3B-4BB6-A752-8ADC92BC08A0}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{3A1132B7-EC3B-4BB6-A752-8ADC92BC08A0}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{3A1132B7-EC3B-4BB6-A752-8ADC92BC08A0}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{3A1132B7-EC3B-4BB6-A752-8ADC92BC08A0}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{3A1132B7-EC3B-4BB6-A752-8ADC92BC08A0}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{3A1132B7-EC3B-4BB6-A752-8ADC92BC08A0}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{3A1132B7-EC3B-4BB6-A752-8ADC92BC08A0}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{3A1132B7-EC3B-4BB6-A752-8ADC92BC08A0}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{3A1132B7-EC3B-4BB6-A752-8ADC92BC08A0}.Release|x64.Build.0 = Release|Any CPU
|
||||
{3A1132B7-EC3B-4BB6-A752-8ADC92BC08A0}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{3A1132B7-EC3B-4BB6-A752-8ADC92BC08A0}.Release|x86.Build.0 = Release|Any CPU
|
||||
{BB047F43-6AA0-4EA0-8AE9-E6B9784D9E8E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{BB047F43-6AA0-4EA0-8AE9-E6B9784D9E8E}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{BB047F43-6AA0-4EA0-8AE9-E6B9784D9E8E}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{BB047F43-6AA0-4EA0-8AE9-E6B9784D9E8E}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{BB047F43-6AA0-4EA0-8AE9-E6B9784D9E8E}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{BB047F43-6AA0-4EA0-8AE9-E6B9784D9E8E}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{BB047F43-6AA0-4EA0-8AE9-E6B9784D9E8E}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{BB047F43-6AA0-4EA0-8AE9-E6B9784D9E8E}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{BB047F43-6AA0-4EA0-8AE9-E6B9784D9E8E}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{BB047F43-6AA0-4EA0-8AE9-E6B9784D9E8E}.Release|x64.Build.0 = Release|Any CPU
|
||||
{BB047F43-6AA0-4EA0-8AE9-E6B9784D9E8E}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{BB047F43-6AA0-4EA0-8AE9-E6B9784D9E8E}.Release|x86.Build.0 = Release|Any CPU
|
||||
{B6511C9A-40E1-4E51-8D1F-18EAFB3C5BFC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{B6511C9A-40E1-4E51-8D1F-18EAFB3C5BFC}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{B6511C9A-40E1-4E51-8D1F-18EAFB3C5BFC}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{B6511C9A-40E1-4E51-8D1F-18EAFB3C5BFC}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{B6511C9A-40E1-4E51-8D1F-18EAFB3C5BFC}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{B6511C9A-40E1-4E51-8D1F-18EAFB3C5BFC}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{B6511C9A-40E1-4E51-8D1F-18EAFB3C5BFC}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{B6511C9A-40E1-4E51-8D1F-18EAFB3C5BFC}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{B6511C9A-40E1-4E51-8D1F-18EAFB3C5BFC}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{B6511C9A-40E1-4E51-8D1F-18EAFB3C5BFC}.Release|x64.Build.0 = Release|Any CPU
|
||||
{B6511C9A-40E1-4E51-8D1F-18EAFB3C5BFC}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{B6511C9A-40E1-4E51-8D1F-18EAFB3C5BFC}.Release|x86.Build.0 = Release|Any CPU
|
||||
{31BA9F62-153A-4943-A8A0-7571FC7D5FEE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{31BA9F62-153A-4943-A8A0-7571FC7D5FEE}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{31BA9F62-153A-4943-A8A0-7571FC7D5FEE}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{31BA9F62-153A-4943-A8A0-7571FC7D5FEE}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{31BA9F62-153A-4943-A8A0-7571FC7D5FEE}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{31BA9F62-153A-4943-A8A0-7571FC7D5FEE}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{31BA9F62-153A-4943-A8A0-7571FC7D5FEE}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{31BA9F62-153A-4943-A8A0-7571FC7D5FEE}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{31BA9F62-153A-4943-A8A0-7571FC7D5FEE}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{31BA9F62-153A-4943-A8A0-7571FC7D5FEE}.Release|x64.Build.0 = Release|Any CPU
|
||||
{31BA9F62-153A-4943-A8A0-7571FC7D5FEE}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{31BA9F62-153A-4943-A8A0-7571FC7D5FEE}.Release|x86.Build.0 = Release|Any CPU
|
||||
{E20DBA4C-CEB9-4184-B614-5A99A9AE4472}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{E20DBA4C-CEB9-4184-B614-5A99A9AE4472}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{E20DBA4C-CEB9-4184-B614-5A99A9AE4472}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{E20DBA4C-CEB9-4184-B614-5A99A9AE4472}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{E20DBA4C-CEB9-4184-B614-5A99A9AE4472}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{E20DBA4C-CEB9-4184-B614-5A99A9AE4472}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{E20DBA4C-CEB9-4184-B614-5A99A9AE4472}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{E20DBA4C-CEB9-4184-B614-5A99A9AE4472}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{E20DBA4C-CEB9-4184-B614-5A99A9AE4472}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{E20DBA4C-CEB9-4184-B614-5A99A9AE4472}.Release|x64.Build.0 = Release|Any CPU
|
||||
{E20DBA4C-CEB9-4184-B614-5A99A9AE4472}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{E20DBA4C-CEB9-4184-B614-5A99A9AE4472}.Release|x86.Build.0 = Release|Any CPU
|
||||
{759BCD95-A9D9-4D8F-9255-A9F1B661DF74}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{759BCD95-A9D9-4D8F-9255-A9F1B661DF74}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{759BCD95-A9D9-4D8F-9255-A9F1B661DF74}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{759BCD95-A9D9-4D8F-9255-A9F1B661DF74}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{759BCD95-A9D9-4D8F-9255-A9F1B661DF74}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{759BCD95-A9D9-4D8F-9255-A9F1B661DF74}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{759BCD95-A9D9-4D8F-9255-A9F1B661DF74}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{759BCD95-A9D9-4D8F-9255-A9F1B661DF74}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{759BCD95-A9D9-4D8F-9255-A9F1B661DF74}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{759BCD95-A9D9-4D8F-9255-A9F1B661DF74}.Release|x64.Build.0 = Release|Any CPU
|
||||
{759BCD95-A9D9-4D8F-9255-A9F1B661DF74}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{759BCD95-A9D9-4D8F-9255-A9F1B661DF74}.Release|x86.Build.0 = Release|Any CPU
|
||||
{5E1488B2-6554-408D-83FB-EB2FFFABF545}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{5E1488B2-6554-408D-83FB-EB2FFFABF545}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{5E1488B2-6554-408D-83FB-EB2FFFABF545}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{5E1488B2-6554-408D-83FB-EB2FFFABF545}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{5E1488B2-6554-408D-83FB-EB2FFFABF545}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{5E1488B2-6554-408D-83FB-EB2FFFABF545}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{5E1488B2-6554-408D-83FB-EB2FFFABF545}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{5E1488B2-6554-408D-83FB-EB2FFFABF545}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{5E1488B2-6554-408D-83FB-EB2FFFABF545}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{5E1488B2-6554-408D-83FB-EB2FFFABF545}.Release|x64.Build.0 = Release|Any CPU
|
||||
{5E1488B2-6554-408D-83FB-EB2FFFABF545}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{5E1488B2-6554-408D-83FB-EB2FFFABF545}.Release|x86.Build.0 = Release|Any CPU
|
||||
{E9B49EE9-25BC-47C1-83CE-92F636B9D491}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{E9B49EE9-25BC-47C1-83CE-92F636B9D491}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{E9B49EE9-25BC-47C1-83CE-92F636B9D491}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{E9B49EE9-25BC-47C1-83CE-92F636B9D491}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{E9B49EE9-25BC-47C1-83CE-92F636B9D491}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{E9B49EE9-25BC-47C1-83CE-92F636B9D491}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{E9B49EE9-25BC-47C1-83CE-92F636B9D491}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{E9B49EE9-25BC-47C1-83CE-92F636B9D491}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{E9B49EE9-25BC-47C1-83CE-92F636B9D491}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{E9B49EE9-25BC-47C1-83CE-92F636B9D491}.Release|x64.Build.0 = Release|Any CPU
|
||||
{E9B49EE9-25BC-47C1-83CE-92F636B9D491}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{E9B49EE9-25BC-47C1-83CE-92F636B9D491}.Release|x86.Build.0 = Release|Any CPU
|
||||
{112CF413-4596-4AA3-B3FE-65532802FDD6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{112CF413-4596-4AA3-B3FE-65532802FDD6}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{112CF413-4596-4AA3-B3FE-65532802FDD6}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{112CF413-4596-4AA3-B3FE-65532802FDD6}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{112CF413-4596-4AA3-B3FE-65532802FDD6}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{112CF413-4596-4AA3-B3FE-65532802FDD6}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{112CF413-4596-4AA3-B3FE-65532802FDD6}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{112CF413-4596-4AA3-B3FE-65532802FDD6}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{112CF413-4596-4AA3-B3FE-65532802FDD6}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{112CF413-4596-4AA3-B3FE-65532802FDD6}.Release|x64.Build.0 = Release|Any CPU
|
||||
{112CF413-4596-4AA3-B3FE-65532802FDD6}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{112CF413-4596-4AA3-B3FE-65532802FDD6}.Release|x86.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user