使用 Rust 开发原生 iOS 游戏
使用 Rust 开发原生 iOS 游戏
我记录了使用纯 Rust 探索跨平台游戏开发的旅程。
严重地。我不解决。 100% 生锈或破产!
为什么我选择 Rust
当谈到性能和模块化设计时,Rust 是一个热门的讨论话题,但这并不是我选择这种语言的原因。我选择 Rust 是因为我想要一种跨平台的系统编程语言。
事后诸葛亮:我喜欢 Rust 的地方
在研究了几个星期的 Rust 之后,我发现一些最可怕的功能变得令人愉快。尽管有一个学习曲线,但事后看来,我真的很欣赏 Rust 的以下特性。
无面向对象
模块化代码
文档生态系统
构建系统
包管理
我探索 Rust 的目标
我的目标是找到一种语言,它允许我编写跨平台代码而无需跳过一堆障碍。作为一个业余爱好者,我没有太多时间去学习新的语言或挖掘一周的框架。
为了让我的探索取得成功,我将继续进行 Rust 开发,直到我在 App Store 上发布一个应用程序。为什么?因为 Swift/Obj-C 是我最害怕的语言,但我可以容忍 Java。因
0.项目环境设置
进入这个项目,我知道我会经常修改环境变量和构建脚本。所以在我开始使用 Rust 之前,我会在我的 .bashrc
这使得更换我的开发环境的大更改变得容易。
以下脚本允许我扩展我的 .bashrc
从我的任何项目目录 〜/代码
向上遍历文件夹,直到找到一个名为 .devenv
.从那里我可以获取每个项目的 bash 脚本。
# 向上遍历时从`find`中获取第一个匹配
函数 find_above {
old_pwd="$PWD"
而 [[ "$PWD" == $HOME/code/* ]] ;做
new_pwd=`find "$PWD"/-maxdepth 1 "[[email protected]](/cdn-cgi/l/email-protection)"`
如果 [[ "$new_pwd" ]];然后
休息
菲
光盘..
完毕
回声“$new_pwd”
cd "$old_pwd"
old_pwd=""
新密码=“”
}
这是我使用该方法获取本地的部分 .bashrc
.每次切换项目时,我都必须重新获取环境资源,但这不是问题。
# 见上面的代码
ENVDIR=$(find_above -type d -name ".devenv")
如果 [[ "$ENVDIR" ]];然后
源“$ENVDIR/.bashrc”
菲
创建别名
现在我的机器可以处理每个项目的 bash 环境,我设置了一些命令,以便我可以快速浏览我的代码。
# ~/code/tictactoe/.devenv/.bashrc
echo "检测到本地环境:$PWD"
# src 目录
导出 SRCDIR=$(find_above -name "src")
# 根目录
导出 ROOTDIR=$(目录名 $SRCDIR)
# 构建目录
出口 BUILDDIR="$ROOTDIR/目标"
mkdir -p "$BUILDDIR"
# 库目录
导出 LIBDIR="$ROOTDIR/src"
mkdir -p "$LIBDIR"
# bin 目录
出口 BINDIR="$ROOTDIR/.devenv/bin"
mkdir -p "$BINDIR"
导出 PATH="$BINDIR:$PATH"
导出 RUST_LOG="警告,手工制作=调试"
导出 RUST_BACKTRACE=1
# 别名
别名 c="货物构建"
别名干净=“干净”
别名 s="源 $HOME/.zshrc"
别名 root="cd $ROOTDIR"
别名 r="货运运行"
别名 t="货物测试"
别名 i="run-ios-sim.sh"
别名 cr="c && r"
1.Hello World Rust/Bevy
当我几周前第一次开始探索时,我想从尽可能低的水平开始。我想编写自己的图形渲染和游戏引擎。然而,在大约 3 天的零进度之后,我放弃了这个梦想,寻找了一个 Rust 游戏引擎。
安装贝维
当然,我下载了我能找到的第一个游戏引擎。结果证明这是一个非常好的框架。 Bevy 是一个游戏引擎,它是围绕应用程序设计的,应该是高度模块化的。我已经使用图书馆几个星期了,我仍然喜欢它!
货物添加bevy
使用 Bevy 的范式编写代码
这是在 Mac OS 上使用 Bevy 的 Hello world:
使用 bevy::prelude::*;
fn 主要() {
应用程序::new()
.add_system(hello_world_system)
。跑();
}
fn hello_world_system() {
println!("Hello Rust");
}
注意我没有直接打电话 打印
.这是因为 Bevy 提供了一个与路由系统非常相似的框架。 ExpressJS
.在更大的项目中,您可以提取模块/插件中的功能,并且每个插件都可以访问上下文以注册更多系统。
运行 Bevy Hello World
充电运行
图形用户界面在哪里?
Bevy 将它的所有组件都隔离到插件中,所以如果你想放弃整个“游戏引擎”的东西,你可以这样做!您还可以在无头模式下运行 Bevy!尽管为了本教程的目的,您需要启用默认插件。
使用 bevy::prelude::*; fn 主要() {
应用程序::new()
.add_plugins(默认插件)
// ...
。跑();
} // ...
2. 为 iOS 构建(跨平台前期)
我想立即尝试编译 你好世界
对于 iOS。这为我节省了很多前期时间,因为如果我不能让 iOS 与 Rust 一起工作,那么这个项目就是失败的。此外,没有什么比编写一个项目然后在事后尝试将其移植到另一个系统更困难的了。
事后诸葛亮:警告导致发现
我承认成功编译所花的时间比我愿意承认的要长得多。最初,我认为我需要使用
_外部“C”_
, 但事实并非如此。事实上,您甚至不需要触摸 XCode!
捆绑
有一个用于 cargo 的构建工具,可以让您为 iOS 编译和捆绑,而无需跳过任何环节。首先安装构建工具:
货物安装货物捆绑
添加编译目标
然后你需要列出 Rust 支持的所有可能的构建目标。由于我的目标是 iOS,所以我运行了以下命令:
rustup 目标列表 | grep ios
如果您缺少 iOS 作为目标,则需要根据您的环境添加它们。
# 用于生产
rustup 目标添加 aarch64-apple-ios
# 用于开发
rustup 目标添加 aarch64-apple-ios-sim
iOS 模拟器的打包
一旦您的系统上有可用的编译目标 你在 Mac 上 ,您可以使用我编写的脚本或复制并粘贴以下命令将您的应用程序注入模拟器。大多数命令都随 XCode 一起提供。
下面的脚本使用 达塞尔 因此它可以从项目中查询名称和包标识符 货运.toml
文件。
冲泡安装dasel
然后我使用 XCode 提供的一系列命令来配合 iPhone 模拟器工作。有关此脚本中的命令如何工作的更多信息,可以使用此找到 备忘单 .
#/usr/bin/env bash
APP_NAME="$(cat Cargo.toml | dasel -r toml '.package.name')"
BUNDLE_ID="$(cat Cargo.toml | dasel -r toml '.package.metadata.bundle.identifier')"
货物捆绑--target aarch64-apple-ios-sim
xcrun simctl 启动“iPhone 12 mini”
打开 /Applications/Xcode.app/Contents/Developer/Applications/Simulator.app
xcrun simctl install booted "target/aarch64-apple-ios-sim/debug/bundle/ios/$APP_NAME.app"
xcrun simctl launch --console booted "$BUNDLE_ID"
3. 项目成功!
如果一切正常,你应该会留下一个 iOS 应用程序,它会向你的终端发送垃圾邮件“Hello Rust”并满足以下条件:
- 完全用 Rust 编写
- 没有桥接代码
- 没有 XCode
- 模块化设计
- 灵活的开发环境
未完待续
如果您想将项目的其余部分作为一个系列记录或分享源代码,请关注、鼓掌和评论!它帮助我保持动力
结论
完全用 Rust 编写游戏并在没有 XCode 的情况下本地编译到 iOS 是可能的。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明
本文链接:https://www.qanswer.top/11130/11520210