自定义 IntercepterTask


// bt.IntercepterTask.ts
class IntercepterTask extends BranchTask;

参考 父类 BranchTask API

拦截任务与装饰任务的用法一样,都是只接受一个子任务,且支持叠加。

与装饰任务不同的是,拦截任务是在执行子任务之前执行。

使用拦截任务可以帮助我们达到一些效果,

  • 控制子任务的执行。
    • 比如做某种测试,测试通过了才执行子任务,不通过则不执行子任务或终止正在执行的子任务。
  • 修改子任务的数据。
    • 比如读取黑板值,再赋值给子任务的属性。

API

拦截子任务

/**
 * 拦截函数。
 * @returns FAILURE 时表示不拦截,可以正常执行子任务。否则不执行子任务。
 */
protected onIntercept?(): Status;

/**
 * 拦截函数的调用时机。
 * @btprop 在 behavior-dog 属性检查器上可见
 */
public phase: IntercepterPhaseType;

/**
 * 可选项。
 * 共享变量,储存拦截函数的调用时间间隔。
 * 当拦截函数的调用时机 phase 是 UPDATE_INTERVAL 时生效。
 * @btprop 在 behavior-dog 属性检查器上可见
 */
public phaseInterval?: SharedNumber;

/**
 * 当拦截函数的调用时机 phase 是 UPDATE_INTERVAL 时生效。
 * 当共享变量 phaseInterval 为空时,使用 phaseIntervalDft 作为拦截时间间隔。
 * @btprop 在 behavior-dog 属性检查器上可见
 */
public phaseIntervalDft: number;

/**
 * 当拦截函数的调用时机 phase 是 UPDATE 或 UPDATE_INTERVAL 时生效。
 * 当成功拦截子任务(即拦截函数 @function onIntercept 不返回 FAILURE)时,
 *
 *     1. 如果 @function onIntercept 返回 SUCCESS ,则任务的最终执行结果由
 *        属性 statusWhenIntercepted 指定。支持 SUCCESS 和 FAILURE 2 种结果。
 *
 *     2. 如果 @function onIntercept 返回的是 RUNNING ,则任务的执行结果也
 *        将是 RUNNING 。
 *
 * 默认值是 FAILURE 。
 * @btprop 在 behavior-dog 属性检查器上可见
 */
public statusWhenIntercepted: ConditionStatus;

/**
 * 拦截任务是可叠加的。
 * 多个拦截任务叠加形成一条拦截链。
 * 通过属性 taskToIntercept 可以方便地获取到拦截链最终要拦截的那个任务,即
 * 拦截链下面的第一个任务。
 */
public readonly taskToIntercept: ITask;

支持以下几种拦截函数的调用时机,

enum IntercepterPhaseType {

    /**
     * 在生命周期函数 onEnter 之前,调用拦截函数。即只在任务开始前调用拦截函数。
     * 如果拦截成功,则不会继续调用 onEnter ,任务返回 FAILURE 。
     */
    ENTER,

    /**
     * 在生命周期函数 onUpdate 之前,调用拦截函数。即每帧调用拦截函数。
     * 如果拦截成功,则不会继续调用 onUpdate ,任务可能返回 RUNNING 、 SUCCESS
     * 或 FAILURE 。
     */
    UPDATE,

    /**
     * 在生命周期函数 onUpdate 之前,每隔 phaseInterval 时间调用拦截函数,而非每帧调用。
     * 如果拦截成功,则不会继续调用 onUpdate ,任务可能返回 RUNNING 、 SUCCESS
     * 或 FAILURE 。
     */
    UPDATE_INTERVAL
};

results matching ""

    No results matching ""