protected virtual void WiggleValue(ref WiggleProperties property, ref InternalWiggleProperties internalProperties, float duration) { InitializeRandomValues(ref property, ref internalProperties); internalProperties.limitedTimeValueSave = internalProperties.initialValue; property.LimitedTime = true; property.LimitedTimeLeft = duration; property.LimitedTimeTotal = duration; property.WigglePermitted = true; }
/// <summary> /// Animates a Vector3 value along a specified curve /// </summary> /// <param name="internalProperties"></param> /// <param name="properties"></param> /// <returns></returns> protected virtual Vector3 AnimateCurveValue(ref InternalWiggleProperties internalProperties, WiggleProperties properties) { internalProperties.timeSinceLastPause += properties.GetDeltaTime(); internalProperties.timeSinceLastChange += properties.GetDeltaTime(); // handle pause if (internalProperties.timeSinceLastPause < internalProperties.pauseDuration) { float curveProgress = (internalProperties.curveDirection == 1f) ? 1f : 0f; EvaluateCurve(properties.Curve, curveProgress, internalProperties.remapZero, internalProperties.remapOne, ref internalProperties.newValue); if (properties.RelativeCurveAmplitude) { internalProperties.newValue += internalProperties.initialValue; } } // if we're just out of a pause if (internalProperties.timeSinceLastPause == internalProperties.timeSinceLastChange) { internalProperties.timeSinceLastChange = 0f; } // if we've reached the end if (internalProperties.randomFrequency > 0) { float curveProgress = (internalProperties.timeSinceLastChange) / internalProperties.randomFrequency; if (internalProperties.curveDirection < 0f) { curveProgress = 1 - curveProgress; } EvaluateCurve(properties.Curve, curveProgress, internalProperties.remapZero, internalProperties.remapOne, ref internalProperties.newValue); if (internalProperties.timeSinceLastChange > internalProperties.randomFrequency) { internalProperties.timeSinceLastChange = 0f; internalProperties.timeSinceLastPause = 0f; if (properties.CurvePingPong) { internalProperties.curveDirection = -internalProperties.curveDirection; } RandomizeFloat(ref internalProperties.randomFrequency, properties.FrequencyMin, properties.FrequencyMax); } } if (properties.RelativeCurveAmplitude) { internalProperties.newValue = internalProperties.initialValue + internalProperties.newValue; } return(internalProperties.newValue); }
/// <summary> /// Animates a Vector3 value along a perlin noise /// </summary> /// <param name="internalProperties"></param> /// <param name="properties"></param> /// <returns></returns> protected virtual Vector3 AnimateNoiseValue(ref InternalWiggleProperties internalProperties, WiggleProperties properties) { internalProperties.noiseElapsedTime += properties.GetDeltaTime(); internalProperties.newValue.x = (Mathf.PerlinNoise(internalProperties.randomNoiseFrequency.x * internalProperties.noiseElapsedTime, internalProperties.randomNoiseShift.x) * 2.0f - 1.0f) * internalProperties.randomAmplitude.x; internalProperties.newValue.y = (Mathf.PerlinNoise(internalProperties.randomNoiseFrequency.y * internalProperties.noiseElapsedTime, internalProperties.randomNoiseShift.y) * 2.0f - 1.0f) * internalProperties.randomAmplitude.y; internalProperties.newValue.z = (Mathf.PerlinNoise(internalProperties.randomNoiseFrequency.z * internalProperties.noiseElapsedTime, internalProperties.randomNoiseShift.z) * 2.0f - 1.0f) * internalProperties.randomAmplitude.z; if (properties.RelativeAmplitude) { internalProperties.newValue += internalProperties.initialValue; } return(internalProperties.newValue); }
/// <summary> /// Computes the next Vector3 value for the specified property /// </summary> /// <param name="valueActive"></param> /// <param name="properties"></param> /// <param name="internalProperties"></param> /// <returns></returns> protected virtual bool UpdateValue(bool valueActive, WiggleProperties properties, ref InternalWiggleProperties internalProperties) { if (!valueActive) { return(false); } if (!properties.WigglePermitted) { return(false); } // handle limited time if ((properties.LimitedTime) && (properties.LimitedTimeTotal > 0f)) { float timeSave = properties.LimitedTimeLeft; properties.LimitedTimeLeft -= properties.GetDeltaTime(); if (properties.LimitedTimeLeft <= 0) { if (timeSave > 0f) { if (properties.LimitedTimeResetValue) { internalProperties.returnVector = internalProperties.limitedTimeValueSave; properties.LimitedTimeLeft = 0; properties.WigglePermitted = false; return(true); } } return(false); } } switch (properties.WiggleType) { case WiggleTypes.PingPong: return(MoveVector3TowardsTarget(ref internalProperties.returnVector, properties, ref internalProperties.startValue, internalProperties.initialValue, ref internalProperties.newValue, ref internalProperties.timeSinceLastPause, ref internalProperties.timeSinceLastChange, ref internalProperties.randomAmplitude, ref internalProperties.randomFrequency, ref internalProperties.pauseDuration, internalProperties.randomFrequency)); case WiggleTypes.Random: return(MoveVector3TowardsTarget(ref internalProperties.returnVector, properties, ref internalProperties.startValue, internalProperties.initialValue, ref internalProperties.newValue, ref internalProperties.timeSinceLastPause, ref internalProperties.timeSinceLastChange, ref internalProperties.randomAmplitude, ref internalProperties.randomFrequency, ref internalProperties.pauseDuration, internalProperties.randomFrequency)); case WiggleTypes.Noise: internalProperties.returnVector = AnimateNoiseValue(ref internalProperties, properties); return(true); case WiggleTypes.Curve: internalProperties.returnVector = AnimateCurveValue(ref internalProperties, properties); return(true); } return(false); }
/// <summary> /// Initializes internal properties of the specified wiggle value /// </summary> /// <param name="properties"></param> /// <param name="internalProperties"></param> protected virtual void InitializeRandomValues(ref WiggleProperties properties, ref InternalWiggleProperties internalProperties) { internalProperties.newValue = this.transform.localPosition; internalProperties.timeSinceLastChange = 0; internalProperties.returnVector = Vector3.zero; internalProperties.randomFrequency = UnityEngine.Random.Range(properties.FrequencyMin, properties.FrequencyMax); internalProperties.randomNoiseFrequency = Vector3.zero; internalProperties.randomAmplitude = Vector3.zero; internalProperties.timeSinceLastPause = 0; internalProperties.pauseDuration = 0; internalProperties.noiseElapsedTime = 0; internalProperties.curveDirection = 1f; properties.LimitedTimeLeft = properties.LimitedTimeTotal; RandomizeVector3(ref internalProperties.randomAmplitude, properties.AmplitudeMin, properties.AmplitudeMax); RandomizeVector3(ref internalProperties.randomNoiseFrequency, properties.NoiseFrequencyMin, properties.NoiseFrequencyMax); RandomizeVector3(ref internalProperties.randomNoiseShift, properties.NoiseShiftMin, properties.NoiseShiftMax); RandomizeVector3(ref internalProperties.remapZero, properties.RemapCurveZeroMin, properties.RemapCurveZeroMax); RandomizeVector3(ref internalProperties.remapOne, properties.RemapCurveOneMin, properties.RemapCurveOneMax); internalProperties.newValue = DetermineNewValue(properties, internalProperties.newValue, internalProperties.initialValue, ref internalProperties.startValue, ref internalProperties.randomAmplitude, ref internalProperties.randomFrequency, ref internalProperties.pauseDuration); }
/// <summary> /// Initializes internal properties of the specified wiggle value /// </summary> /// <param name="properties"></param> /// <param name="internalProperties"></param> protected virtual void InitializeRandomValues(ref WiggleProperties properties, ref InternalWiggleProperties internalProperties) { internalProperties.newValue = Vector3.zero; internalProperties.timeSinceLastChange = 0; internalProperties.returnVector = Vector3.zero; internalProperties.randomFrequency = 0f; internalProperties.randomNoiseFrequency = Vector3.zero; internalProperties.randomAmplitude = Vector3.zero; internalProperties.timeSinceLastPause = 0; internalProperties.pauseDuration = 0; internalProperties.noiseElapsedTime = 0; properties.LimitedTimeLeft = properties.LimitedTimeTotal; RandomizeVector3(ref internalProperties.randomAmplitude, properties.AmplitudeMin, properties.AmplitudeMax); RandomizeVector3(ref internalProperties.randomNoiseFrequency, properties.NoiseFrequencyMin, properties.NoiseFrequencyMax); RandomizeVector3(ref internalProperties.randomNoiseShift, properties.NoiseShiftMin, properties.NoiseShiftMax); internalProperties.newValue = DetermineNewValue(properties, internalProperties.newValue, internalProperties.initialValue, ref internalProperties.startValue, ref internalProperties.randomAmplitude, ref internalProperties.randomFrequency, ref internalProperties.pauseDuration); }