ulong NextDirtyBits() { ulong dirtyBits = 0; for (int i = 0; i < parameters.Length; i++) { AnimatorControllerParameter par = parameters[i]; bool changed = false; if (par.type == AnimatorControllerParameterType.Int) { int newIntValue = animator.GetInteger(par.nameHash); changed = newIntValue != lastIntParameters[i]; if (changed) { lastIntParameters[i] = newIntValue; } } else if (par.type == AnimatorControllerParameterType.Float) { float newFloatValue = animator.GetFloat(par.nameHash); changed = Mathf.Abs(newFloatValue - lastFloatParameters[i]) > 0.001f; // only set lastValue if it was changed, otherwise value could slowly drift within the 0.001f limit each frame if (changed) { lastFloatParameters[i] = newFloatValue; } } else if (par.type == AnimatorControllerParameterType.Bool) { bool newBoolValue = animator.GetBool(par.nameHash); changed = newBoolValue != lastBoolParameters[i]; if (changed) { lastBoolParameters[i] = newBoolValue; } } if (changed) { dirtyBits |= 1ul << i; } } return(dirtyBits); }