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);