diff --git a/src/layaAir/laya/d3/component/Animator.ts b/src/layaAir/laya/d3/component/Animator.ts
index dcfde9636..9de65f18a 100644
--- a/src/layaAir/laya/d3/component/Animator.ts
+++ b/src/layaAir/laya/d3/component/Animator.ts
@@ -883,7 +883,7 @@ export class Animator extends Component {
addtive = controllerLayer.blendingMode !== AnimatorControllerLayer.BLENDINGMODE_OVERRIDE;
switch (controllerLayer._playType) {
case 0:
- var animatorState: AnimatorState = controllerLayer._currentPlayState;
+ var animatorState: AnimatorState = playStateInfo._currentState;
var clip: AnimationClip = animatorState._clip;
var speed: number = this._speed * animatorState.speed;
var finish: boolean = playStateInfo._finish;//提前取出finish,防止最后一帧跳过
@@ -896,7 +896,7 @@ export class Animator extends Component {
}
break;
case 1:
- animatorState = controllerLayer._currentPlayState;
+ animatorState = playStateInfo._currentState;
clip = animatorState._clip;
var crossClipState: AnimatorState = controllerLayer._crossPlayState;
var crossClip: AnimationClip = crossClipState._clip;
@@ -913,7 +913,7 @@ export class Animator extends Component {
this._setClipDatasToNode(crossClipState, addtive, controllerLayer.defaultWeight, i === 0);
controllerLayer._playType = 0;//完成融合,切换到正常播放状态
- controllerLayer._currentPlayState = crossClipState;
+ playStateInfo._currentState = crossClipState;
crossPlayStateInfo._cloneTo(playStateInfo);
}
} else {
@@ -949,7 +949,7 @@ export class Animator extends Component {
this._updateClipDatas(crossClipState, addtive, crossPlayStateInfo, timerScale * crossSpeed);
this._setClipDatasToNode(crossClipState, addtive, 1.0, i === 0);
controllerLayer._playType = 0;//完成融合,切换到正常播放状态
- controllerLayer._currentPlayState = crossClipState;
+ playStateInfo._currentState = crossClipState;
crossPlayStateInfo._cloneTo(playStateInfo);
} else {
this._updateClipDatas(crossClipState, addtive, crossPlayStateInfo, timerScale * crossScale * crossSpeed);
@@ -1044,15 +1044,6 @@ export class Animator extends Component {
return this._controllerLayers[layerInex];
}
- /**
- * 获取当前的播放状态。
- * @param layerIndex 层索引。
- * @return 动画播放状态。
- */
- getCurrentAnimatorPlayState(layerInex: number = 0): AnimatorPlayState {
- return this._controllerLayers[layerInex]._playStateInfo;
- }
-
/**
* 播放动画。
* @param name 如果为null则播放默认动画,否则按名字播放动画片段。
@@ -1064,9 +1055,10 @@ export class Animator extends Component {
if (controllerLayer) {
var defaultState: AnimatorState = controllerLayer.defaultState;
if (!name && !defaultState)
- throw new Error("Animator:must have default clip value,please set clip property.");
- var curPlayState: AnimatorState = controllerLayer._currentPlayState;
+ throw new Error("Animator:must have default clip value,please set clip property.");
var playStateInfo: AnimatorPlayState = controllerLayer._playStateInfo;
+ var curPlayState: AnimatorState = playStateInfo._currentState;
+
var animatorState: AnimatorState = name ? controllerLayer._statesMap[name] : defaultState;
var clipDuration: number = animatorState._clip._duration;
@@ -1077,7 +1069,7 @@ export class Animator extends Component {
playStateInfo._resetPlayState(0.0);
(curPlayState !== null && curPlayState !== animatorState) && (this._revertDefaultKeyframeNodes(curPlayState));
controllerLayer._playType = 0;
- controllerLayer._currentPlayState = animatorState;
+ playStateInfo._currentState = animatorState;
} else {
if (normalizedTime !== Number.NEGATIVE_INFINITY) {
playStateInfo._resetPlayState(clipDuration * normalizedTime);
@@ -1118,7 +1110,7 @@ export class Animator extends Component {
var crossNodeOwners: KeyframeNodeOwner[] = controllerLayer._crossNodesOwners;
var crossNodeOwnerIndicesMap: any = controllerLayer._crossNodesOwnersIndicesMap;
- var srcAnimatorState: AnimatorState = controllerLayer._currentPlayState;
+ var srcAnimatorState: AnimatorState = controllerLayer._playStateInfo._currentState;
var destNodeOwners: KeyframeNodeOwner[] = destAnimatorState._nodeOwners;
var destCrossClipNodeIndices: number[] = controllerLayer._destCrossClipNodeIndices;
var destClip: AnimationClip = destAnimatorState._clip;
@@ -1372,6 +1364,16 @@ export class Animator extends Component {
}
}
+ /**
+ * @deprecated
+ * 获取当前的播放状态。
+ * @param layerIndex 层索引。
+ * @return 动画播放状态。
+ */
+ getCurrentAnimatorPlayState(layerInex: number = 0): AnimatorPlayState {
+ return this._controllerLayers[layerInex]._playStateInfo;
+ }
+
/**
*@internal
* [NATIVE]
diff --git a/src/layaAir/laya/d3/component/AnimatorControllerLayer.ts b/src/layaAir/laya/d3/component/AnimatorControllerLayer.ts
index 4b8e7cdbc..648aed4fc 100644
--- a/src/layaAir/laya/d3/component/AnimatorControllerLayer.ts
+++ b/src/layaAir/laya/d3/component/AnimatorControllerLayer.ts
@@ -1,78 +1,73 @@
-import { AnimatorState } from "./AnimatorState";
-import { KeyframeNodeOwner } from "./KeyframeNodeOwner";
-import { AnimatorPlayState } from "./AnimatorPlayState";
import { AnimationClip } from "../animation/AnimationClip";
import { KeyframeNodeList } from "../animation/KeyframeNodeList";
import { IClone } from "../core/IClone";
import { IReferenceCounter } from "../resource/IReferenceCounter";
import { Animator } from "./Animator";
+import { AnimatorPlayState } from "./AnimatorPlayState";
+import { AnimatorState } from "./AnimatorState";
+import { KeyframeNodeOwner } from "./KeyframeNodeOwner";
/**
* AnimatorControllerLayer
类用于创建动画控制器层。
*/
export class AnimatorControllerLayer implements IReferenceCounter, IClone {
- /**@internal */
+ /**混合模式_覆盖。 */
static BLENDINGMODE_OVERRIDE: number = 0;
- /**@internal */
+ /**混合模式_叠加。 */
static BLENDINGMODE_ADDTIVE: number = 1;
+ /**@internal */
private _defaultState: AnimatorState = null;
+ /**@internal */
private _referenceCount: number = 0;
/**@internal 0:常规播放、1:动态融合播放、2:固定融合播放*/
- _playType: number;
+ _playType: number = -1;
/**@internal */
- _crossDuration: number;
+ _crossDuration: number = -1;
/**@internal */
_crossPlayState: AnimatorState;
/**@internal */
- _crossMark: number;
+ _crossMark: number = 0;
/**@internal */
- _crossNodesOwnersCount: number;
+ _crossNodesOwnersCount: number = 0;
/**@internal */
- _crossNodesOwners: KeyframeNodeOwner[];
+ _crossNodesOwners: KeyframeNodeOwner[] = [];
/**@internal */
- _crossNodesOwnersIndicesMap: any;
+ _crossNodesOwnersIndicesMap: any = {};
/**@internal */
- _srcCrossClipNodeIndices: number[];
+ _srcCrossClipNodeIndices: number[] = [];
/**@internal */
- _destCrossClipNodeIndices: number[];
+ _destCrossClipNodeIndices: number[] = [];
/**@internal */
_animator: Animator;
/**@internal */
- _currentPlayState: AnimatorState;
- /**@internal */
_statesMap: any = {};
/**@internal */
- _states: AnimatorState[];
+ _states: AnimatorState[] = [];
/**@internal */
- _playStateInfo: AnimatorPlayState;
+ _playStateInfo: AnimatorPlayState = new AnimatorPlayState();
/**@internal */
- _crossPlayStateInfo: AnimatorPlayState;
+ _crossPlayStateInfo: AnimatorPlayState = new AnimatorPlayState();
/** 层的名称。*/
name: string;
/** 名称。*/
- blendingMode: number;
+ blendingMode: number = AnimatorControllerLayer.BLENDINGMODE_OVERRIDE;
/** 权重。*/
- defaultWeight: number;
- /** 激活时是否自动播放*/
+ defaultWeight: number = 1.0;
+ /** 激活时是否自动播放。*/
playOnWake: boolean = true;
/**
- * 获取默认动画状态。
- * @return 默认动画状态。
+ * 默认动画状态机。
*/
get defaultState(): AnimatorState {
return this._defaultState;
}
- /**
- * 设置默认动画状态。
- * @param value 默认动画状态。
- */
set defaultState(value: AnimatorState) {
this._defaultState = value;
this._statesMap[value.name] = value;
@@ -82,24 +77,12 @@ export class AnimatorControllerLayer implements IReferenceCounter, IClone {
* 创建一个 AnimatorControllerLayer
实例。
*/
constructor(name: string) {
- this._playType = -1;
- this._crossMark = 0;
- this._crossDuration = -1;
- this._crossNodesOwnersIndicesMap = {};
- this._crossNodesOwnersCount = 0;
- this._crossNodesOwners = [];
- this._currentPlayState = null;
- this._states = [];
- this._playStateInfo = new AnimatorPlayState();
- this._crossPlayStateInfo = new AnimatorPlayState();
- this._srcCrossClipNodeIndices = [];
- this._destCrossClipNodeIndices = [];
-
this.name = name;
- this.defaultWeight = 1.0;
- this.blendingMode = AnimatorControllerLayer.BLENDINGMODE_OVERRIDE;
}
+ /**
+ * @internal
+ */
private _removeClip(clipStateInfos: AnimatorState[], statesMap: any, index: number, state: AnimatorState): void {
var clip: AnimationClip = state._clip;
var clipStateInfo: AnimatorState = clipStateInfos[index];
@@ -148,8 +131,17 @@ export class AnimatorControllerLayer implements IReferenceCounter, IClone {
this._removeReference(-this._referenceCount);
}
+ /**
+ * 获取当前的播放状态。
+ * @return 动画播放状态。
+ */
+ getCurrentPlayState(): AnimatorPlayState {
+ return this._playStateInfo;
+ }
+
/**
* 获取动画状态。
+ * @return 动画状态。
*/
getAnimatorState(name: string): AnimatorState {
var state: AnimatorState = this._statesMap[name];
diff --git a/src/layaAir/laya/d3/component/AnimatorPlayState.ts b/src/layaAir/laya/d3/component/AnimatorPlayState.ts
index 71abcc868..c14e0c052 100644
--- a/src/layaAir/laya/d3/component/AnimatorPlayState.ts
+++ b/src/layaAir/laya/d3/component/AnimatorPlayState.ts
@@ -1,3 +1,5 @@
+import { AnimatorState } from "./AnimatorState";
+
/**
* AnimatorPlayState
类用于创建动画播放状态信息。
*/
@@ -20,6 +22,8 @@ export class AnimatorPlayState {
_playEventIndex: number;
/**@internal */
_lastIsFront: boolean;
+ /**@internal */
+ _currentState: AnimatorState = null;
/**
* 获取播放状态的归一化时间,整数为循环次数,小数为单次播放时间。
@@ -35,6 +39,13 @@ export class AnimatorPlayState {
return this._duration;
}
+ /**
+ * 动画状态机。
+ */
+ get animatorState(): AnimatorState {
+ return this._currentState;
+ }
+
/**
* 创建一个 AnimatorPlayState
实例。
*/
diff --git a/src/layaAir/laya/d3/component/AnimatorState.ts b/src/layaAir/laya/d3/component/AnimatorState.ts
index 9452b0dfe..70ff1fbf9 100644
--- a/src/layaAir/laya/d3/component/AnimatorState.ts
+++ b/src/layaAir/laya/d3/component/AnimatorState.ts
@@ -57,7 +57,6 @@ export class AnimatorState implements IReferenceCounter, IClone {
}
/**
- * @internal
* @implements IReferenceCounter
*/
_getReferenceCount(): number {
@@ -65,7 +64,6 @@ export class AnimatorState implements IReferenceCounter, IClone {
}
/**
- * @internal
* @implements IReferenceCounter
*/
_addReference(count: number = 1): void {
@@ -74,7 +72,6 @@ export class AnimatorState implements IReferenceCounter, IClone {
}
/**
- * @internal
* @implements IReferenceCounter
*/
_removeReference(count: number = 1): void {
@@ -83,7 +80,6 @@ export class AnimatorState implements IReferenceCounter, IClone {
}
/**
- * @internal
* @implements IReferenceCounter
*/
_clearReference(): void {