[制作分享]如何实现伪物理的称重解谜
这是最近正在开发的一个解谜功能。我希望制作一个按钮,通过踩下这个按钮打开某个机关(或别的功能)。
最初的设计非常简单,踩在上面=开机关。后来发现太简单了,加了按 ↓ 蹲下打开。
后来,我为角色添加了拿箱子的功能,突然想到了重量作为解谜要素的点子,于是这个功能开发就正式开始了。
1 重量计算
首先确定主角有一个重量值,可被举起来的物件也有重量。当角色将物体举起来的时候,将该物体的重量值累加到角色身上。
在按钮上,则需要添加一个需要多少重量的数值参数,例如我目前设置的100。
最后,判定角色踩在按钮上:
- 为角色脚下添加一个虚拟点,比角色的高度低2个像素
- 判定这个虚拟点和按钮重叠
- 判定角色的重量+所持物品的重量和按钮的重量需求关系,相减得出还差多少重量才能开门
2 按钮的高度匹配
在这里我使用了一个小技巧:
- 数字的插值,让重量不是直接到达相减值,而是慢慢到达
- 为了让按钮逐步向下沉,我需要想办法让按钮的高度和当前显示的数字(缓动数字)能够匹配上。
- 按钮的踩下高度是一个序列帧动画。计算当前重量/重量需求,可以得到一个当前重量的百分比,用这个百分百对应序列帧的帧数。这样,按钮的高度就和当前的重量匹配上了。
- 甚至我可以将门的打开进度,也许用这个方法可以做那种限时通过的门?
3 修改方案
紧接着我发现一个问题:只有主角踩在按钮上的时候按钮才能称重。但是物体单独放在上面的时候重量都不会改变:
以上3种情况(甚至叠着多个箱子)都会无法称重。
解决方案:
- 在按钮上添加变量,记录当前按钮上所有的物体+角色的重量,用于和重量需求做比较
- 当按钮被创建的时候,为按钮创建一个虚拟碰撞体。这个碰撞体用来检测按钮上到底都放了什么,他们的重量是多少,并记录所有物体的重量总和
- 碰撞体的宽度=按钮宽度
- 碰撞体的高度=按钮向上检测到屋顶(或其他阻挡物)
- 接下来就是计算检测环节了:
- 计算碰撞区域内的角色重量+手持物体重量,须满足角色并没有跳起来,处于地面(包括站在其他物体上)
- 计算碰撞区域内的所有物体的重量,须满足物体没有在空中,处于地面(包括落在其他物体上),并且没有被玩家拿着)
- 最后将所有物体的重量相加计算出当前按钮上所有物体的综合重量
- 注意,这个解决方案并不完美,例如在L拐角的位置,按钮上方有半个阻挡块,或有其它新规则物体的情况。但在当前规则下应该足够使用了。所以当游戏添加新的规则时还需要注意不要与其冲突。
很棒,很有趣