国产开源游戏引擎Doriax实测:C++/Lua架构与Unity/Godot对比
这次我们来看一个国产开源游戏引擎——Doriax。对于习惯了 Unity 或 Godot 的开发者来说Doriax 提供了一个全新的、可能更“顺手”的选择。它主打 C 核心与 Lua 脚本的灵活组合同时支持 2D 和 3D 游戏开发。这篇文章不聊虚的直接带你上手实测看看它到底能不能用、怎么用以及是否真的能在某些场景下替代你手头的工具。Doriax 最吸引人的点在于其“国产味”的设计哲学这可能意味着更符合中文开发者的思维习惯和文档支持。它的核心是 C 高性能底层同时通过 Lua 提供灵活的脚本化开发体验这种架构在追求性能与开发效率平衡的项目中很有优势。本文将重点拆解 Doriax 的安装部署、核心功能验证、与 Unity/Godot 的关键差异点以及在实际小游戏项目中的开发流程。无论你是想寻找 Unity 的轻量替代品还是对 C/Lua 技术栈感兴趣这篇文章都能提供直接的参考。1. 核心能力速览在深入代码之前我们先快速浏览一下 Doriax 的核心规格这能帮你快速判断它是否适合你的项目。能力项说明项目类型开源游戏引擎主要语言C (核心引擎), Lua (脚本逻辑)图形支持2D 3D 渲染脚本系统内置 Lua 虚拟机支持热重载开发体验强调“顺手”可能包含更符合中文习惯的 API 命名和文档目标平台Windows, Linux, macOS (需根据源码编译确认)资源管理不确定需实测验证纹理、音频、场景文件的加载方式物理引擎不确定是否集成或需第三方库UI 系统不确定需实测验证网络模块不确定需实测验证打包发布不确定需实测验证可执行文件生成流程适合场景中小型 2D/3D 游戏、原型快速验证、C/Lua 技术栈学习、寻求 Unity/Godot 之外的开源选择从上表可以看出Doriax 的明确优势在于 C 与 Lua 的结合以及其“国产味”可能带来的体验优化。但许多高级功能如物理、网络、跨平台发布需要实际测试才能确认。接下来我们就从零开始搭建环境并验证这些能力。2. 适用场景与使用边界在决定投入时间学习 Doriax 之前明确它的适用场景和边界至关重要。Doriax 可能适合你如果你熟悉或希望深入学习 C 和 LuaDoriax 的架构让你能深入引擎底层同时用 Lua 快速构建游戏逻辑是学习游戏引擎原理和脚本系统设计的优秀平台。你在开发中小型 2D 或轻量 3D 游戏对于不需要 Unity 或 Unreal 那种重型工具链和庞大资源库的项目一个轻量、专注的引擎可能更高效。你对 Unity 或 Godot 的某些工作流感到不适也许你希望更底层的控制或者更喜欢 Lua 的简洁。Doriax 提供了另一种范式。你正在寻找一个纯粹的开源替代方案用于教育、研究或完全自主可控的商业项目。你希望引擎 API 和文档更符合中文思维“国产味”可能体现在更直观的 API 命名、中文注释或社区支持上。Doriax 可能不适合当前需求如果你的项目严重依赖成熟的 Asset Store 或大量第三方插件新兴引擎的生态需要时间建设。你需要面向移动端iOS/Android或主机平台进行一键式发布跨平台支持需要实测可能不如 Unity/Godot 成熟。你的团队已经深度绑定 Unity 的 C# 或 Godot 的 GDScript切换技术栈成本较高。你需要引擎内置强大的可视化编辑器来完成大部分工作Doriax 可能更偏向代码驱动编辑器的完善度需要验证。项目对性能的极端要求必须使用特定渲染后端如 Vulkan或硬件需要核查 Doriax 的图形 API 支持情况。合规与版权提醒使用 Doriax 开发游戏时你仍需确保所有使用的美术资源、音频素材、字体等拥有合法授权。引擎本身是开源的但基于它创作的内容的版权和责任归属于开发者本人。3. 环境准备与前置条件让我们开始准备 Doriax 的开发环境。由于 Doriax 是一个 C 项目环境搭建会比使用现成编辑器的引擎稍复杂一些。1. 操作系统Windows 10/11 (推荐)这是最主流的开发环境兼容性好。Linux (如 Ubuntu 20.04)适合喜欢在 Linux 下开发的用户。macOS需要确认 Doriax 源码是否支持 CMake 或 Xcode 项目生成。2. 编译工具链C 编译器Windows:Visual Studio 2019/2022(社区版即可) 或MinGW-w64。Linux:GCC(通常版本 9) 或Clang。macOS:Xcode Command Line Tools。构建系统CMake(版本 3.16)。这是管理 C 项目依赖和跨平台编译的关键。Git用于克隆项目仓库。3. 依赖库Doriax 作为游戏引擎必然依赖一些第三方库。通常包括图形库如OpenGL(桌面端) 或GLFW/SDL2(窗口和输入管理)。Lua引擎需要集成 Lua 解释器 (如 Lua 5.3/5.4)。数学库如GLM(OpenGL Mathematics)。音频库如OpenAL或SDL2_mixer。图像加载库如stb_image。字体渲染库如freetype。好消息是一个设计良好的 CMake 项目通常会通过FetchContent或git submodule自动处理大部分依赖的下载和编译。我们可以在配置阶段观察。4. 磁盘空间预留至少2-5 GB的磁盘空间用于存放源码、依赖库和编译产生的中间文件及最终的可执行文件。5. 代码编辑器/IDEVisual Studio (Windows)与 MSVC 编译器集成最佳。VS Code跨平台通过 C/C 插件和 CMake Tools 插件可以获得优秀体验。CLion专业的 C IDE对 CMake 支持极好。准备好这些我们就可以开始获取并编译 Doriax 了。4. 安装部署与启动方式Doriax 的“安装”本质上是源码编译。我们假设其项目托管在 GitHub 上这是开源项目的常见做法。步骤 1获取源代码打开终端Windows 可用 Git Bash 或 PowerShell克隆仓库# 假设仓库地址请根据实际项目地址替换 git clone https://github.com/xxx/Doriax.git cd Doriax步骤 2生成构建文件使用 CMake 生成对应你 IDE 或编译器的项目文件。# 创建一个构建目录保持源码目录清洁 mkdir build cd build # 运行 CMake 配置 # -DCMAKE_BUILD_TYPERelease 可生成优化版本调试用 Debug cmake .. -DCMAKE_BUILD_TYPERelease如果一切顺利CMake 会输出配置成功的信息并列出找到的依赖项如 OpenGL, Lua 等。如果在此时报错通常是缺少系统级的依赖库如 Linux 上的libgl1-mesa-dev或liblua5.3-dev需要根据错误提示安装对应的开发包。步骤 3编译引擎配置成功后进行编译。# 在 build 目录下 # 使用 make (Linux/macOS 或 MinGW) make -j4 # -j4 表示用4个线程并行编译加快速度 # 或者如果 CMake 生成了 Visual Studio 的 .sln 文件 (Windows) # 直接用 Visual Studio 打开 Doriax.sln选择 Release 配置然后“生成解决方案”。 # 也可以在命令行使用 MSBuild cmake --build . --config Release编译过程可能需要几分钟取决于你的电脑性能和项目规模。成功后你通常会在build/bin/Release或类似的输出目录中找到生成的可执行文件例如DoriaxEditor.exe编辑器或Sandbox.exe示例游戏。步骤 4运行与验证找到编译出的可执行文件直接双击运行。如果是一个编辑器你应该能看到一个窗口界面。如果是一个示例游戏Sandbox运行后应该能看到一个简单的游戏场景。首次运行可能遇到的问题缺少 DLL 文件 (Windows)如果提示缺少lua54.dll、glfw3.dll等需要将这些依赖库的 DLL 文件复制到可执行文件同一目录下。这些 DLL 可能在build/dependencies/bin或系统路径中。无法打开窗口检查显卡驱动是否支持所需的 OpenGL 版本。崩溃或黑屏尝试在 Debug 模式下编译并运行通过 IDE 调试器查看崩溃原因。至此Doriax 引擎本身已经部署完成。接下来我们要测试它的核心功能。5. 功能测试与效果验证现在我们通过创建一个极简的“Hello Doriax”项目或运行其自带的示例来验证引擎的各项基础功能是否工作正常。5.1 场景管理与实体组件系统 (ECS)大多数现代游戏引擎采用 ECS 或类似的架构。我们需要验证在 Doriax 中如何创建场景、实体和组件。测试目的验证引擎的核心对象管理能力。操作思路查找引擎的示例代码或测试项目通常位于examples/或tests/目录。查看如何初始化引擎、创建空场景。查看如何创建一个实体Entity并为其添加变换Transform、渲染SpriteRenderer/MeshRenderer等组件。编写或运行一段 Lua 脚本在运行时动态创建实体。预期结果能够在窗口中出现一个基本的图形如一个彩色方块或一个精灵图片。判断成功窗口正常显示无崩溃且能通过代码控制实体的位置、旋转或缩放。常见失败Lua 绑定失败组件类型未找到渲染后端初始化错误。5.2 Lua 脚本热重载这是 Doriax 的一大亮点。热重载允许你在游戏运行时修改 Lua 脚本并立即看到效果无需重启游戏极大提升迭代效率。测试目的验证 Lua 脚本系统的动态更新能力。操作步骤创建一个 Lua 脚本文件player.lua其中包含一个控制实体移动的update(deltaTime)函数。在引擎中将该脚本附加到一个实体上。运行游戏实体应按照脚本逻辑运动例如按 WASD 移动。不关闭游戏直接修改player.lua中的移动速度或逻辑。保存文件观察游戏内实体的行为是否立即改变。预期结果脚本逻辑在保存后瞬间更新游戏内实体行为随之改变。判断成功修改生效游戏运行流畅无卡顿或错误。常见失败引擎未开启热重载监控、Lua 文件路径错误、脚本语法错误导致重载失败。5.3 2D 精灵渲染与动画对于 2D 游戏这是基础功能。测试目的验证 2D 图形资源的加载、渲染和动画播放。操作步骤准备一张 PNG 格式的精灵图片如hero.png。编写代码或配置将图片加载为纹理Texture并创建精灵Sprite。将精灵渲染到屏幕上。进一步测试精灵表Sprite Sheet动画加载包含多帧的图片并通过脚本控制帧切换。预期结果正确显示图片动画能流畅播放。判断成功图像显示正确无拉伸、失真动画帧率稳定。常见失败图片路径错误、格式不支持、显存不足、动画更新逻辑有误。5.4 3D 模型加载与基础渲染如果 Doriax 支持 3D这是必须测试的环节。测试目的验证 3D 模型导入和基础渲染管线。操作步骤准备一个简单的 3D 模型文件如.obj或.gltf格式。编写代码加载模型并创建一个带有网格渲染器MeshRenderer和基础材质Material的实体。添加一个基础光源如平行光 Directional Light。运行查看模型渲染效果。预期结果3D 模型在场景中正确显示具有基础的光照和阴影如果支持。判断成功模型几何正确材质颜色正常能随光源变化。常见失败模型文件格式不支持、缺少法线/UV 坐标、着色器Shader编译错误、GPU 不支持所需特性。5.5 输入处理测试目的验证键盘、鼠标输入事件的响应。操作步骤在 Lua 脚本中编写函数监听键盘按键如空格键跳跃和鼠标移动/点击事件。将输入事件与场景中实体的行为关联如按左右键移动角色鼠标控制相机视角。预期结果游戏能准确、及时地响应所有输入操作。判断成功输入响应延迟低无输入丢失。常见失败输入事件未正确绑定、事件派发顺序问题、与 GUI 输入冲突。5.6 音频播放测试目的验证背景音乐和音效的播放。操作步骤准备.wav或.ogg格式的音频文件。编写代码加载音频文件并创建音频源AudioSource组件。在特定事件如碰撞、点击按钮触发时播放音效。测试背景音乐的循环播放和音量控制。预期结果能正常播放声音且可以控制音量、暂停等。判断成功声音播放清晰无爆音资源管理正常播放后释放。常见失败音频文件格式不支持、音频设备初始化失败、内存泄漏。通过以上六个维度的测试你可以对 Doriax 的核心功能有一个扎实的把握。如果示例项目运行良好并且你能成功修改和扩展它们说明引擎的基础设施是稳固的。6. 创建你的第一个 Doriax 小游戏理论验证之后我们来实践一个经典案例创建一个简单的 2D 控制方块躲避障碍物的小游戏。这将串联起多个核心功能。项目结构规划MyFirstDoriaxGame/ ├── assets/ │ ├── textures/ # 存放图片 │ └── audio/ # 存放音效 ├── scripts/ # 存放 Lua 脚本 │ ├── player.lua │ ├── obstacle.lua │ └── game_manager.lua └── main.lua # 游戏入口脚本步骤 1初始化引擎与窗口在main.lua中首先需要初始化引擎并创建一个游戏窗口。-- main.lua function love.load() -- 假设 Doriax 使用类似 LÖVE 的 API 或自有生命周期函数 -- 初始化窗口设置标题和尺寸 window.setTitle(我的第一个 Doriax 游戏) window.setSize(800, 600) -- 加载资源 playerTexture texture.load(assets/textures/player_square.png) obstacleTexture texture.load(assets/textures/obstacle.png) jumpSound audio.load(assets/audio/jump.wav) -- 创建玩家实体 player entity.create() player:addComponent(Transform, {x100, y300}) player:addComponent(SpriteRenderer, {textureplayerTexture}) player:addComponent(PlayerController) -- 这是一个自定义 Lua 脚本组件 -- 创建障碍物实体示例实际可能需要对象池 -- ... 初始化游戏状态 ... end步骤 2实现玩家控制脚本在scripts/player.lua中定义PlayerController组件。-- scripts/player.lua PlayerController {} function PlayerController:init() self.speed 300 self.jumpForce -500 self.isGrounded false self.rigidbody self.entity:getComponent(Rigidbody2D) -- 假设有物理组件 end function PlayerController:update(deltaTime) local velocityX 0 -- 键盘输入控制水平移动 if input.isKeyDown(a) or input.isKeyDown(left) then velocityX -self.speed elseif input.isKeyDown(d) or input.isKeyDown(right) then velocityX self.speed end if self.rigidbody then self.rigidbody.velocity.x velocityX else -- 如果没有物理系统直接修改位置 local transform self.entity:getComponent(Transform) transform.x transform.x velocityX * deltaTime end -- 跳跃 if self.isGrounded and input.isKeyPressed(space) then if self.rigidbody then self.rigidbody:applyImpulse(0, self.jumpForce) else -- 简单跳跃逻辑 end audio.play(jumpSound) self.isGrounded false end end -- 碰撞检测回调如果引擎支持 function PlayerController:onCollisionEnter(other) if other.tag Ground then self.isGrounded true elseif other.tag Obstacle then -- 游戏结束逻辑 event.trigger(GameOver) end end步骤 3实现游戏管理逻辑在scripts/game_manager.lua中管理游戏状态如分数、障碍物生成。-- scripts/game_manager.lua GameManager { score 0, obstacleSpawnTimer 0, obstacleSpawnInterval 1.5, -- 每1.5秒生成一个障碍物 obstacles {} } function GameManager:update(deltaTime) self.obstacleSpawnTimer self.obstacleSpawnTimer deltaTime if self.obstacleSpawnTimer self.obstacleSpawnInterval then self:spawnObstacle() self.obstacleSpawnTimer 0 self.score self.score 1 print(当前分数: .. self.score) end -- 更新所有障碍物位置移出屏幕后销毁 for i #self.obstacles, 1, -1 do local obs self.obstacles[i] obs.transform.x obs.transform.x - 200 * deltaTime -- 向左移动 if obs.transform.x -100 then obs.entity:destroy() table.remove(self.obstacles, i) end end end function GameManager:spawnObstacle() local obsEntity entity.create() local obsTransform obsEntity:addComponent(Transform, {x850, ymath.random(200, 400)}) obsEntity:addComponent(SpriteRenderer, {textureobstacleTexture}) obsEntity:addComponent(Obstacle) -- 可能包含碰撞标签等 table.insert(self.obstacles, {entity obsEntity, transform obsTransform}) end -- 监听游戏结束事件 event.listen(GameOver, function() print(游戏结束最终分数: .. GameManager.score) -- 这里可以切换到游戏结束场景或显示 UI end)步骤 4运行与迭代将main.lua设置为引擎的启动脚本。运行游戏。你应该能控制方块左右移动、跳跃并看到障碍物不断生成和移动。尝试热重载在游戏运行时修改player.lua中的self.speed值保存。观察方块移动速度是否立即改变。调整参数增加更多功能如粒子特效、更复杂的障碍物模式、UI 分数显示等。通过这个完整的小项目你不仅验证了 Doriax 的核心功能还实际体验了其开发工作流。接下来我们看看如何将项目打包分发。7. 项目构建与发布开发完成后你需要将游戏打包成可独立分发的形式。1. 编译最终可执行文件确保在Release模式下重新编译整个引擎和你的游戏项目。这会进行优化减小体积提升性能。cd /path/to/Doriax/build cmake .. -DCMAKE_BUILD_TYPERelease -DCMAKE_EXPORT_COMPILE_COMMANDSON # 如果需要 cmake --build . --config Release2. 收集运行时依赖在 Windows 上你需要将游戏可执行文件.exe和所有必需的 DLL 文件如lua54.dll,glfw3.dll,openal32.dll等放在同一个文件夹下。在 Linux/macOS 上可能需要处理动态库路径LD_LIBRARY_PATH或rpath。3. 组织资源文件创建一个清晰的目录结构例如MyGame_Release/ ├── MyGame.exe (或 MyGame) ├── lua54.dll ├── glfw3.dll ├── ... (其他 DLLs) ├── assets/ # 整个 assets 目录复制过来 │ ├── textures/ │ ├── audio/ │ └── ... └── scripts/ # 整个 scripts 目录复制过来 ├── player.lua └── ...确保游戏启动时能正确找到这些资源路径。通常需要在代码中设置相对路径如./assets/。4. 测试发布版本在没有安装开发环境的电脑上或在一个干净的虚拟机中运行你打包好的文件夹内的可执行文件确保所有功能正常。这是发现缺失依赖库的最好方法。5. 打包为安装包或压缩包使用工具如 Inno Setup (Windows)、tar.gz(Linux)、或创建.dmg(macOS) 将整个文件夹打包方便分发。Doriax 如果设计完善可能会提供更便捷的构建脚本或工具来自动化部分流程这需要查阅其项目文档。8. 资源占用与性能观察对于游戏引擎性能是硬指标。虽然 Doriax 定位可能不是 3A 大作但良好的性能表现是必须的。如何观察资源占用任务管理器/系统监视器运行你的 Doriax 游戏或编辑器时打开任务管理器Windows或系统监视器Linux观察CPU 占用率在复杂场景或大量实体更新时的波动。内存占用关注工作集专用工作集内存看是否有持续增长内存泄漏。GPU 占用率如果任务管理器显示在渲染复杂场景时的负载。内置性能分析器更专业的引擎会内置性能分析工具可以查看每一帧的耗时分布如渲染、物理、脚本更新各占多少毫秒。查看 Doriax 是否提供了类似Profiler的 API 或工具。自定义帧计时在main.lua的更新循环中计算每帧耗时deltaTime并统计 FPSFrames Per Second。将其显示在屏幕上是直观的性能反馈。-- 简单的 FPS 显示 local fps 0 local fpsUpdateTime 0 local frameCount 0 function update(deltaTime) -- ... 游戏逻辑 ... -- FPS 计算 frameCount frameCount 1 fpsUpdateTime fpsUpdateTime deltaTime if fpsUpdateTime 1.0 then -- 每秒更新一次 fps frameCount frameCount 0 fpsUpdateTime fpsUpdateTime - 1.0 print(FPS: .. fps) -- 或绘制到屏幕 end end性能优化关注点Lua 脚本效率避免在update中频繁创建临时表Table、字符串连接。使用局部变量。渲染批次2D 游戏中尽量将使用相同纹理的精灵合并绘制Batch Rendering减少 Draw Call。Doriax 的渲染器是否自动批处理需要验证。实体数量场景中活动实体过多会显著影响性能。对于像障碍物这样的对象使用对象池Object Pool进行复用而非频繁创建销毁。资源管理确保不用的纹理、音频等资源及时卸载防止内存无限增长。通过持续监控和优化你可以确保基于 Doriax 开发的游戏运行流畅。9. 常见问题与排查方法在开发过程中你肯定会遇到各种问题。这里列出一些常见问题及其排查思路。问题现象可能原因排查方式解决方案CMake 配置失败1. 缺少系统依赖库。2. CMake 版本过低。3. 源码路径有中文或空格。1. 仔细阅读 CMake 错误信息。2. 检查CMakeLists.txt中的find_package语句。1. 根据错误安装对应开发包如sudo apt-get install libglfw3-dev liblua5.3-dev。2. 升级 CMake。3. 将源码放在纯英文路径下。编译链接错误1. 编译器不支持 C 新特性。2. 库文件路径不对。3. 函数未定义链接错误。1. 查看具体的错误行和文件。2. 检查 CMake 输出的包含目录和链接库。1. 尝试使用更新的编译器或修改代码兼容标准。2. 确保依赖库已正确编译并找到。3. 检查是否遗漏了某个源文件或库的链接。运行时崩溃Access Violation1. 空指针解引用。2. Lua 与 C 边界数据传递错误。3. 内存越界。1. 在 Debug 模式下运行利用调试器定位崩溃点。2. 检查 Lua 栈操作是否正确平衡。1. 使用调试器如 VS、GDB查看调用栈。2. 仔细检查所有从 C 导出给 Lua 的 API。Lua 脚本热重载不生效1. 文件监控未开启或路径错误。2. 脚本文件有语法错误。3. 热重载功能本身存在 Bug。1. 检查引擎初始化时是否启用了热重载。2. 查看引擎日志输出。3. 手动修改一个简单变量测试。1. 确认脚本文件在引擎监控的目录内。2. 确保修改后保存。3. 查阅 Doriax 关于热重载的文档或示例。图片/模型/音频加载失败1. 文件路径错误。2. 文件格式不支持。3. 文件被其他程序占用。1. 打印尝试加载的完整路径。2. 检查文件是否确实存在。3. 尝试用其他工具打开该文件。1. 使用绝对路径或相对于可执行文件的正确相对路径。2. 将资源文件转换为引擎支持的格式如 PNG, WAV。游戏运行卡顿FPS 低1. 单帧内脚本逻辑过于复杂。2. 渲染 Draw Call 过高。3. 内存频繁分配/释放。1. 使用性能分析工具定位耗时函数。2. 查看渲染的实体数量和批处理情况。3. 检查是否有在每帧创建新对象。1. 优化 Lua 脚本算法。2. 合并渲染批次。3. 使用对象池复用对象。输入无响应1. 输入事件未被正确捕获。2. 焦点不在游戏窗口。3. 脚本中的输入检测代码有误。1. 确认游戏窗口是活动窗口。2. 编写一个简单的测试脚本只打印按键事件。1. 检查引擎的输入系统初始化。2. 确保在正确的回调函数如update中检测输入。遇到问题时首先查看引擎的日志输出如果有其次利用调试器最后可以到 Doriax 的项目仓库的 Issues 页面搜索或提问。10. 最佳实践与使用建议基于对 Doriax 的探索这里给出一些开发建议帮助你更高效、更稳定地使用它。从示例项目开始不要一上来就从头创建大项目。先彻底跑通、理解和修改一个官方示例如 Sandbox这是最快的学习路径。善用 Lua 热重载这是 Doriax 的核心效率工具。将游戏逻辑尽可能放在 Lua 脚本中并养成运行时修改测试的习惯能极大提升开发速度。模块化组织代码将不同的功能拆分成独立的 Lua 模块文件。例如ui_manager.lua、audio_manager.lua、level_loader.lua。通过require引入保持代码清晰。资源管理规范化建立清晰的assets目录结构。考虑编写一个简单的资源管理器统一加载和释放资源避免重复加载和内存泄漏。版本控制使用 Git 管理你的游戏项目。将assets和scripts目录纳入版本控制但忽略build目录和生成的二进制文件。如果 Doriax 引擎本身也在你的项目内作为子模块也要管理好。性能测试常态化在开发过程中定期在目标发布平台上测试性能FPS内存。特别是增加新特效或复杂逻辑后。理解 C 与 Lua 的边界清楚哪些操作适合在 C 端高性能如图形渲染、物理计算哪些适合在 Lua 端灵活如游戏逻辑、UI 交互。过度跨边界调用会影响性能。参与社区如果 Doriax 有活跃的社区如 GitHub Discussions、QQ 群、论坛积极参与。开源项目的生命力在于社区你遇到的问题可能别人已经解决你的贡献也能帮助项目成长。保持备份与迭代在尝试大的架构改动或引擎升级前备份你的项目。开源引擎可能更新较快注意 API 的变更。Doriax 作为一个新兴的国产开源引擎其最大的价值在于提供了一个清晰、可掌控的 C/Lua 游戏开发架构。它可能不像 Unity 那样开箱即用、生态庞大但它给予开发者的透明度和控制力是独特的。如果你享受从底层理解游戏运行机制并愿意亲手搭建工具链Doriax 会是一个令人兴奋的选择。先从编译成功、运行示例、完成一个小游戏开始逐步深入你就能真正体会到它是否比 Unity 更“顺手”。

相关新闻