[开发者心得] [知其然]浅做一个滑翔伞

[复制链接]
1276 |4
许你春秋 发表于 2023-5-5 11:13:08 | 显示全部楼层 |阅读模式
先放效果



准备工作:
滑翔道具:纸飞机[GUID:162566]
滑翔动作:使用滑翔伞02[GUID:148890]

第一步:先添加一个按钮,用来执行开伞命令(为了省事,我直接加到了默认UI里)
image.png

第二步:添加按钮逻辑(为了省事,我直接加到了默认UI脚本里)
image.png

第三步:创建一个新脚本,写滑翔伞的逻辑



@Core.Class
export default class Glide extends Core.Script {

    Character: Gameplay.Character;
    GlideOG: Gameplay.Mesh;
    GlideTime: number;

    /** 当脚本被实例后,会在第一帧更新前调用此函数 */
    protected onStart(): void {
        if (Util.SystemUtil.isServer()) return;

        this.Character = Gameplay.getCurrentPlayer().character;

        //接收按钮事件,开始滑翔
        Events.addLocalListener("startGlide", () => {
            if (this.Character) {
                //通过角色是否处于跳跃姿态来判断是否正在下落,开启滑翔伞、播放动画,并修改角色参数模拟滑翔效果;
                if (this.Character.isJumping) {
                    console.log(`is jumping`);
                    this.Character.maxFallingSpeed = 250; //通过改变角色下落时的速度,模拟滑翔时的速度;
                    this.Character.gravityScale = 0.2;  //通过改变角色的重力,延长角色下落的时间,也可以通过改变最大下落速度来模拟滑翔效果;
                    this.Character.airControl = 0.8;   //设置角色在空中的控制灵活度,改不改都可以,主要是模拟在空中的一个滑翔效果;
                    this.Character.rotateRate = 90;    //设置角色在空中的转向灵活度,改不改都可以,主要是模拟在空中的一个滑翔效果;
                    this.Character.playAnimation("148890", 0);  //无限循环播放滑翔动画;

                    //创建一个滑翔伞
                    this.GlideOG = Core.GameObject.spawn({
                        guid: "162566",
                        replicates: true
                    });

                    //开伞时添加一个向上的冲量,模拟空中开伞时气流的效果;
                    this.Character.addImpulse(new Type.Vector(0, 0, 1200), true);

                    //进入滑翔状态,开始检测是否落地;
                    this.GlidingState(this.Character);
                } else {
                    console.log(`is land`);
                }
            }
        });
    }

    /**
     * 检测角色是否落地,收伞结束滑翔;
     */
    private GlidingState(chara: Gameplay.Character) {
        chara.attach(this.GlideOG, Gameplay.SlotType.LeftHand);
        this.GlideOG.relativeRotation = new Type.Rotation(-90, 0, 0,);
        this.GlideTime = setInterval(() => {
            //通过角色是否处于跳跃姿态来判断是否落地,当角色落地后销毁滑翔伞、停止动画,并恢复角色参数;
            if (chara.isJumping == false) {
                console.log(`is land`);
                this.GlideOG.destroy();
                this.Character.stopAnimation("148890");
                this.Character.maxFallingSpeed = 2048;
                this.Character.gravityScale = 1;
                this.Character.airControl = 0.2;
                this.Character.rotateRate = 180;
                clearInterval(this.GlideTime);
            }
        }, 20);
    }
}


第四步 运行看效果

---------------------------------------------------------------------------------------
以上就是滑翔伞的简单实现原理
回复

使用道具 举报

汽汽汽汽水 发表于 2023-5-5 11:15:33 | 显示全部楼层
带个小绿帽当林克
回复

使用道具 举报

喵喵哭唧唧 发表于 2023-5-5 11:16:24 | 显示全部楼层
效果很棒,泰裤辣
回复

使用道具 举报

Othanse 发表于 2023-5-5 11:19:03 | 显示全部楼层
炫得很
回复

使用道具 举报

小L 发表于 2023-5-10 10:41:29 | 显示全部楼层
回复

使用道具 举报

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