ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Godot 4 移动端开发实战:从多点触控、传感器到 Google Play 内购(mobile 目录 Demo 全解析)

Godot 4 移动端开发实战:从多点触控、传感器到 Google Play 内购(mobile 目录 Demo 全解析) 示例工程【免费下载链接】godot-demo-projectsDemonstration and Template Projects项目地址https://gitcode.com/GitHub_Trending/go/godot-demo-projects点击查看免费下载本篇文章以 mobile/README.md 为骨架深入剖析 godot-demo-projects 仓库中mobile目录下的四个移动端专属 DemoGoogle Play 内购Android IAP、多点触控方块、多点触控调试器与移动传感器。这些 Demo 依赖手机和平板才具备的硬件能力触摸屏、传感器、应用内支付全部使用 GDScript 编写是学习 Godot 移动端输入、传感器融合与计费接入的实战样例。读完本文你将掌握 Godot 移动端工程的渲染器与配置选择、多点触控手势识别、触摸状态跟踪、传感器数据解算设备朝向以及 Google Play Billing 的完整接入流程。移动端 Demo 一览依赖手机特性的四个工程mobile目录下的四个 Demo 都是独立的 Godot 工程各自包含project.godot它们共有的特点是依赖手机或平板独有的功能特性其中 Android IAP 只能运行在 Android 设备上其余三个也需要触摸屏或传感器在桌面端无法完整体验。各工程的关键信息如下表所示Demo 目录核心主题依赖硬件语言渲染器mobile/android_iapGoogle Play 应用内购BillingAndroid 设备GDScriptCompatibilitymobile/multitouch_cubes多点触控输入与手势识别触摸屏手机/平板GDScriptCompatibilitymobile/multitouch_view多点触控调试器实时显示触点触摸屏GDScriptCompatibilitymobile/sensors加速度计、陀螺仪、磁力计移动传感器GDScriptMobile值得注意的一个细节只有sensors工程使用Mobile渲染器其余三个均使用Compatibility渲染器。从 mobile/sensors/project.godot 中可以看到其渲染配置为[rendering] renderer/rendering_methodgl_compatibility renderer/rendering_method.mobilegl_compatibility而 mobile/android_iap/project.godot、mobile/multitouch_cubes/project.godot 与 mobile/multitouch_view/project.godot 也都显式声明了renderer/rendering_method.mobilegl_compatibility。这说明仓库作者刻意保持了移动端工程的渲染一致性Compatibility 即 OpenGL以便在各类移动 GPU 上获得更广泛的兼容性。此外这几个工程都开启了textures/vram_compression/import_etc2_astctrue即允许纹理导入时使用 ETC2/ASTC 移动端压缩格式可显著降低显存占用。运行方式如何在 Godot 中导入并启动这些 Demo按照仓库根目录 README.md 的说明可以一次性导入所有 Demo克隆本仓库git clone https://gitcode.com/GitHub_Trending/go/godot-demo-projects或下载 ZIP 并解压打开 Godot 项目管理器点击右侧Scan扫描按钮选择包含所有 Demo 的目录全部 Demo 即会出现在项目管理器中双击mobile下的任一工程即可打开运行。也可以单独下载各个 Demoandroid_iap、multitouch_cubes、multitouch_view、sensors均发布在 Godot Asset Store由 godot-foundation 提供。需要注意浏览器运行无法真实体验移动端硬件特性最好在手机/平板上用原生版本运行。多点触控类 Demo 在桌面调试时可以通过project.godot中的pointing/emulate_touch_from_mousetrue用鼠标模拟触摸输入。Android 应用内购 DemoGodot × Google Play Billing 完整接入工程目标与前置要求mobile/android_iap/README.md 明确说明这是一个展示如何在 Godot 中使用Google Play Billing的示例工程借助 Godot Google Play Billing 插件实现初始化计费客户端、查询可用的应用内商品、发起购买流程、处理购买状态更新、正确确认acknowledge与消耗consume购买。运行该 Demo 需要满足以下前置条件均来自官方 READMEGodot Enginev4.2完成 Android Gradle 构建配置参照官方 gradle build 文档一个 Google Play Console 账号在 Play Console 中创建的应用草稿应用即可至少配置好一个应用内商品in-app product。运行步骤在 Godot 中打开工程配置 Android 导出预设包名必须与 Play Console 中的应用一致确认插件已正确安装到工程中project.godot 的[editor_plugins]中声明了res://addons/GodotGooglePlayBilling/plugin.cfg构建并安装应用将应用上传到 Play ConsoleInternal Testing 内部测试即可。两条重要的注意事项计费只对通过 Google Play 安装的应用生效手动安装的 Debug APK 只有在设备上的 Google Play 账号被添加为license tester许可测试员时才可正常购买。源码级解读BillingClient 的完整生命周期核心逻辑集中在 mobile/android_iap/store.gd它继承自SplitContainer完整演示了计费客户端的生命周期1. 初始化与信号连接_init()billing_client BillingClient.new() billing_client.connected.connect(_on_connected) billing_client.connect_error.connect(_on_connect_error) billing_client.query_product_details_response.connect(_on_query_product_details) billing_client.query_purchases_response.connect(_on_query_purchases) billing_client.on_purchase_updated.connect(_on_purchase_updated) billing_client.start_connection()2. 连接成功后查询已购商品与商品详情_on_connected()先调用query_purchases(BillingClient.ProductType.INAPP)恢复本地已购买状态再通过query_product_details(inapp_products.keys(), BillingClient.ProductType.INAPP)拉取商品价格等信息。这里用到了export var inapp_products: Dictionary[String, Texture]将商品 ID 映射到图标纹理在编辑器里即可配置。3. 发起购买_on_item_buy_pressed()调用billing_client.purchase(product_id)通过返回结果的response_code与BillingClient.BillingResponseCode.OK比较来判断是否成功。4. 处理购买更新_on_purchase_updated()与_process_purchase()遍历result.purchases对每个未确认的购买调用billing_client.acknowledge_purchase(purchase.purchase_token)并等待acknowledge_purchase_response确认成功后把product_id - purchase_token存入owned_products字典并将商店列表中的对应商品卡片移除。5. 消耗购买_on_item_consume_pressed()通过billing_client.consume_purchase(token)消耗可消耗商品成功后从owned_products中移除并刷新已购物品标签页。6. 退出清理_notification()中监听NOTIFICATION_WM_GO_BACK_REQUESTAndroid 返回键以及退出按钮回调均调用billing_client.end_connection()优雅断开计费连接。商品卡片本身封装在 mobile/android_iap/item.gd继承PanelContainer暴露buy_pressed/consume_pressed两个信号通过configure()设置商品名、价格、图标未拥有时显示购买按钮已拥有时隐藏购买按钮并显示消耗按钮。价格文本的解析在store.gd的_get_price_string()中从one_time_purchase_offer_details_list提取formatted_price代码注释提示目前尚未支持订阅 offer。工程配置要点mobile/android_iap/project.godot 中有几处针对移动端的配置值得借鉴window/size/viewport_width720、viewport_height1280的竖屏视口配合window/handheld/orientation1锁定竖屏与window/stretch/modecanvas_items、stretch/aspectexpand保证不同屏幕比例下 UI 自适应theme/default_theme_scale1.5针对手机的高像素密度放大默认主题字号主场景通过uid://depkfknb3soa7引用其余资源也大量使用 UID 引用Godot 4.4 的通用资源标识符机制。工程还提供了一个setup_instructions.tscn作为引导页mobile/android_iap/setup_instructions.gd点击继续按钮后通过get_tree().change_scene_to_file(res://store.tscn)切换到商店场景。多点触控方块 Demo单指旋转 双指缩放手势识别mobile/multitouch_cubes/README.md 说明该 Demo 用于展示touch API 的多点触控输入与不同手势需配合手机或平板使用。核心实现是 mobile/multitouch_cubes/gesture_area.gd一个继承自Control的手势识别区域通过export var target: NodePath指定被操控的 3D 节点。它通过导出变量开放了全部手势开关与参数便于复用export var target: NodePath export var min_scale : 0.1 export var max_scale : 3.0 export var one_finger_rot_x: bool true export var one_finger_rot_y: bool true export var two_fingers_rot_z: bool true export var two_fingers_zoom: bool true手势状态机按手指数量分派逻辑_gui_input()以当前按下的手指数量base_state.size()为核心做状态分派0 根手指接受InputEventScreenTouch.pressed记录首个触点{index: position}到base_state1 根手指处理旋转X/Y 轴——拖拽事件中把像素位移经_px2unit()归一化为单位量以屏幕较短边为 1通过target_node.global_rotate(Vector3.UP, ...)和global_rotate(Vector3.RIGHT, ...)旋转目标由于绕两轴旋转代码会不断重置base_state与base_xform以避免累计误差2 根手指处理捏合缩放与绕 Z 轴旋转——计算两根手指当前向量与基准向量的长度比得到缩放系数用clampf(base_scale * ratio, min_scale, max_scale)限制缩放范围再通过new_segment.angle_to(base_segment)得到旋转角并global_rotate(Vector3.BACK, rot)。_px2unit()的实现也很精练var shortest : minf(get_size().x, get_size().y); return v * (1.0 / shortest)把像素矢量换算成以短边为基准的单位矢量保证不同分辨率设备上手势灵敏度一致。project.godot中pointing/emulate_touch_from_mousetrue允许在桌面端用鼠标模拟触摸来调试手势逻辑。多点触控调试器 Demo用单例跟踪每一个触点mobile/multitouch_view/README.md 将其定位为多点触控输入的简易调试器你在哪里按下哪里就出现彩色圆点。整个工程只有两个脚本却清晰示范了触摸状态跟踪与可视化绘制两个层次。TouchHelper 单例维护指针状态字典mobile/multitouch_view/touch_helper.gd 继承自Node通过_unhandled_input()监听未被其他节点处理的输入事件InputEventScreenTouch按下时state[input_event.index] input_event.position抬起时state.erase(input_event.index)InputEventScreenDrag更新对应触点的新位置。其公开属性state: Dictionary[int, Vector2]以指针索引为键、位置为值。脚本注释还解释了设计动机监听未被其他方式处理的输入并将操作系统传入的指针索引重映射为最低可用序号使调试信息更友好。在 mobile/multitouch_view/project.godot 中它被注册为全局单例[autoload] TouchHelper*res://touch_helper.gd这样任何场景都可以通过$/root/TouchHelper访问触点状态。main.gd每帧重绘彩色圆点mobile/multitouch_view/main.gd 继承Node2D在_process()中持续queue_redraw()在_draw()中遍历touch_helper.state.keys()为每个指针绘制一个半径 40 像素、透明度 0.75 的圆。颜色由_get_color_for_ptr_index()根据指针索引生成func _get_color_for_ptr_index(index: int) - Color: var x : (index % 7) 1 return Color(float(bool(x 1)), float(bool(x 2)), float(bool(x 4)))用索引的低 3 位比特构造 RGB 三色通道实现每个触点都有独特颜色的调试效果代码量极小且直观。移动传感器 Demo用加速度计、陀螺仪与磁力计解算设备朝向mobile/sensors/README.md 说明该 Demo 展示加速度计、陀螺仪、磁力计三种常见移动传感器的用法——这些传感器通常只存在于移动设备上桌面端无法工作。整个实现集中在 mobile/sensors/main.gd虽然展示的是 3D 场景但注释明确指出读取设备朝向在 2D 游戏中同样极具价值。读取原始数据与兜底策略在_process()中通过Input单例一次性读取四路传感器数据var acc : Input.get_accelerometer() var grav : Input.get_gravity() var mag : Input.get_magnetometer() var gyro : Input.get_gyroscope()随后将数值格式化%.05f填充到 UI 标签。脚本同时给出了传感器缺失时的兜底策略若重力向量长度小于 0.1 且加速度也接近零则假设grav Vector3(0.0, -1.0, 0.0)设备水平朝上若只有重力缺失则用加速度计代替重力向量因为系统通常由多传感器融合计算重力向量若磁力计缺失则假定磁北方向为Vector3(1.0, 0.0, 0.0)。代码注释还提醒这些算法均未做滤波滤波会引入延迟但带来稳定性实战中可参考社区实现自行补充。核心算法四个纯函数解算朝向main.gd提供了四个可直接复用的矢量/矩阵算法get_basis_for_arrow(p_vector)由方向向量构造旋转矩阵用于把箭头模型指向指定方向。先让rotate.y p_vector.normalized()再用叉积依次构造互相垂直的x、z轴为规避万向锁当初始辅助向量与目标方向点积绝对值大于 0.9 时切换辅助向量。calc_north(p_grav, p_mag)用重力向量与磁力计读数计算指向地平线对齐的北方的向量——先叉积得到东西向再与重力叉积得到北方。注释风趣地提醒必须始终使用归一化向量。orientate_by_mag_and_grav(p_mag, p_grav)结合磁力计与重力构造朝向矩阵rotate.y -p_grav.normalized()重力向下故取反为上该方法不依赖陀螺仪适合没有陀螺仪的低端机型但易受磁体干扰。rotate_by_gyro(p_gyro, p_basis, p_delta)陀螺仪输出的是角速度而非方向因此需要乘以delta积分rotate rotate.rotated(p_basis.x, -p_gyro.x * p_delta) rotate rotate.rotated(p_basis.y, -p_gyro.y * p_delta) rotate rotate.rotated(p_basis.z, -p_gyro.z * p_delta) return rotate * p_basisdrift_correction(p_basis, p_grav)陀螺仪积分会产生漂移该函数用重力向量做纠偏——点积得到夹角余弦叉积得到旋转轴构造旋转矩阵修正基向量当dot 1.0时执行修正。在_process()末尾Demo 用两套方案分别驱动两个方块orientate_by_mag_and_grav()组合磁力计重力抗干扰差但可用以及rotate_by_gyro()drift_correction()组合陀螺仪重力效果最佳。工程配置差异唯一使用 Mobile 渲染器的工程mobile/sensors/project.godot 中renderer/rendering_method.mobilegl_compatibility与其他工程一致但根 README 明确指出该工程在概念上对应Mobile 渲染器分类同时开启了anti_aliasing/quality/msaa_3d22x MSAA 抗锯齿以改善 3D 场景锯齿并启用 ETC2/ASTC 纹理压缩。此外window/stretch/modecanvas_items保证 UI 按画布尺寸缩放适配不同分辨率的手机屏幕。小结移动端开发的通用模式与复用建议综合mobile目录四个 Demo可以总结出几条可复用的 Godot 移动端开发模式触摸输入优先在_unhandled_input()或_gui_input()中处理InputEventScreenTouch/InputEventScreenDrag用字典按index跟踪触点并按手指数量分派手势逻辑参考 gesture_area.gd调试手段把触摸状态做成 Autoload 单例参考 touch_helper.gd配合Node2D._draw()可视化是排查多点触控问题的高效手段传感器使用通过Input.get_accelerometer()等 API 读取原始数据用重力向量纠偏陀螺仪漂移、用磁力计补足无陀螺仪设备参考 main.gd移动配置所有工程均统一使用 Compatibility 渲染器、开启 ETC2/ASTC 纹理压缩并通过emulate_touch_from_mouse支持桌面调试应用内购遵循连接 → 查询 → 购买 → 确认/消耗的完整计费生命周期并对购买结果逐项校验response_code参考 store.gd。这些 Demo 均可直接作为移动端项目的起点模板把gesture_area.gd复制到需要手势控制的 3D 场景把TouchHelper单例引入需要调试触摸的游戏把传感器算法函数移植到体感或 AR 类玩法把store.gd的计费流程套用到自己的商店系统。每个工程都包含project.godot可以直接在 Godot 项目管理器中打开运行、按需裁剪。赞分享示例工程【免费下载链接】godot-demo-projectsDemonstration and Template Projects项目地址https://gitcode.com/GitHub_Trending/go/godot-demo-projects点击查看免费下载相关推荐Godot 移动端传感器演示解析用加速度计、陀螺仪与磁力计实时估算设备姿态godot-demo-projects / mobile/sensorsGodot 移动端传感器演示解析用加速度计、陀螺仪与磁力计实时估算设备姿态godot demo projects / mobile/sensors 本篇文示例工程移动端拖拽终极指南dnd-kit触控传感器TouchSensor深度解析与实战优化移动端拖拽终极指南dnd kit触控传感器TouchSensor深度解析与实战优化 在现代React应用中 dnd kit触控传感器TouchSensor前端UI组件ESP32 Arduino Matter 接触传感器MatterContactSensor端点开发指南ESP32 Arduino Matter 接触传感器MatterContactSensor端点开发指南 本篇指南以 Arduino core for ESP嵌入式物联网驱动开发上一篇Prototool 使用指南下一篇F´ Fw::Types 类型系统详解从基础类型别名到 PolyType 多态类型容器创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表