你好,各位!我一直在为我的游戏开发之旅做一款2D角色控制器,而这件事情让我兴奋不已,觉得它具有一定的实用性,我想在发布它之前先在这里分享并收集社区的反馈。

以下是关于这个控制器的所有内容:

idea

该核心思想很简单:一个平台游戏的角色,可以应用力。没有kinematic控制器,无数组raycasts扫描环境,仅仅是一个 Rigidbody2D 做它最擅长的事情,上层加了一些系统,让它看起来像是一个真正的,精确的平台游戏。

我正在为我的游戏,Hello World:开发人员的故事,做这件事情,随着时间的推移,它变得成为了一个合适的框架。Coyote 时间,输入缓冲,墙壁跳跃,双重冲向,变量跳高等都是被整合进来的。可酷的是,它们是如何被组合起来的。

没有raycasting,而这是一个特性

大多数控制器都会向环境发射一大堆raycasting来检测地面和障碍物。虽然它有效,但它却有着令人讨厌的局限性:狭窄的几何学在ray之间会漏过,尖头的碰撞器会导致检测失败,而且当碰撞器形状被调整时,所有东西都会需要重新调整。

这个控制器使用物理而非Raycasting。这意味着:

  • 针头地形,细线的平台,奇怪的几何学全部就是工作。
  • 推动一个箱子,受到一个弹药的影响,或riding一个摆动平台的感受都是原生互动,全部都是免费的。
  • 站在一个滚动的桶子上,或者是一轮动转盘都需要不需要特殊的代码;物理系统会处理它。
  • 它们在本地与所有类型的2D物理作用工具都是兼容的。
  • 没有raycast数组需要通过调整来维护和调整。

图像

从头开始用modular组成

整个系统都是基于模块化设计的。每个行为都应该通过组合小的,可重用的小部件来实现。只在特定区域工作,并在碰撞壁时重置的双跳?这并不是一个自定义脚本;这三个堆叠起来的模块实现了它。以冻结水平输入,调整碰撞箱,结束随着壁壁接触的方式工作的冲向?同样的想法:只需配置即可。

这种模块化的理念不仅会一直持续到能力的层面,还会持续到能力特性模块的层面。能力是模块化的,是可重用的,是可以以模块方式组合起来的,定义了它们的逻辑,约束和影响。能力的设置可以在运行时随意替换。整个系统被设计成,就算越深入参与其中,你会越来越觉得有可能实现一些功能而不需要任何代码。

图像

它是如何建立:

1. Profile

所有的东西都在 Profile 中,Profile 是一个用于储存物理设置和角色状态下的所有能力的 ScriptableObject 资产。

你可以在运行时随时替换 Profile。瞬间,它们就是标准动作组的角色状态,而下一刻,它们就是一件低重力动作的角色状态,以完全不同的能力和物理设置呈现。系统中会发出事件,这样你就可以让你角色动画和VFX响应Profile的改变。这种方式实现了Profile切换,从而可以处理那些要求角色“完全不同”的场景。

图像

2.能力

每个 Profile 都包含一个 Abilities列表。一个能力就是一个行为:走路,跳,冲向,或者对墙壁做出滑动状。有些在压按一下就立即触发,而另一些会随着时间而持续进行。

你可以在编辑器中添加它们,配置它们,重新排列它们,直接修改它们的输入绑定而不需要修改任何代码。想要一个角色,既拥有地板冲向又拥有空中冲向吗?添加两个,都可以。想要复制一个能力,稍微调整它,做完一个又不同的版本?你可以。

到目前为止,可用的能力类型已经覆盖了所有你期望看到的类型:

  • 走路/跑步:全尺度控制,高速加速,缓解,磨损补偿。
  • 固定和变量高度跳跃:轻触一个短跳,持续时间会达到最大高度。
  • 空中跳跃:双跳,三跳,甚至能够充电的无限跳跃,重新载入任何一个表面。
  • 墙壁移动:跳,擦声,攀爬。
  • 冲向:任意方向,你可以通过动画曲线来实现。
  • 匍匐和滑行:碰撞箱尺寸会自动调整以持续时间。
  • 下降攻击:以空气中停顿下来,下下来,对冲向,反弹。
  • 空气飞行:飞行,漂浮,飞行背包。
  • 水中:游泳,潜水,漂浮驱动运动。

图像

3. 模块

每个能力都可以包含一个模块列表。模块是可重用的小型构件,会在能力被触发时发挥作用。一方面,模块会阻止某些条件才能触发某些能力;另一方面,模块会带来额外功能。

  • 接触 & Coyote 时光:任何能力都可以要求在某些面触发一次。包括地板、墙壁、高墙和斜坡在内。在每个场景中都有 Coyote 时光。因此,空中跳跃需要 Coyote 时光,但也包括墙壁跳跃、冲向,和对墙壁的反弹,在所有能力中都有。只有一个字段,而所有能力都必须使用 Coyote 时光。
  • 区域检测:在你的级别中添加一个检测器区域标签,并且任何能力都可以要求角色必须在其中才能被触发。能力只在水中,飞行模式下才能使用,...还有区域检测也能用 Coyote 时光。
  • 充电 &冷却:限制某个能力最多执行多少次并且重新载入它们(例如,着陆、壁壁接触或受敌人击中)。

从条件方面来讲,模块除此之外,还可以让角色施加力、调整碰撞箱大小、调节碰撞层数、锁定运动轴(x,y)以及在某些条件被满足时终止能力。

图像

物理世界交互是免费的

因为角色只是一个物理实体,来到世界中就是一种自然反应。

  • 推动一个箱子,就会把它推动。
  • 被弹药击中,就会随着反向被推动。
  • 在不稳定的对象上站立,就会自然获得反应。
  • 特别对于地面、固体和粘性表面等的特殊行为都能被自动检测。

图像

它现阶段的情况

这过程已经持续了很长时间了。它被建成一个角色控制系统,并且在我真正的游戏中进行了测试。所以我认为它比在孤立的情况下建立的更为坚固。

但它还不是完全完整的。还有几个小尺寸的能力和一些我期望实现的小细节待完成。但是不影响系统的核心实现。

目前,最大的问题是,我已经对编辑器进行了非常详细的优化。使用 Odin Inspector 我的编辑体验就非常棒。只是,它意味着整个包都需要 Olympia,这个库并不是可分发的。所以我必须是要在 Asset Store 上发布前换掉它还是寻找一种兼容的解决方案。所以我是关于此方面的建议,很高兴能对此展开讨论。

如果你想看一下它在实际游戏中的表现就可以看看我的游戏的 Demo,完整的是基于这个角色控制系统:

  • 玩伴:开发人员的故事

对于想要查看更多控制器的使用样例请查看如下:
*
要想告诉它更多,或者更深入的讨论,请放置你的评论和信息在此篇文章底部。感谢阅读。如果你还有问题,那么我将十分乐意回答。