Skip to content

Commit 64d825e

Browse files
committed
fix: stateMachine transition index error and solo check error
1 parent 562b900 commit 64d825e

File tree

6 files changed

+214
-97
lines changed

6 files changed

+214
-97
lines changed

packages/core/src/animation/Animator.ts

+78-23
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { AnimatorController } from "./AnimatorController";
1010
import { AnimatorControllerLayer } from "./AnimatorControllerLayer";
1111
import { AnimatorControllerParameter, AnimatorControllerParameterValue } from "./AnimatorControllerParameter";
1212
import { AnimatorState } from "./AnimatorState";
13+
import { AnimatorStateMachine } from "./AnimatorStateMachine";
1314
import { AnimatorStateTransition } from "./AnimatorStateTransition";
1415
import { KeyframeValueType } from "./Keyframe";
1516
import { AnimatorConditionMode } from "./enums/AnimatorConditionMode";
@@ -563,6 +564,7 @@ export class Animator extends Component {
563564
lastClipTime,
564565
clipTime,
565566
playDeltaTime,
567+
true,
566568
aniUpdate
567569
)) ||
568570
(transitions.length &&
@@ -576,6 +578,7 @@ export class Animator extends Component {
576578
lastClipTime,
577579
clipTime,
578580
playDeltaTime,
581+
false,
579582
aniUpdate
580583
));
581584

@@ -918,7 +921,7 @@ export class Animator extends Component {
918921

919922
const transition =
920923
(anyStateTransitions.length &&
921-
this._applyTransitionsByCondition(layerIndex, layerData, layer, state, anyStateTransitions, aniUpdate)) ||
924+
this._applyTransitionsByCondition(layerIndex, layerData, layer, state, anyStateTransitions, true, aniUpdate)) ||
922925
(transitions.length &&
923926
this._applyStateTransitions(
924927
layerIndex,
@@ -930,6 +933,7 @@ export class Animator extends Component {
930933
clipTime,
931934
clipTime,
932935
actualDeltaTime,
936+
false,
933937
aniUpdate
934938
));
935939

@@ -998,14 +1002,15 @@ export class Animator extends Component {
9981002
layerData: AnimatorLayerData,
9991003
layer: AnimatorControllerLayer,
10001004
isForwards: boolean,
1001-
playState: AnimatorStatePlayData,
1005+
playData: AnimatorStatePlayData,
10021006
transitions: Readonly<AnimatorStateTransition[]>,
10031007
lastClipTime: number,
10041008
clipTime: number,
10051009
deltaTime: number,
1010+
checkStateMachineTransition: boolean,
10061011
aniUpdate: boolean
10071012
): AnimatorStateTransition {
1008-
const { state } = playState;
1013+
const { state } = playData;
10091014
const clipDuration = state.clip.length;
10101015
let targetTransition: AnimatorStateTransition = null;
10111016
const startTime = state.clipStartTime * clipDuration;
@@ -1016,22 +1021,28 @@ export class Animator extends Component {
10161021
layerIndex,
10171022
layerData,
10181023
layer,
1019-
playState,
1024+
playData,
10201025
transitions,
10211026
lastClipTime,
10221027
endTime,
1028+
checkStateMachineTransition,
10231029
aniUpdate
10241030
);
10251031
if (!targetTransition) {
1026-
playState.currentTransitionIndex = 0;
1032+
if (checkStateMachineTransition) {
1033+
layerData.anyTransitionIndex = 0;
1034+
} else {
1035+
playData.currentTransitionIndex = 0;
1036+
}
10271037
targetTransition = this._checkSubTransition(
10281038
layerIndex,
10291039
layerData,
10301040
layer,
1031-
playState,
1041+
playData,
10321042
transitions,
10331043
startTime,
10341044
clipTime,
1045+
checkStateMachineTransition,
10351046
aniUpdate
10361047
);
10371048
}
@@ -1040,35 +1051,43 @@ export class Animator extends Component {
10401051
layerIndex,
10411052
layerData,
10421053
layer,
1043-
playState,
1054+
playData,
10441055
transitions,
10451056
lastClipTime,
10461057
clipTime,
1058+
checkStateMachineTransition,
10471059
aniUpdate
10481060
);
10491061
}
10501062
} else {
1063+
//@todo backwards play currentIndex should not be 0
10511064
if (lastClipTime + deltaTime <= startTime) {
10521065
targetTransition = this._checkBackwardsSubTransition(
10531066
layerIndex,
10541067
layerData,
10551068
layer,
1056-
playState,
1069+
playData,
10571070
transitions,
10581071
lastClipTime,
10591072
startTime,
1073+
checkStateMachineTransition,
10601074
aniUpdate
10611075
);
10621076
if (!targetTransition) {
1063-
playState.currentTransitionIndex = transitions.length - 1;
1077+
if (checkStateMachineTransition) {
1078+
layerData.anyTransitionIndex = transitions.length - 1;
1079+
} else {
1080+
playData.currentTransitionIndex = transitions.length - 1;
1081+
}
10641082
targetTransition = this._checkBackwardsSubTransition(
10651083
layerIndex,
10661084
layerData,
10671085
layer,
1068-
playState,
1086+
playData,
10691087
transitions,
10701088
clipTime,
10711089
endTime,
1090+
checkStateMachineTransition,
10721091
aniUpdate
10731092
);
10741093
}
@@ -1077,10 +1096,11 @@ export class Animator extends Component {
10771096
layerIndex,
10781097
layerData,
10791098
layer,
1080-
playState,
1099+
playData,
10811100
transitions,
10821101
lastClipTime,
10831102
clipTime,
1103+
checkStateMachineTransition,
10841104
aniUpdate
10851105
);
10861106
}
@@ -1093,14 +1113,15 @@ export class Animator extends Component {
10931113
layerIndex: number,
10941114
layerData: AnimatorLayerData,
10951115
layer: AnimatorControllerLayer,
1096-
playState: AnimatorStatePlayData,
1116+
playData: AnimatorStatePlayData,
10971117
transitions: Readonly<AnimatorStateTransition[]>,
10981118
lastClipTime: number,
10991119
curClipTime: number,
1120+
checkStateMachineTransition: boolean,
11001121
aniUpdate: boolean
11011122
): AnimatorStateTransition {
1102-
const { state } = playState;
1103-
let transitionIndex = playState.currentTransitionIndex;
1123+
const { state } = playData;
1124+
let transitionIndex = checkStateMachineTransition ? layerData.anyTransitionIndex : playData.currentTransitionIndex;
11041125
const duration = state._getDuration();
11051126
for (let n = transitions.length; transitionIndex < n; transitionIndex++) {
11061127
const transition = transitions[transitionIndex];
@@ -1111,7 +1132,19 @@ export class Animator extends Component {
11111132
}
11121133

11131134
if (exitTime >= lastClipTime || !hasExitTime) {
1114-
playState.currentTransitionIndex = Math.min(transitionIndex + 1, n - 1);
1135+
if (checkStateMachineTransition) {
1136+
layerData.anyTransitionIndex = Math.min(transitionIndex + 1, n - 1);
1137+
} else {
1138+
playData.currentTransitionIndex = Math.min(transitionIndex + 1, n - 1);
1139+
}
1140+
1141+
if (transition.mute) continue;
1142+
1143+
const hasSolo = checkStateMachineTransition
1144+
? (<AnimatorStateMachine>transition._source)._anyHasSolo
1145+
: state._hasSoloTransition;
1146+
if (hasSolo && !transition.solo) continue;
1147+
11151148
if (this._checkConditions(state, transition)) {
11161149
if (this._applyTransition(layerIndex, layerData, layer, transition, aniUpdate)) {
11171150
return transition;
@@ -1132,10 +1165,11 @@ export class Animator extends Component {
11321165
transitions: Readonly<AnimatorStateTransition[]>,
11331166
lastClipTime: number,
11341167
curClipTime: number,
1168+
checkAnyTransition: boolean,
11351169
aniUpdate: boolean
11361170
): AnimatorStateTransition {
11371171
const { state } = playState;
1138-
let transitionIndex = playState.currentTransitionIndex;
1172+
let transitionIndex = checkAnyTransition ? layerData.anyTransitionIndex : playState.currentTransitionIndex;
11391173
const duration = playState.state._getDuration();
11401174
for (; transitionIndex >= 0; transitionIndex--) {
11411175
const transition = transitions[transitionIndex];
@@ -1146,7 +1180,19 @@ export class Animator extends Component {
11461180
}
11471181

11481182
if (exitTime <= lastClipTime || !hasExitTime) {
1149-
playState.currentTransitionIndex = Math.max(transitionIndex - 1, 0);
1183+
if (checkAnyTransition) {
1184+
layerData.anyTransitionIndex = Math.max(transitionIndex - 1, 0);
1185+
} else {
1186+
playState.currentTransitionIndex = Math.max(transitionIndex - 1, 0);
1187+
}
1188+
1189+
if (transition.mute) continue;
1190+
1191+
const hasSolo = checkAnyTransition
1192+
? (<AnimatorStateMachine>transition._source)._anyHasSolo
1193+
: state._hasSoloTransition;
1194+
if (hasSolo && !transition.solo) continue;
1195+
11501196
if (this._checkConditions(state, transition)) {
11511197
if (this._applyTransition(layerIndex, layerData, layer, transition, aniUpdate)) {
11521198
return transition;
@@ -1165,10 +1211,23 @@ export class Animator extends Component {
11651211
layer: AnimatorControllerLayer,
11661212
state: AnimatorState,
11671213
transitions: Readonly<AnimatorStateTransition[]>,
1214+
checkStateMachineTransition: boolean,
11681215
aniUpdate: boolean
11691216
): AnimatorStateTransition {
11701217
for (let i = 0, n = transitions.length; i < n; i++) {
11711218
const transition = transitions[i];
1219+
1220+
if (transition.mute) continue;
1221+
1222+
const source = transition._source;
1223+
const isAnyTransition = transition._isAny;
1224+
const hasSolo = checkStateMachineTransition
1225+
? isAnyTransition
1226+
? (<AnimatorStateMachine>source)._anyHasSolo
1227+
: (<AnimatorStateMachine>source)._entryHasSolo
1228+
: (<AnimatorState>source)._hasSoloTransition;
1229+
if (hasSolo && !transition.solo) continue;
1230+
11721231
if (this._checkConditions(state, transition)) {
11731232
if (this._applyTransition(layerIndex, layerData, layer, transition, aniUpdate)) {
11741233
return transition;
@@ -1214,10 +1273,6 @@ export class Animator extends Component {
12141273
}
12151274

12161275
private _checkConditions(state: AnimatorState, transition: AnimatorStateTransition): boolean {
1217-
if (transition.mute) return false;
1218-
1219-
if (state?._hasSoloTransition && !transition.solo) return false;
1220-
12211276
const { conditions } = transition;
12221277

12231278
let allPass = true;
@@ -1427,12 +1482,12 @@ export class Animator extends Component {
14271482

14281483
transition =
14291484
anyStateTransitions.length &&
1430-
this._applyTransitionsByCondition(layerIndex, layerData, layer, null, anyStateTransitions, aniUpdate);
1485+
this._applyTransitionsByCondition(layerIndex, layerData, layer, null, anyStateTransitions, true, aniUpdate);
14311486

14321487
if (!transition) {
14331488
transition =
14341489
entryTransitions.length &&
1435-
this._applyTransitionsByCondition(layerIndex, layerData, layer, null, entryTransitions, aniUpdate);
1490+
this._applyTransitionsByCondition(layerIndex, layerData, layer, null, entryTransitions, true, aniUpdate);
14361491
}
14371492

14381493
if (transition) {

0 commit comments

Comments
 (0)