diff --git a/packages/core/src/animation/Animator.ts b/packages/core/src/animation/Animator.ts index 4f7fa770a7..ac416522b2 100644 --- a/packages/core/src/animation/Animator.ts +++ b/packages/core/src/animation/Animator.ts @@ -9,7 +9,7 @@ import { assignmentClone, ignoreClone } from "../clone/CloneManager"; import { ClearableObjectPool } from "../utils/ClearableObjectPool"; import { AnimatorController } from "./AnimatorController"; import { AnimatorControllerLayer } from "./AnimatorControllerLayer"; -import { AnimatorControllerParameter, AnimatorControllerParameterValueType } from "./AnimatorControllerParameter"; +import { AnimatorControllerParameter, AnimatorControllerParameterValue } from "./AnimatorControllerParameter"; import { AnimatorState } from "./AnimatorState"; import { AnimatorStateTransition } from "./AnimatorStateTransition"; import { KeyframeValueType } from "./Keyframe"; @@ -54,7 +54,7 @@ export class Animator extends Component { @ignoreClone private _animationEventHandlerPool = new ClearableObjectPool(AnimationEventHandler); @ignoreClone - private _parametersValueMap: Record<string, AnimatorControllerParameterValueType> = Object.create(null); + private _parametersValueMap = <Record<string, AnimatorControllerParameterValue>>Object.create(null); @ignoreClone private _tempAnimatorStateInfo: IAnimatorStateInfo = { layerIndex: -1, state: null }; @@ -229,10 +229,10 @@ export class Animator extends Component { * @param name - The name of the parameter * @param value - The value of the parameter */ - getParameterValue(name: string): AnimatorControllerParameterValueType { + getParameterValue(name: string): AnimatorControllerParameterValue { const parameter = this._animatorController?._parametersMap[name]; if (parameter) { - return this._parametersValueMap[name] ?? parameter.value; + return this._parametersValueMap[name] ?? parameter.defaultValue; } return undefined; } @@ -242,9 +242,9 @@ export class Animator extends Component { * @param name - The name of the parameter * @param value - The value of the parameter */ - setParameterValue(name: string, value: AnimatorControllerParameterValueType) { + setParameterValue(name: string, value: AnimatorControllerParameterValue) { const parameter = this._animatorController?._parametersMap[name]; - if (parameter && parameter.value !== value) { + if (parameter && parameter.defaultValue !== value) { this._parametersValueMap[name] = value; } } @@ -599,7 +599,7 @@ export class Animator extends Component { aniUpdate ); - let costTime = actualDeltaTime; + let costTime: number; if (transition) { const clipDuration = state.clip.length; const clipEndTime = state.clipEndTime * clipDuration; @@ -622,18 +622,27 @@ export class Animator extends Component { } // Revert actualDeltaTime and update costTime srcPlayData.update(costTime - actualDeltaTime); + } else { + costTime = actualDeltaTime; } - let willSwitchState = !!transition; + let needSwitchLayerState = !!transition; const { playState } = srcPlayData; - if (playState === AnimatorStatePlayState.Finished) { + + let layerFinished: boolean; + if (!needSwitchLayerState) { + layerFinished = playState === AnimatorStatePlayState.Finished; + } else { + layerFinished = false; + } + + if (layerFinished) { layerData.layerState = LayerState.Finished; - willSwitchState = true; } // need newest value when crossFading with the next state - if (willSwitchState) { + if (needSwitchLayerState || layerFinished) { this._evaluatePlayingState( layerIndex, srcPlayData, @@ -652,7 +661,7 @@ export class Animator extends Component { this._callAnimatorScriptOnEnter(state, layerIndex); } - if (willSwitchState) { + if (needSwitchLayerState) { const remainDeltaTime = deltaTime - costTime; this._updateState(layerIndex, layerData, layer, remainDeltaTime, aniUpdate); } @@ -711,7 +720,7 @@ export class Animator extends Component { const { eventHandlers: srcEventHandlers } = srcStateData; const { state: destState, stateData: destStateData } = destPlayData; const { eventHandlers: destEventHandlers } = destStateData; - + if (srcPlayData.state.name === "squat") console.log(111); const destStateDuration = destState._getDuration(); const transitionDuration = destStateDuration * layerData.crossFadeTransition.duration; @@ -725,7 +734,7 @@ export class Animator extends Component { const { clipTime: lastSrcClipTime, playState: lastSrcPlayState } = srcPlayData; const { clipTime: lastDestClipTime, playState: lastDstPlayState } = destPlayData; - let destCostTime = 0; + let destCostTime: number; if (destPlayData.isForwards) { destCostTime = lastDestClipTime + actualDestDeltaTime > transitionDuration @@ -754,8 +763,8 @@ export class Animator extends Component { // For precision problem, loose judgment, expect to crossFade (crossWeight >= 1.0 - MathUtil.zeroTolerance || transitionDuration === 0) && (crossWeight = 1.0); - const willSwitchState = crossWeight === 1.0; - if (willSwitchState) { + const needSwitchLayerState = crossWeight === 1.0; + if (needSwitchLayerState) { this._preparePlayOwner(layerData, destState); this._callAnimatorScriptOnExit(srcState, layerIndex); destPlayData.playState === AnimatorStatePlayState.Finished && @@ -797,7 +806,7 @@ export class Animator extends Component { const remainDeltaTime = deltaTime - costTime; // For precision problem, strict judgment, expect not to update - willSwitchState && + needSwitchLayerState && remainDeltaTime > MathUtil.zeroTolerance && this._updateState(layerIndex, layerData, layer, remainDeltaTime, aniUpdate); } @@ -882,7 +891,7 @@ export class Animator extends Component { const { clipTime: lastDestClipTime, playState: lastPlayState } = destPlayData; - let destCostTime = 0; + let destCostTime: number; if (destPlayData.isForwards) { destCostTime = lastDestClipTime + actualDeltaTime > transitionDuration @@ -909,8 +918,8 @@ export class Animator extends Component { // For precision problem, loose judgment, expect to crossFade (crossWeight >= 1.0 - MathUtil.zeroTolerance || transitionDuration === 0) && (crossWeight = 1.0); - const willSwitchState = crossWeight === 1.0; - if (willSwitchState) { + const needSwitchLayerState = crossWeight === 1.0; + if (needSwitchLayerState) { this._preparePlayOwner(layerData, state); this._callAnimatorScriptOnExit(state, layerIndex); destPlayData.playState === AnimatorStatePlayState.Finished && @@ -940,7 +949,7 @@ export class Animator extends Component { crossWeight === 1.0 && this._updateCrossFadeData(layerData); // For precision problem, strict judgment, expect not to update const remainDeltaTime = deltaTime - costTime; - willSwitchState && + needSwitchLayerState && remainDeltaTime > MathUtil.zeroTolerance && this._updateState(layerIndex, layerData, layer, remainDeltaTime, aniUpdate); } diff --git a/packages/core/src/animation/AnimatorCondition.ts b/packages/core/src/animation/AnimatorCondition.ts index d5811f1afd..b930d6ecbc 100644 --- a/packages/core/src/animation/AnimatorCondition.ts +++ b/packages/core/src/animation/AnimatorCondition.ts @@ -1,4 +1,4 @@ -import { AnimatorControllerParameterValueType } from "./AnimatorControllerParameter"; +import { AnimatorControllerParameterValue } from "./AnimatorControllerParameter"; import { AnimatorConditionMode } from "./enums/AnimatorConditionMode"; /** @@ -10,5 +10,5 @@ export class AnimatorCondition { /** The name of the parameter used in the condition. */ parameterName: string; /** The AnimatorParameter's threshold value for the condition to be true. */ - threshold?: AnimatorControllerParameterValueType; + threshold?: AnimatorControllerParameterValue; } diff --git a/packages/core/src/animation/AnimatorController.ts b/packages/core/src/animation/AnimatorController.ts index 869a2cc44f..4d3178af1f 100644 --- a/packages/core/src/animation/AnimatorController.ts +++ b/packages/core/src/animation/AnimatorController.ts @@ -1,5 +1,5 @@ import { BoolUpdateFlag } from "../BoolUpdateFlag"; -import { AnimatorControllerParameter, AnimatorControllerParameterValueType } from "./AnimatorControllerParameter"; +import { AnimatorControllerParameter, AnimatorControllerParameterValue } from "./AnimatorControllerParameter"; import { UpdateFlagManager } from "../UpdateFlagManager"; import { AnimatorControllerLayer } from "./AnimatorControllerLayer"; import { ReferResource } from "../asset/ReferResource"; @@ -34,6 +34,17 @@ export class AnimatorController extends ReferResource { return this._parameters; } + /** + * Create an AnimatorController. + * @param engine - Engine to which the animatorController belongs + */ + constructor(engine: Engine); + + /** + * @deprecated + */ + constructor(); + constructor(engine?: Engine) { engine && super(engine); } @@ -41,9 +52,9 @@ export class AnimatorController extends ReferResource { /** * Add a parameter to the controller. * @param name - The name of the parameter - * @param initialValue - The initial value of the parameter + * @param defaultValue - The default value of the parameter */ - addParameter(name: string, initialValue?: AnimatorControllerParameterValueType): AnimatorControllerParameter; + addParameter(name: string, defaultValue?: AnimatorControllerParameterValue): AnimatorControllerParameter; /** * Add a parameter to the controller. @@ -51,12 +62,12 @@ export class AnimatorController extends ReferResource { */ addParameter(parameter: AnimatorControllerParameter): AnimatorControllerParameter; - addParameter(param: AnimatorControllerParameter | string, value?: AnimatorControllerParameterValueType) { + addParameter(param: AnimatorControllerParameter | string, value?: AnimatorControllerParameterValue) { if (typeof param === "string") { const name = param; param = new AnimatorControllerParameter(); param.name = name; - param.value = value; + param.defaultValue = value; } this._parametersMap[param.name] = param; this._parameters.push(param); diff --git a/packages/core/src/animation/AnimatorControllerParameter.ts b/packages/core/src/animation/AnimatorControllerParameter.ts index 01e4fbab34..ad4682d423 100644 --- a/packages/core/src/animation/AnimatorControllerParameter.ts +++ b/packages/core/src/animation/AnimatorControllerParameter.ts @@ -1,4 +1,4 @@ -export type AnimatorControllerParameterValueType = number | string | boolean; +export type AnimatorControllerParameterValue = number | string | boolean; /** * Used to communicate between scripting and the controller, parameters can be set in scripting and used by the controller. @@ -6,6 +6,6 @@ export type AnimatorControllerParameterValueType = number | string | boolean; export class AnimatorControllerParameter { /** The name of the parameter. */ name: string; - /** The initial value of the parameter. */ - value: AnimatorControllerParameterValueType; + /** The default value of the parameter. */ + defaultValue: AnimatorControllerParameterValue; } diff --git a/packages/core/src/animation/AnimatorStateTransition.ts b/packages/core/src/animation/AnimatorStateTransition.ts index c33386f7e3..e4d4a34d3f 100644 --- a/packages/core/src/animation/AnimatorStateTransition.ts +++ b/packages/core/src/animation/AnimatorStateTransition.ts @@ -1,4 +1,4 @@ -import { AnimatorControllerParameterValueType } from "./AnimatorControllerParameter"; +import { AnimatorControllerParameterValue } from "./AnimatorControllerParameter"; import { AnimatorConditionMode } from "./enums/AnimatorConditionMode"; import { AnimatorCondition } from "./AnimatorCondition"; import { AnimatorState } from "./AnimatorState"; @@ -61,7 +61,7 @@ export class AnimatorStateTransition { addCondition( mode: AnimatorConditionMode, parameterName: string, - threshold?: AnimatorControllerParameterValueType + threshold?: AnimatorControllerParameterValue ): AnimatorCondition; /** @@ -73,7 +73,7 @@ export class AnimatorStateTransition { addCondition( param: AnimatorConditionMode | AnimatorCondition, parameterName?: string, - threshold?: AnimatorControllerParameterValueType + threshold?: AnimatorControllerParameterValue ): AnimatorCondition { if (typeof param === "object") { this._conditions.push(param);