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 {