GateEngine

一个用于 Swift 的跨平台游戏引擎,允许你构建 2D 和 3D 游戏。
GateEngine 包含直观的 API,用于加载资源、处理用户输入和渲染内容。

平台支持

平台 CI (持续集成) 图形 音频 键盘 鼠标 触摸 手柄
macOS 10.15+ ✔︎ ✔︎ ✔︎ ✔︎ ✔︎ ✔︎
Windows 10,11 ⚠️ ✔︎ ✔︎ ✔︎ ✔︎
Linux ⚠️ ✔︎ ✔︎ ✔︎ ✔︎ ✔︎
iOS 13.0+
iPadOS 13.0+
tvOS 13.0+
✔︎
✔︎
✔︎
✔︎
✔︎
✔︎
✔︎
✔︎
✔︎

✔︎
✔︎
✔︎
✔︎
✔︎
✔︎
Android¹ ⚠️
HTML5 ⚠️ ✔︎ ✔︎ ✔︎ ✔︎ ✔︎ ✔︎

完整: ✔︎ | 不完整: ⛌ | 部分: ◑
¹等待社区制作的交叉编译 SDK。
⚠️ 在完成核心引擎时,此平台的开发速度会减慢。

关于

GateEngine 旨在让游戏开发者可以使用易于上手且直观的 API,通过 Swift 编写游戏。

数学

GateEngine 拥有完全用 Swift 编写的自定义数学库。GameMath 允许开发者使用口语风格的 API 编写数学函数。GameMath 使用上下文相关的类型,如 Position3Direction3Size3。由于每个类型提供的固有上下文,这为 API 增加了一层额外的理解。

let position: Position3 = Position3(0, 1, 0) * Size3(1, 1, 1)
...
let moved: Position3 = position.moved(units, toward: direction)
...
let reflected: Direction3 = direction.reflected(off: surfaceNormal)
...
let halfway = source.interpolated(to: destination, .linear(0.5))

资源

GateEngine 具有简单直观的资源加载和缓存 API。资源可以立即构造并且是非阻塞的。返回的引用是缓存句柄,创建同一资源的多个实例将返回相同的缓存句柄。因此,你无需担心管理资源。你可以简单地在你需要的任何地方创建资源。

// Load geometry
let geometry = Geometry(path: "model.obj")

// Reused the same cache as above. No load required.
let theSameGeometry = Geometry(path: "model.obj")

资源状态让你知道资源何时可以被使用。在许多情况下,资源状态会自动检查,例如在渲染时。渲染器将自动跳过未准备好的资源。但在某些情况下,你可能需要手动检查资源状态。

let tileMap = TileMap(path: "tilemap.tmj")
...
if tileMap.state == .ready {
    // ready to be accessed
}

GateEngine 隐藏了错误处理。资源加载失败通常是游戏中的开发错误。它通常不是需要处理的运行时错误。

为每个资源编写 do-try-catch 会变得很乏味,因此 GateEngine 将错误放置在资源状态中。这允许你像处理值类型一样编写游戏代码。

资源错误会自动记录,因此你通常无需检查它们。

[GateEngine] warning: Resource "tileSet.tsj" failedToLocate
[GateEngine] warning: Resource "tileMap.tmj" failedToLocate

但是,如果你想设计一个可失败的资源处理机制,你可以通过检查资源状态中的错误来实现。

if case .failed(let error) = resource.state {
    // This error was already output as a warning
}

渲染

GateEngine 使用高级渲染 API,该 API 设计为灵活且可自定义。渲染按照添加顺序进行,让你能够轻松地推断结果。

// Create a 2D draw container
var canvas = Canvas()

// Draw a sprite at a specific location 
canvas.insert(sprite, at: position)

// Draw the canvas inside the window
window.insert(canvas)

高级用户还可以利用更底层的 DrawCommand API 来获得更高的可定制性。

着色器

在大多数情况下,着色器是自动处理的。但是,如果你需要制作自定义着色器,GateEngine 提供了一个简单直观的解决方案。

GateEngine 使用基于 Swift 的着色器 API,允许你直接在项目中编写着色器。着色器自动在每个平台上工作,并且没有交叉编译工具或文件需要处理。

// "Vertex Colors" vertex shader written in Swift
let vsh = VertexShader()
let mvp = vsh.modelViewProjectionMatrix
let vertexPosition = vsh.input.geometry(0).position
vsh.output.position = mvp * Vec4(vertexPosition, 1)
vsh.output["color"] = vsh.input.geometry(0).color

// "Tinted Texture" fragment shader written in Swift
let fsh = FragmentShader()
let sample = fsh.channel(0).texture.sample(
    at: fsh.input["texCoord0"]
)
fsh.output.color = sample * fsh.channel(0).color

着色器目前正在开发中,并且缺少一些功能。

开始使用

像添加任何其他软件包一样,将该软件包添加到你的项目中。

.package(url: "https://github.com/STREGAsGate/GateEngine.git", .upToNextMinor(from: "0.1.0"))

iOS/tvOS 需要 Xcode 项目。你不能将 Swift Package Manager 可执行文件用于 iOS 或 tvOS。

Linux 特定设置

对于 Linux,你必须安装 OpenGL 和 OpenAL 的开发包。在 Ubuntu 上,以下终端命令将安装所需的软件包

sudo apt-get update --fix-missing
sudo apt-get install freeglut3-dev
sudo apt-get install libopenal-dev

例子

一组示例项目可在 GateEngine Demos 获得。
这些示例涵盖各种主题,包括渲染、用户输入和脚本编写。

支持 GateEngine!

GateEngine 依赖于社区资金。如果你喜欢这个项目,并希望它继续下去,请考虑投入一些资金。每一份都对我们有帮助!
通过以下方式支持:GitHubKo-fiPatreon

社区 & 可关注内容

GateEngine 开发博客发布在 Discord 这里
Discord 也是提出问题或炫耀你的创作的好地方。

Discord Twitter YouTube Reddit

历史

GateEngine 于 2016 年开始,作为一个“为了好玩”的项目,它采用了典型的策略,即业余游戏引擎项目,具有高性能和小巧的体积。它使用场景图,并且仅在使用 OpenGL 的 Apple 设备上工作。

Engine Creation 01

我创建了一个延迟渲染器,这是一种可以减少极其复杂的三 A 级游戏工作量的技术。当时,我认为这是有史以来最伟大的事情,我真的很喜欢学习它。

Engine Creation 02

然后我添加了照明,这又是一个非常有趣的学习过程。能够在屏幕上看到结果非常激励人,我确信这就是为什么大多数游戏引擎都以图形库开始的原因。

Engine Creation 03

然后我添加了阴影和法线贴图。

Engine Creation 04

最终,我添加了蒙皮和 UI。我创建了自己的 3D 模型作为测试。这是早期尝试从 COLLADA 格式加载文件。有些东西仍然有点不对劲,但我最终还是修复了它 😜

Engine Creation 05

我仍然需要实际构建“引擎”部分。在这一点上,引擎只是一个图形模拟。绘制东西实际上只是游戏引擎所做工作的一小部分。我最终了解了碰撞和不同的数据技术,例如实体组件系统。

那是我开始重写的时候...

开发引擎是一个大型的学习过程。每次你想出一个好的方法来做它,你都会在完成前一个方法之前想出一个更好的方法。在开始时,迭代是完全重写,随着时间的推移,迭代变得更加精细。

渐渐地,我制作引擎的技能赶上了我正在创建的设计,GateEngine 开始稳定下来。就在这时我意识到我没有制作任何游戏。我只是在构建技术演示。

所以我决定制作我的第一个 3D 游戏。Espionage 是一款 3D 隐形动作游戏,我至今仍在开发中。它的灵感来自我从小玩的游戏,它也是我一直想制作的那种游戏。

Espionage Screenshot

这是一个非常大的项目,作为一名独立开发者,我可能需要很长时间才能完成它。我个人更喜欢大型项目。

我还没有被诱惑加入游戏果酱,但也许在某个时候尝试一下会很有趣。也许有一天我们会有一个 GateJam!

无论如何,GateEngine 是一项艰巨的任务,它的创建是为了享受。所以去创造你自己的了不起的东西吧!