先放效果
准备工作:
滑翔道具:纸飞机[GUID:162566]
滑翔动作:使用滑翔伞02[GUID:148890]
第一步:先添加一个按钮,用来执行开伞命令(为了省事,我直接加到了默认UI里)
第二步:添加按钮逻辑(为了省事,我直接加到了默认UI脚本里)
第三步:创建一个新脚本,写滑翔伞的逻辑
@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);
}
}
第四步 运行看效果
---------------------------------------------------------------------------------------
以上就是滑翔伞的简单实现原理
|