Skip to content
运动器

运动器

阅读本文预计 10 分钟

本文概述了编辑器中运动器的相关定义及使用方法。

什么是运动器

运动器可以做为一个对象的子级,为父级提供平移、旋转、缩放、单摆基础运动能力。运动器自带的平滑属性,可以自动的处理运动时曲线效果及同步问题。 运动器会以父对象的轴心点为中心进行运动。 运动器无法为角色、NPC提供运动能力。

运动器属性

约束设置

名称属性说明
自动启用enable是否自动运行运动效果
平滑运动smooth是否开启自动平滑计算

平移设置

设置后,为父级对象提供平移运动效果

名称属性说明
速度linearSpeed设置各轴方向上的运动速度
延时启动时间linearDelayStartTime设置首次运行时的延迟启动时间
重复执行linearRepeat是否开启往返运动效果
单程运动时间linearRepeatTime[重复执行]二级属性,填入时间(秒)后,对象运动到达指定时间,自动执行反向运动
到达后停顿时间linearRepeatDelay[重复执行]二级属性,填入时间(秒)后,对象达到终点后,停顿 N 秒开始执行反向运动
返程后停顿时间linearReturnDelay[重复执行]二级属性,填入时间(秒)后,对象返回起点后,停顿 N 秒开始执行反向运动

旋转设置

设置后,为父级对象提供旋转运动效果

名称属性说明
速度rotationSpeed设置各轴方向上的运动速度
延时启动时间rotationDelayStartTime设置首次运行时的延迟启动时间
重复执行rotationRepeat是否开启往返运动效果
单程运动时间rotationRepeatTime[重复执行]二级属性,填入时间(秒)后,对象运动到达指定时间,自动执行反向运动
到达后停顿时间rotationRepeatDelay[重复执行]二级属性,填入时间(秒)后,对象达到终点后,停顿 N 秒开始执行反向运动
返程后停顿时间rotationReturnDelay[重复执行]二级属性,填入时间(秒)后,对象返回起点后,停顿 N 秒开始执行反向运动

缩放设置

设置后,为父级对象提供缩放运动效果

名称属性说明
速度scaleSpeed设置各轴方向上的运动速度
延时启动时间scaleDelayStartTime设置首次运行时的延迟启动时间
重复执行scaleRepeat是否开启往返运动效果
单程运动时间scaleRepeatTime[重复执行]二级属性,填入时间(秒)后,对象运动到达指定时间,自动执行反向运动
到达后停顿时间scaleRepeatDelay[重复执行]二级属性,填入时间(秒)后,对象达到终点后,停顿 N 秒开始执行反向运动
返程后停顿时间scaleReturnDelay[重复执行]二级属性,填入时间(秒)后,对象返回起点后,停顿 N 秒开始执行反向运动

单摆设置

设置后,为父级对象提供单摆运动效果,单摆运动以父级对象锚点为轴心进行运动

名称属性说明
速度swingSpeed设置各轴方向上的运动速度
延时启动时间swingDelayStartTime设置首次运行时的延迟启动时间
摆动角度swingAngle设置摆动一侧的最大角度,需要注意在同时设置了多个轴方向的摆动时,会出现摆动幅度异常的情况,推荐只使用一个轴方向上进行摆动。

如何创建运动器

在编辑器内创建

在编辑器左侧【游戏功能对象】选项中,找到【运动功能对象】,点击其中的【运动器】,拖拽到主视口中想要实现运动效果的对象子级,即可完成创建。

动态创建运动器

ts
@Component
export default class NewScript2 extends Script {

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

        /**
         * 通过spawnGameObject()动态创建运动器,需要注意被绑定的对象是双端状态时,需要在服务端创建运动器;被绑定的对象是客端户时,需要在对应的客户端进行创建运动器;
         *运动器创建后,要绑定到需要运动的对象子级,来驱使父级对象进行运动。
         */

        let ModelBox = mw.GameObject.findGameObjectById("28309E5C") as mw.Model;  //获取场景中需要运动的模型;
        let IntegratedMoverMain = mw.GameObject.spawn("PhysicsSports") as mw.IntegratedMover;  //动态创建一个运动器功能对象

        IntegratedMoverMain.parent = ModelBox;   //将运动器绑定到需要运动的对象子级。
        IntegratedMoverMain.rotationSpeed = new mw.Vector(0, 0, 40);  //设置运动器的旋转运动效果,同样可以设置其他运动方式,详情可查看运动器API文档。
        IntegratedMoverMain.enable = true;            //启动运动器,运行工程查看运动效果。

    }
}
@Component
export default class NewScript2 extends Script {

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

        /**
         * 通过spawnGameObject()动态创建运动器,需要注意被绑定的对象是双端状态时,需要在服务端创建运动器;被绑定的对象是客端户时,需要在对应的客户端进行创建运动器;
         *运动器创建后,要绑定到需要运动的对象子级,来驱使父级对象进行运动。
         */

        let ModelBox = mw.GameObject.findGameObjectById("28309E5C") as mw.Model;  //获取场景中需要运动的模型;
        let IntegratedMoverMain = mw.GameObject.spawn("PhysicsSports") as mw.IntegratedMover;  //动态创建一个运动器功能对象

        IntegratedMoverMain.parent = ModelBox;   //将运动器绑定到需要运动的对象子级。
        IntegratedMoverMain.rotationSpeed = new mw.Vector(0, 0, 40);  //设置运动器的旋转运动效果,同样可以设置其他运动方式,详情可查看运动器API文档。
        IntegratedMoverMain.enable = true;            //启动运动器,运行工程查看运动效果。

    }
}

运动器高级使用方法

组合运动效果

通过设置运动器的[延迟启动时]、[停顿时间]属性,可以制作出复杂的组合运动效果。

注意事项

**使用时只要将运动器放置在需要运动的对象子级即可,将运动对象开启物理模拟时,会优先计算物理模拟,出现运动效果异常情况。

运动器回调事件使用方法

ts
@Component
export default class NewScript3 extends Script {

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

        let IntegratedMoverMain = this.gameObject as mw.IntegratedMover;

        //运动器首次启动时回调事件,只执行一次。
        IntegratedMoverMain.onRotationEnable.add(() => {
            console.log(`onRotationEnable`);
        });

        //运动器单程运动达到终点时的回调事件。
        IntegratedMoverMain.onRotationReturn.add(() => {
            console.log(`onRotationReturn`);
        });

        //运动器单程运动返回起点时的回调事件。
        IntegratedMoverMain.onRotationStart.add(() => {
            console.log(`onRotationStart`);
        });
    }
}
@Component
export default class NewScript3 extends Script {

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

        let IntegratedMoverMain = this.gameObject as mw.IntegratedMover;

        //运动器首次启动时回调事件,只执行一次。
        IntegratedMoverMain.onRotationEnable.add(() => {
            console.log(`onRotationEnable`);
        });

        //运动器单程运动达到终点时的回调事件。
        IntegratedMoverMain.onRotationReturn.add(() => {
            console.log(`onRotationReturn`);
        });

        //运动器单程运动返回起点时的回调事件。
        IntegratedMoverMain.onRotationStart.add(() => {
            console.log(`onRotationStart`);
        });
    }
}

运动器重置接口使用方法

ts
        /**
        *运动器重置接口moverReset()可以将正在运行的运动器重置回初始状态,并可以通过执行回调重新设置运动器参数
        */
        let IntegratedMoverMain = this.gameObject as mw.IntegratedMover;  // 指向场景中的运动器
        IntegratedMoverMain.enable = true;  //启用运动器
        setTimeout(() => {
            //5秒后将运动器重置,并关闭运动器
            IntegratedMoverMain.moverReset(() => {
                IntegratedMoverMain.enable = false;
            });
        }, 5000);
        /**
        *运动器重置接口moverReset()可以将正在运行的运动器重置回初始状态,并可以通过执行回调重新设置运动器参数
        */
        let IntegratedMoverMain = this.gameObject as mw.IntegratedMover;  // 指向场景中的运动器
        IntegratedMoverMain.enable = true;  //启用运动器
        setTimeout(() => {
            //5秒后将运动器重置,并关闭运动器
            IntegratedMoverMain.moverReset(() => {
                IntegratedMoverMain.enable = false;
            });
        }, 5000);

机关预制体

在[本地资源库]-[预制体]-[机关]分类资源中,提供了部分运动器机关资源,可以直接拖拽到场景中使用。