Açıklama Yok

wuzj e13ca9894b 更新 2 ay önce
README.md e13ca9894b 更新 2 ay önce

README.md

InJoyLab ├── Config # 配置文件目录:存放 JSON/CSV 配置文件 │ ├── LBERoom # 大空间房间配置文件目录 │ │ ├── SIPSG.json # 示例:SIPSG这个空间的房间配置文件 │ │ └── Gusu.json # 示例:Gusu这个空间的房间配置文件 │ ├── EventTable # 策划事件 │ │ ├── TigerHill.json # 示例:虎丘秘境策划表 │ │ └── Gusu.json # 示例:姑苏繁华策划表 │ ├── MovePath # 动线配置 │ │ ├── SIPSG.json # 示例:SIPSG这个空间的动线 │ │ └── Gusu.json # 示例:Gusu这个空间的动线 │ ├── Boundary # 引导边界 │ │ ├── TigerHill.json # 示例:虎丘秘境引导边界配置 │ │ └── Gusu.json # 示例:姑苏繁华引导边界配置 │ └── Global │ │ └── Global.ini # 示例:全局配置 ├── Content # 插件内置资源目录:存放插件自带的素材或UI资源 │ ├── UI # 工具界面的图标或样式资源 │ │ └── Icon128.png # 示例:图标资源 │ └── ... ├── Source # 源代码目录 │ ├── InJoyLab # 插件的主模块 │ │ ├── InJoyLab.Build.cs # 插件的构建脚本 │ │ ├── Public # 公共头文件:模块接口、配置管理等 │ │ │ ├── Core # 核心框架:模块管理器、模块基类 │ │ │ │ ├── EventSystem │ │ │ │ │ ├── IEventSystem.h │ │ │ │ │ └── EventSystem.h │ │ │ │ ├── MetaverseGameInstance.h │ │ │ │ ├── ModuleBase.h # 模块基类接口,用于定义模块的通用行为 │ │ │ │ ├── ModuleManager.h # 模块管理器,负责模块的注册和生命周期管理 │ │ │ │ ├── ConfigManager.h # 配置管理器,加载和解析 JSON/CSV 文件 │ │ │ │ ├── NetworkManager.h # 网络管理器,负责网络通讯 │ │ │ │ └── LogManager.h # 日志管理器,集中管理日志输出与记录 │ │ │ │ └── ... │ │ │ ├── Config │ │ │ │ ├── JsonConfigParser.h # 解析 json config │ │ │ │ ├── IniConfigParser.h # 解析 ini config │ │ │ │ └── CSVConfigParser.h # 解析 csv config │ │ │ ├── Interfaces # 独立的接口目录 │ │ │ │ ├── IConfigParser.h # 配置类接口 │ │ │ │ ├── IModuleBase.h # 模块类接口 │ │ │ │ └── ... │ │ │ ├── Modules # 模块化设计:所有功能分为独立模块,通过模块管理器统一管理,支持动态扩展。 │ │ │ │ ├── RoomModule.h # 房间管理模块,负责物理房间与虚拟房间的映射 │ │ │ │ ├── SceneModule.h # 场景管理模块,使用 PAK 动态加载场景资源 │ │ │ │ ├── BoundaryModule.h # 引导边界模块,生成用户的移动引导区域 │ │ │ │ ├── SyncModule.h # 多人同步模块,实时同步用户信息,由单独的数据结构维护 │ │ │ │ ├── InteractionModule.h # 交互模块,提供动态交互逻辑 │ │ │ │ ├── StatisticsModule.h # 记录模块,记录正常运行、宕机、中断次数等 │ │ │ │ ├── LeaderboardModule.h # 排行榜模块 │ │ │ │ ├── LauncherModule.h # 启动器模块,负责故事下载和动态加载 │ │ │ │ └── ... │ │ │ ├── Utilities/ # 工具类 │ │ │ │ ├── Logging # 日志工具 │ │ │ │ │ ├── ILogger.h │ │ │ │ │ ├── LogManager.h │ │ │ │ │ └── ... │ │ │ │ ├── JsonUtils.h │ │ │ │ ├── FileUtils.h │ │ │ │ ├── ProtoConverter.h # Protobuf转换工具 │ │ │ │ └── ... │ ├── InJoyLab_Editor # 插件的 Editor 模块:用于工具界面和可视化支持 │ │ ├── InJoyLabEditor.Build.cs # Editor 模块的构建脚本 │ │ ├── Public │ │ │ └── UI │ │ │ ├── PAKToolUI.h # PAK 打包工具的界面支持,为美术提供资源打包支持。 │ │ │ ├── SequenceToolUI.h # Sequence配置工具,为策划提供时间轴逻辑配置支持,如在Seq编辑完后导出EventTable CSV配置表 │ │ │ └── InteractionToolUI.h # 交互配置工具的界面支持,为策划提供交互逻辑可视化配置。 │ ├── InJoyLab_AI/ # 预留AI模块 │ └── InJoyLab_Physics/ # 预留高级物理模块 ├── Resources # 插件的描述文件和图标 │ ├── Icon128.png # 插件图标 │ └── InJoyLab.uplugin # 插件描述文件,定义插件元数据

  1. 系统入口类 // 继承自UGameInstance,作为系统总控 UCLASS() class UMetaverseGameInstance : public UGameInstance { GENERATED_BODY()

public:

// 模块注册表
UPROPERTY()
TMap<FName, UMetaverseModule*> ActiveModules;

// 初始化所有模块
virtual void OnStart() override;

};

  1. 模块管理系统 // ModuleBase.h #pragma once

#include "CoreMinimal.h"

// 模块接口 class IMetaverseModule { public:

virtual ~IMetaverseModule() {}

virtual void Initialize() = 0; // 初始化
virtual void Shutdown() = 0;   // 销毁
virtual FString GetModuleName() const = 0; // 获取模块名称

};

// 模块基类 class FMetaverseModuleBase : public IMetaverseModule { public:

virtual void Initialize() override {}
virtual void Shutdown() override {}
virtual FString GetModuleName() const override { return TEXT("BaseModule"); }

};

// 模块基类(抽象接口) UCLASS(Abstract) class IModuleBase : public UObject {

GENERATED_BODY()

public:

virtual void InitializeModule() PURE_VIRTUAL(UModuleBase::InitializeModule);
virtual void ShutdownModule() PURE_VIRTUAL(UModuleBase::ShutdownModule);
virtual FString GetModuleName() const = 0; // 获取模块名称

};

// 模块管理器 UCLASS() class FMetaverseModuleManager{

GENERATED_BODY()

TMap<FName, TSubclassOf<UModuleBase>> RegisteredModules;

template<typename T>
void RegisterModule(FName ModuleName) {
    RegisteredModules.Add(ModuleName, T::StaticClass());
}

void UnregisterAllModules();
TSharedPtr<IMetaverseModule> GetModule(const FString& ModuleName);

// 模板函数:直接获取特定模块的类型
template <typename T>
TSharedPtr<T> GetModuleAs(const FString& ModuleName)
{
    TSharedPtr<IMetaverseModule> BaseModule = GetModule(ModuleName);
    return StaticCastSharedPtr<T>(BaseModule);
}

};

  1. 网络层改造 // 网络管理器(支持双协议) UCLASS() class METAVERSE_STUDIO_API UNetworkManager : public UObject { GENERATED_BODY()

    // UDP快速通道 void SendUdpDatagram(const TArray& Data);

    // TCP可靠通道 void EnqueueTcpPacket(const FMetaversePacket& Packet);

  2. private:

    FSocket* UdpSocket;
    FSocket* TcpSocket;
    FRunnableThread* TcpWorkerThread;
    
    // Protobuf序列化工具
    TSharedPtr<FProtoSerializer> ProtoSerializer;
    

    };

    1. 配置管理器,config作为模板,运行时拷贝 #include "Misc/Paths.h" #include "HAL/FileManager.h" #include "Misc/FileHelper.h"

    void CopyDefaultConfigIfNeeded() {

    // 插件默认配置路径
    FString DefaultConfigPath = FPaths::Combine(FPaths::ProjectPluginsDir(), TEXT("Metaverse_Studio/Config/"));
    
    // 游戏运行目录下的配置路径
    FString RuntimeConfigPath = FPaths::Combine(FPaths::ProjectSavedDir(), TEXT("Config/Metaverse_Studio/"));
    
    // 确保运行目录存在
    IFileManager::Get().MakeDirectory(*RuntimeConfigPath, true);
    
    // 遍历插件目录中的默认配置文件
    TArray<FString> ConfigFiles;
    IFileManager::Get().FindFiles(ConfigFiles, *DefaultConfigPath, TEXT("*.json"));
    
    for (const FString& ConfigFile : ConfigFiles)
    {
        FString DefaultFilePath = FPaths::Combine(DefaultConfigPath, ConfigFile);
        FString RuntimeFilePath = FPaths::Combine(RuntimeConfigPath, ConfigFile);
    
        // 如果运行目录中不存在该配置文件,则复制
        if (!FPaths::FileExists(RuntimeFilePath))
        {
            FFileHelper::CopyFile(*RuntimeFilePath, *DefaultFilePath);
        }
    }
    

    }

    全局配置 - ini 逻辑配置 - json 策划配置 - csv