[开发者心得] 【知其然】高级轮式载具+多足角色

[复制链接]
800 |1
许你春秋 发表于 2023-10-27 10:07:10 | 显示全部楼层 |阅读模式



核心原理:通过[交互物]将[角色]与[高级轮式载具]连接在一起,在控制载具移动的同时,角色播放相应的动画,来模拟坐骑运动效果。
逻辑.png



对象树结构:
载具结构.png


角色属性设置:只替换了外观
外观.png


脚本

@Component
export default class NewScript extends Script {

    /** 当脚本被实例后,会在第一帧更新前调用此函数 */
    protected async onStart(): Promise<void> {

        let NPCinter = await GameObject.asyncFindGameObjectById("1ED77DCE") as Interactor;
        let NPC = await GameObject.asyncFindGameObjectById("22D302B3") as Character;
        let vehicle = await GameObject.asyncFindGameObjectById("371C8B29") as AdvancedVehicle;

        /**
         * 设置多足角色
         * 绑定多足角色:将多足角色绑定到交互物上
         * 关闭碰撞:因为多足角色是通过交互物绑到在高级轮式载具上,所以无法和载具自身的物理碰撞进行合并,所以需要关闭多足角色的碰撞,防止与载具自身碰撞产生冲突
         */
        NPCinter.enter(NPC)
        NPC.setCollision(PropertyStatus.Off)


        //加载动画并设置动画参数
        let AnimRun = NPC.loadAnimation("181293");
        let AnimStand = NPC.loadAnimation("181291");
        AnimRun.loop = 0;
        AnimStand.loop = 0;


        //UI摇杆组件被按下,代表载具处于移动中,播放多足角色移动动画
        Event.addLocalListener("JoystickDown", () => {
            AnimRun.play();
        })

        //UI摇杆组件松开事件,代表载具即将停止移动
        Event.addLocalListener("JoystickUP", () => {
            //通过载具当前速度来判断是否已完全停止,并播放相应对画
            let CCInterval = setInterval(() => {
                if (vehicle.velocity < 0.5) {
                    AnimRun.stop();
                    AnimStand.play();
                    clearInterval(CCInterval);
                }
            }, 100);
        })

        /**
         * 模拟跳跃
         * 在载具当前位置动态生成一个冲量对象,将载具弹起,模拟跳跃的效果
         * 载具下的方块模型用来和冲量对象发生作用
         */
        InputUtil.onKeyDown(Keys.One, () => {

            let VehicleImpulse = GameObject.spawn("PhysicsImpulse") as Impulse;

            //生成冲量对象的位置
            VehicleImpulse.worldTransform.position = vehicle.worldTransform.position;

            //以当前载具的方向来设置冲量对象的方向
            VehicleImpulse.worldTransform.rotation = vehicle.worldTransform.rotation;

            //设置冲量对象属性
            VehicleImpulse.impulseVector = new Vector(500, 0, 1000)

            //完成“跳跃”后,销毁冲量对象
            setTimeout(() => {
                VehicleImpulse.destroy();
            }, 1000);
        })
    }
}

回复

使用道具 举报

叽里咕噜小胡桃 发表于 2023-10-27 10:09:48 | 显示全部楼层
优化表现效果来说 可以把四组对象跑步动画的播放速度与载具行进速度挂钩,这样表现会更自然一些~
回复

使用道具 举报

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