[预制体] 【开发tips】实现攀爬梯子功能 | 预制体发布 |

[复制链接]
1143 |13
汽汽汽汽水 发表于 2023-6-30 14:40:19 | 显示全部楼层 |阅读模式
本帖最后由 汽汽汽汽水 于 2023-11-12 10:07 编辑

适用版本 0.27.x

效果演示:


0.27.x 版本更新说明:
在最新版本中动画在客户端播放不会自动同步到其它玩家客户端了,为了在服务端播放动画,我将预制体改为双端预制体。
目前已知存在 BUG 为刚上梯子马上下来,可能会出现动画一直播放。(确诊为编辑器BUG不能播放后马上停止),后续我也会持续更新解决。


核心逻辑设计流程图:

流程图

流程图

关键逻辑&代码讲解:

预制体结构:
image.png
1. 控制 UI。
2. 梯子模型。
3. 触发器,触发器用来确定梯子范围,同时要给触发器的 tag 写上 “Ladder” ,用于射线检测。
4. 梯子控制脚本。

射线检测方法:



    /**
     * 检测玩家是否面朝梯子
     * @returns 是否面朝梯子
     */
    private checkPlayerForward(): boolean {
        const character = Player.localPlayer.character;
        const fVec = character.worldTransform.getForwardVector();
        const sPos = character.worldTransform.position;
        const ePos = sPos.clone().add(fVec.multiply(50));
        const result = QueryUtil.lineTrace(sPos, ePos, false, this._debugDraw, undefined, undefined, false, character);
        if (result.length > 0) {
            if (result[0].gameObject.tag == "Ladder") {
                return true;
            }
        }
        return false;
    }

  lineTrace 函数用于发射条射线,来检测指定起点到终点连成的线段有没有碰到物体。本模块核心功能检测触地、检测到顶、检测是否可以触发都使用了它。我们分别向玩家前方和下方发射射线来检测。
  这里要注意的是频繁使用射线可能会造成性能问题,所以我在 update 中改为 200ms 检测一次,并且根据运动方向做了判断,如果是往下运动才会发射向下的射线,向上运动则发射前向射线。


// 将人物空中制动力和飞行制动 改大,这样在空中就可以没有惯性漂移
const character = Player.localPlayer.character;
character.brakingDecelerationFlying = 2000;
character.horizontalBrakingDecelerationFalling = 2000;
character.gravityScale = 0;
character.switchToFlying();


brakingDecelerationFlying & brakingDecelerationFalling ,飞行制动和下落制动在攀爬时修改为特别大,这样就不会因为突然切换飞行模式倒置的惯性影响位置。

注意事项:
角色在到达顶部时,代码中重设了玩家位置,默认向上抬高 30 单位高度,这样做是为了脱离梯子预制体更加自然。如果游戏中修改了玩家高度可能需要自己修改这部分参数。

预制体:
Ladder.zip (17.44 KB, 下载次数: 86)
回复

使用道具 举报

喵喵哭唧唧 发表于 2023-6-30 14:44:27 | 显示全部楼层
终于有了
回复

使用道具 举报

Othanse 发表于 2023-6-30 14:47:18 | 显示全部楼层
回复

使用道具 举报

下凡好辛苦啊 发表于 2023-6-30 14:51:40 | 显示全部楼层
6
回复

使用道具 举报

静若繁花 发表于 2023-6-30 16:21:12 | 显示全部楼层
太好用了
回复

使用道具 举报

kk 发表于 2023-6-30 18:15:41 | 显示全部楼层
666666666666666666
回复

使用道具 举报

内在 发表于 2023-7-20 18:07:03 | 显示全部楼层
大家用的时候有没有遇到问题
回复

使用道具 举报

内在 发表于 2023-7-20 18:08:45 | 显示全部楼层
为什么我使用没反应,获取UI有问题?
JS Execution Exception: D:\Meta\MetaApp\Editor_Win64\MetaWorldSaved\Saved\MetaWorld\Projects\testpa\dist\game.js:192: TypeError: Cannot read property 'uiWidgetBase' of null

TypeError: Cannot read property 'uiWidgetBase' of null
    at Proxy.initUI (D:\Meta\MetaApp\Editor_Win64\MetaWorldSaved\Saved\MetaWorld\Projects\testpa\dist\game.js:192:17)
    at Proxy.onStart (D:\Meta\MetaApp\Editor_Win64\MetaWorldSaved\Saved\MetaWorld\Projects\testpa\dist\game.js:151:10)
    at D:\Meta\MetaApp\Editor_Win64\WindowsNoEditor\MW\Content\JavaScript\MWUserBootstrap.js:19213:32

回复

使用道具 举报

汽汽汽汽水楼主 发表于 2023-7-20 18:13:09 | 显示全部楼层
内在 发表于 2023-7-20 18:08
为什么我使用没反应,获取UI有问题?
JS Execution Exception: D:\Meta\MetaApp\Editor_Win64\MetaWorldSa ...

我看了下是预制体导入时候 自动给我的 UI 的名字加了一个 .ui 。我更新一下预制体稍等。
回复

使用道具 举报

内在 发表于 2023-7-20 18:33:54 | 显示全部楼层
有点问题

可能需要禁用移动功能
回复

使用道具 举报

热门版块
快速回复 返回顶部 返回列表