ITADN
alandtse/CommonLibVR
README.md
以下内容由 AI 翻译,如有问题请点此提交 issue 反馈

CommonLibSSE NG

C++23 Platform License: GPL-3.0-or-later Latest Release Main CI Ask DeepWiki

CommonLibSSE NG 是 CharmedBaryon 的 CommonLibSSE-NG 的分支,而 CommonLibSSE-NG 本身又是 CommonLibSSE 的分支,它跟踪上游更新,但增加了一些增强功能。 它支持 Skyrim Special Edition (SE)、Skyrim Anniversary Edition (AE) 和 Skyrim Virtual Reality (VR)。

用法

要开发一个使用 CommonLibSSE 的 C++ 项目,你需要让此代码可供发现,并由你的构建管理器作为构建依赖项包含。以下是使用 xmakecmake 管理器的示例。

[!TIP] 示例和模板请参见 wiki:https://github.com/alandtse/CommonLibSSE-NG/wiki/Projects-using-CommonLib

获取代码:Git 子模块

假设你有一个包含模组素材的文件夹,可以将其转换为 git 仓库,以便将此仓库作为子模块添加, 让 git 管理更新、路径、名称、版本…… 为此:

使用文件夹 初始化一个 git 仓库

PS E:\Git\foo-bar> git init
Initialized empty Git repository in E:/Git/foo-bar/.git/

将此 CommonLibSSE 仓库添加为 git submodule,指定 ng 分支, 并将其存储在 lib/commonlibsse-ng 文件夹中:

PS E:\Git\foo-bar> git submodule add -b ng https://github.com/alandtse/CommonLibSSE-NG.git lib/commonlibsse-ng
Cloning into 'E:/Git/foo-bar/lib/commonlibsse-ng'...
remote: Enumerating objects: 66210, done.
remote: Counting objects: 100% (2526/2526), done.
remote: Compressing objects: 100% (197/197), done.
remote: Total 66210 (delta 2397), reused 2335 (delta 2329), pack-reused 63684 (from 1)
Receiving objects: 100% (66210/66210), 18.99 MiB | 19.58 MiB/s, done.
Resolving deltas: 100% (51252/51252), done.
PS E:\Git\foo-bar

[!TIP] 如果你的子模块最终位于其他代码无法找到的位置,你可以移除并重新添加子模块,参见 https://stackoverflow.com/a/1260982

此时,git 正在跟踪你机器上代码的更改。你可以添加一个基于云端的远程仓库用于备份、分发或协作;相关说明请参见 GitHubCodeBerg

要更新你项目的子模块,你可以使用:

PS E:\Git\foo-bar> git submodule update --init --recursive

构建依赖:Xmake

如果使用 Xmake 构建系统,你可以通过在 DLL 目标配方中添加以下内容,来添加一个构建依赖项和一个适用于 SKSE 插件的自定义规则:

target("my_plugin")
   set_kind("shared")                         --specifies this is a DLL
   add_deps("commonlibsse-ng")                --adds the dependency

   add_rules("commonlibsse-ng.plugin", {      --adds a custom build rule, whose details are in CommonLibSSE
      name = "my_plugin",
      author = "Dovahkiin",
      description = "SKSE64 plugin using CommonLibSSE-NG"
   })

构建依赖:CMake

如果使用 CMake 构建系统,你可以在 CMakeLists.txt 中添加以下内容以成功编译和链接:

find_package(CommonLibSSE REQUIRED)
target_link_libraries(${PROJECT_NAME} PUBLIC CommonLibSSE::CommonLibSSE)

新功能

多个运行时目标

stability

CommonLibSSE NG 支持 Skyrim SE、AE 和 VR,并能够为这些运行时的任意组合创建构建,包括全部三种。这使得使用单个 DLL 创建可在任何 Skyrim 运行时中工作的 SKSE 插件成为可能,从而提高了开发者的生产力(只需一次构建和一个 CMake 预设)并改善了最终用户体验(无需在多个下载选项中进行选择,或从 FOMOD 中选择正确的 DLL)。对于 Skyrim AE,单个 DLL 同时支持 1.6.629 之前的版本和之后的版本(两种结构布局均受支持)。

针对多个 ABI 不兼容运行时的构建提供了必要的(但最少的)抽象,以便无论使用哪个 Skyrim 版本都能透明地工作。所有运行时的所有功能和类始终可用于潜在使用,并具备探测可用功能所需的必要支持。这允许单个插件动态地改变其行为,以利用特定 Skyrim 版本的特定功能(例如 VR 功能),当该运行时存在时。

阅读关于多目标的内容,以及如何在您的项目中利用它。

简化的插件声明

stability

历史上,插件需要定义 SKSEPlugin_VersionSKSEPlugin_Query 才能被检测为 SKSE 插件。为了 简化代码并确保为正确的跨运行时兼容性生成这两个函数,这在 CommonLibSSE NG 中已实现无代码化。只需在 CMakeLists.txt 中将 add_library 替换为 add_commonlibsse_plugin,CMake 就会创建 你的共享库目标,配置 CommonLibSSE 链接,并自动生成此内容并将其注入到 插件中。

find_package(CommonLibSSE REQUIRED)

add_commonlibsse_plugin(${PROJECT_NAME}
    SOURCES ${headers} ${sources})

在 项目 wiki 上阅读更多。

Clang 支持

stability-beta

当为 MSVC ABI 兼容性构建时(为 Windows 原生构建的版本),支持 Clang 13.x 及更高版本。在适当的配置下,甚至理论上可以从 Linux 主机使用 Clang 进行交叉编译(此功能的测试和说明尚待提供)。请注意,目前链接仍必须使用 Microsoft 链接器,因为 SKSE 本身的修复工作尚在进行中。

在 项目 wiki 上阅读更多。

单元测试增强

stability-stable

对访问 Skyrim 可执行模块的方式进行了改进,以便进行内存重定位和处理地址库 ID。这使得在 Skyrim 进程上下文之外运行基于 CommonLibSSE 的插件代码变得更加容易,从而可以进行单元测试。甚至可以通过在测试期间以编程方式加载 Skyrim 可执行模块来处理引擎的最小级别功能,例如,允许在单个测试套件中运行在 SE、AE 和 VR 可执行文件之间变化的测试。

阅读项目 wiki 上的更多内容。

通过 Vcpkg 和 Conan 获取的旧版本

[!WARNING] 这些不属于此仓库,目前也未得到维护。

CommonLibSSE 的旧版本,特别是 CharmedByron 的版本,(曾经)可作为 vcpkg 端口Conan 包 获取。这些不作为此项目的一部分进行维护。

查看如何在您的项目中使用 CommonLibSSE NG。

Ninja 构建

stability-stable

CommonLibSSE NG 将构建系统迁移到 Ninja,从而实现了比 NMake 更快的并行构建。

其他更改

  • 能够为仅存在于部分运行时中的对象定义偏移量和地址 ID,同时在使用这些偏移量之前能够动态测试功能支持。
  • 完全重新生成的 RTTI 和 vtable 偏移量,现在在所有运行时中具有一致的命名和访问方式。
  • 更新了 GitHub Actions CI 工作流,以构建所有可能的目标运行时组合。
  • 完全可扩展的原生函数绑定特性(支持在 Fully Dynamic Game Engine) 中自定义脚本对象绑定。
  • 对 CLion IDE 的更好支持。

构建依赖

依赖项通过 vcpkg 进行管理。完整列表请参阅 vcpkg.json

Core Dependencies:

Build Tools:

最终用户依赖

开发

备注

  • CommonLib 与 SKSE 不兼容,旨在作为静态依赖项取代它。然而,您仍然需要运行时组件。

许可证

GPL-3.0-or-later 附带 Modding Exception AND GPL-3.0 Linking Exception (with Corresponding Source)。 具体而言,Modded Code 包括:

Modding Libraries 包括:

[!IMPORTANT] 这是相对于之前 MIT 许可证的重大变更。Modding Exception 仅涵盖与 Skyrim 本身以及专有硬件 SDK(如 DLSS/Streamline 或 FSR3)的互操作性,这些 SDK 既非我们 也非插件作者有权重新授权——它涵盖插件/模组代码。静态链接 CommonLibSSE NG 的插件 与其构成结合作品,且必须本身以 GPL-3.0-or-later(或兼容 GPL 的 许可证)进行授权;请参阅 EXCEPTIONS.md 了解确切条款。

最初基于 MIT 下的代码。