当前位置: 首页 > news >正文

Godot游戏如何提升触感体验

在游戏世界中,触感体验至关重要,既能极大提升玩家沉浸感,让其深度融入游戏,在操作角色或与环境互动时,通过触感反馈获得身临其境的真实感(比如动作游戏中角色攻击或受击时的振动反馈,能使玩家更直观感受战斗的激烈程度),增加紧张刺激感且让玩家更投入;也能增强游戏互动性,玩家通过触摸屏幕或手柄感受游戏元素,提高参与积极性、趣味性与可玩性。

我们换个角度,从游戏开发侧看,规模稍大的游戏都离不开游戏引擎的支持。除了广为人知的 Unreal Engine(虚幻引擎)和 Unity 外,还有一款名为 Godot 的游戏引擎——它是一款完全免费且开源的游戏引擎,其优势在于对 2D 游戏的支持(像土豆兄弟、苦痛殿堂、穹顶守护者等游戏都是基于 Godot 开发的)。尽管 Godot 也具备一定的 3D 渲染能力,但与一些成熟的商业 3D 游戏引擎(如 Unity、Unreal Engine)相比,在性能和功能方面可能稍显不足。然而在 2D 游戏开发领域,Godot 的表现相当出色,它能够高效地处理大量 2D 物体的渲染,对于像割草类这种需要大量 2D 元素的游戏而言,是个极佳的选择。

那么,Godot 游戏引擎是如何支持触感体验的呢?实际上,关于触感这块功能,Godot 仅仅提供了3个API:

 #启动手柄振动,弱电机强度weak_magnitude,强电机强度strong_magnitude,持续时间durationvoid start_joy_vibration(device: int, weak_magnitude: float, strong_magnitude: float, duration: float = 0)#停止手柄振动void stop_joy_vibration(device: int)#振动手持设备(VR手柄)void vibrate_handheld(duration_ms: int = 500)

Godot 原生 API 的优点在于,调用参数简单,易于使用。通过调整电机强度和持续时间,可以轻松实现基本的振动效果。然而,它的缺点也很明显:振动效果比较单一,无法实现变频和动态控制,调试过程复杂。这使得许多开发者往往仅将其用于简单的提示场景。

为了弥补 Godot 原生系统在触感支持方面的短板,我们把 RichTap 封装成了插件,把高品质触感体验带进了Godot游戏世界。RichTap 是瑞声科技推出的全品类触感方案。它在触觉反馈方面极为丰富,能为智能设备提供细腻且多样的振动效果。在兼容性上,RichTap 支持 Android、iOS、Windows、Mac 等多种操作系统和平台,实现一次集成多端适配。其应用领域十分广泛,已在多款游戏大作里落地。

下面是我们封装的RichtapPlayer Godot插件的简单引用:

类似于系统AudioStreamPlayer,我们创建一个RichtapPlayer节点,并添加相应的HE资源(使用RichTap Creator Pro工具软件生成的振动效果描述文件)即可使用。

RichtapPlayer插件的一个显著优点是,允许用户根据需求定制振动效果,以实现更贴合具体游戏场景的触觉体验。此外,使用RichTap Creator Pro的可视化界面可以轻松创建出复杂的振动效果,使设计师更容易完成设计,也使振动设计与游戏控制代码解耦,提升游戏开发的整体效率。在Godot编辑器中,程序员只需引入HE资源,使用RichtapPlayer节点播放就能轻松表现丰富的振动效果。另一个优点是,振动效果调试变得非常便捷,无需运行整个项目即可体验配置好的振动效果,像播放音效一样简单。

下面,我们结合一个实际的游戏项目,来演练一下RichTap Godot插件的集成与使用。我们在GitHub找到一款“人鱼大战”游戏。这款游戏的玩法是,玩家通过连接两个手柄,控制各自的人鱼,尽快捡到武器后,使用武器将对方击倒为胜。我们选择它的原因在于,它是一款支持手柄的双人对战游戏,且游戏原作不支持触感,挺适合让RichTap来一展身手的。

游戏中,我们可以充分利用触觉反馈来提升玩家体验,玩家可以感受到各自独特的拟真触觉反馈,如跳跃、挥刀、获取武器,触感的加入使得每次行动都有“掷地有声”的确认感,“无声胜有声”的效果传递着精准、直观的信息。

例如,在射击时,有子弹射出和空枪的反馈也会有所不同,子弹成功射出时,干脆、带一些颗粒感的触感可以体现开枪的后坐力和冲击感,击中对象后还有明显的撞击感来模拟真实的射击场景,空枪则是用较弱较闷的效果体现哑炮,使两种射击状态产生差异。拟真效果不同于普通的触觉反馈,不仅不会干扰游戏体验,还会大幅提升玩家的“爽感”,在丰富体验效果的同时,帮助玩家识别角色状况。此外,触感设计时还考虑到双方玩家体验的差异性:当一方击倒对手时,双方玩家会收到不同的效果,一方是快速且有金属质感地“挥刀”,一方是被击中的“倒地”和“能量喷溅”,不同的效果烘托着赢家的成就感和被打败的壮烈氛围,有趣且恰如其分的触觉效果会进一步增强游戏的沉浸感,不仅增添了游戏的趣味性,还能够让玩家更直观地感受到游戏中的动作与互动。

终于来到了 “Talk is cheap. Show me the code” 时刻。具体的集成步骤如下:

1. 将 RichTap 插件文件复制到游戏项目的 res://addons 文件夹下(如果该文件夹不存在,请先手动创建)。然后打开项目设置,切换到“插件”页,找到 RichtapPlugin 并勾选它以启用插件,如果在场景中搜索到节点RichtapPlayer,即表示插件集成成功。

2. 将设计师创建的各种HE文件导入到文件夹 assets\haptics 中(可根据个人习惯进行调整)。

3. 比如想给人鱼“拾取武器”添加一个振动效果,则先创建一个名为“Haptic”的父节点,然后在该节点下创建一个RichtapPlayer子节点,并将其重命名为“Pickup”。接着,选择pickup.he文件并将其拖动到RichtapPlayer节点的Source Clip属性中(其他效果可以按照相同方式操作)。

4. 在父节点中创建一个脚本,根据传入的游戏事件名称判断需要播放哪个RichtapPlayer节点。因为RichTap管理着多个手柄,需要通过index参数来指定让哪个手柄振动。(默认情况下,第一个连接的手柄索引为0,第二个连接的手柄索引为1)。

5. 在所有效果配置完成后,你只需在合适的地方调用play方法,即可表现相应的振动效果了。具体在哪一行最合适呢?有个小技巧,先找到播放音效的sounds.play(...),在它的下面一行添加振动就可以了!

RichTap 插件以及完整的项目代码可以从这里获取:https://github.com/RichTapHaptics/fishgame-godot。赶紧试试效果吧!

通过上面的演示,我们已经学会了如何给一个 Godot 游戏添加触感功能。如果你恰好正在开发自己的 Godot 游戏,不妨试试我们的 RichTap 插件吧。我们相信,随着技术的不断进步,Godot 游戏的触感体验在未来有着广阔的发展前景。我们也将持续完善 RichTap 插件的功能和性能,为 Godot 游戏开发者提供更好的支持。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 大佬,简单解释下“嵌入式软件开发”和“嵌入式硬件开发”的区别
  • Mistral AI 又又又开源了闭源企业级模型——Mistral-Small-Instruct-2409
  • 【图像压缩与重构】基于标准+改进BP神经网络
  • Vue 3:实现页面返回上一页的功能
  • AI驱动TDSQL-C Serverless 数据库技术实战营-ai学生选课系统数据分析
  • 基于微信小程序的购物系统+php(lw+演示+源码+运行)
  • 游戏服务器知识
  • 【全网最全】2024华为杯研赛D题完整代码建模过程+py代码(后续会更新)
  • 第五章 JSP
  • 芯片开发(1)---BQ76905---底层参数配置
  • SpringBoot 消息队列RabbitMQ 消息可靠性 数据持久化 与 LazyQueue
  • python qt5 常用
  • Why is OpenAI image generation Api returning 400 bad request in Unity?
  • 【CPU】CPU的物理核、逻辑核、超线程判断及L1、L2、L3缓存、CacheLine和CPU的TBL说明
  • Windows上创建批处理.bat文件并且注册为开机自启(Python-web微服务)
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • Centos6.8 使用rpm安装mysql5.7
  • Linux快速复制或删除大量小文件
  • Linux中的硬链接与软链接
  • Python连接Oracle
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • SpringBoot几种定时任务的实现方式
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • Vue--数据传输
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 多线程 start 和 run 方法到底有什么区别?
  • 前端js -- this指向总结。
  • 详解NodeJs流之一
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 一些css基础学习笔记
  • 译自由幺半群
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • ​决定德拉瓦州地区版图的关键历史事件
  • #HarmonyOS:Web组件的使用
  • (1)bark-ml
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (笔试题)合法字符串
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (三)elasticsearch 源码之启动流程分析
  • (三)Honghu Cloud云架构一定时调度平台
  • (一)appium-desktop定位元素原理
  • (一)插入排序
  • (原创)可支持最大高度的NestedScrollView
  • (转载)(官方)UE4--图像编程----着色器开发
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...
  • .net framework 4.8 开发windows系统服务
  • .NET 反射的使用
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • ??myeclipse+tomcat
  • @ 代码随想录算法训练营第8周(C语言)|Day57(动态规划)
  • @AliasFor 使用
  • @Conditional注解详解