// Use this for initialization void Start() { //check for a rigid body and if there is one create a timeRigidBody if (!rigidBody) { rigidBody = GetComponent <Rigidbody>(); } if (rigidBody) { timeRigidBody = new TimeRigidBody(this, rigidBody); } //initialize timeScale timeScale = (bOnLocalTime)? localTimeScale : TimeManager.global.timeScale; positionHistory = new TimeHistory <Vector3>(transform.position, capturePerSecond); rotationHistory = new TimeHistory <Quaternion>(transform.rotation, capturePerSecond); scaleHistory = new TimeHistory <Vector3>(transform.localScale, capturePerSecond); if (timeRigidBody != null) { realVelocityHistory = new TimeHistory <Vector3>(Vector3.zero, capturePerSecond); realAngularVelocityHistory = new TimeHistory <Vector3>(Vector3.zero, capturePerSecond); } }
public static void ForwardUpdate <T>(TimeHistory <T> timeHistory, float time, T value) { if (timeHistory.bInterpolate) { List <TimeInfoInterp <T> > hist = timeHistory.historyInterp; if (time - hist[hist.Count - 1].time > timeHistory.snapshotInterval) { if (!value.Equals(hist[hist.Count - 1].data)) { hist.Add(new TimeInfoInterp <T>(value, time)); } else { hist[hist.Count - 1].time = time; } } } else { List <TimeInfo <T> > hist = timeHistory.history; if (time - hist[hist.Count - 1].time > timeHistory.snapshotInterval) { if (!value.Equals(hist[hist.Count - 1].data)) { hist.Add(new TimeInfo <T>(value, time)); } else { hist[hist.Count - 1].time = time; } } } }
//TODO: return interpolate struct since C# can't into generics arithmatic public static TimeInfo <T> RewindTo <T>(TimeHistory <T> timeHistory, float time) { float clampedTime = (time >= 0f)? time : 0f; if (timeHistory.bInterpolate) { List <TimeInfoInterp <T> > hist = timeHistory.historyInterp; while (hist.Count > 1 && hist[hist.Count - 2].time >= clampedTime) { hist.RemoveAt(hist.Count - 1); } hist[hist.Count - 1].time = clampedTime; TimeInfo <T> valueAt = new TimeInfo <T>(hist[hist.Count - 1].data, hist[hist.Count - 1].time); return(valueAt); } else { List <TimeInfo <T> > hist = timeHistory.history; while (hist.Count > 1 && hist[hist.Count - 2].time >= clampedTime) { hist.RemoveAt(hist.Count - 1); } hist[hist.Count - 1].time = clampedTime; TimeInfo <T> valueAt = new TimeInfo <T>(hist[hist.Count - 1].data, hist[hist.Count - 1].time); return(valueAt); } }
void ForwardUpdate() { TimeHistory <Vector3> .ForwardUpdate(positionHistory, time, transform.position); TimeHistory <Quaternion> .ForwardUpdate(rotationHistory, time, transform.rotation); TimeHistory <Vector3> .ForwardUpdate(scaleHistory, time, transform.localScale); //update rigidbody info if (timeRigidBody != null) { TimeHistory <Vector3> .ForwardUpdate(realVelocityHistory, time, timeRigidBody.realVelocity); TimeHistory <Vector3> .ForwardUpdate(realAngularVelocityHistory, time, timeRigidBody.realAngularVelocity); } //TODO: update animation info }
void RewindUpdate() { TimeInfo <Vector3> posTimeInfo = TimeHistory <Vector3> .RewindTo(positionHistory, time); //used to set object's time //rewind transform transform.position = posTimeInfo.data; transform.rotation = TimeHistory <Quaternion> .RewindTo(rotationHistory, time).data; transform.localScale = TimeHistory <Vector3> .RewindTo(scaleHistory, time).data; //rewind rigidbody if (timeRigidBody != null) { timeRigidBody.realVelocity = TimeHistory <Vector3> .RewindTo(realVelocityHistory, time).data; timeRigidBody.realAngularVelocity = TimeHistory <Vector3> .RewindTo(realAngularVelocityHistory, time).data; } //TODO: rewind animation time = posTimeInfo.time; }
public void RewindBy(float seconds) { float clampedSeconds = (seconds >= 0f)? seconds : 0f; //function isn't meant for fastforwarding' TimeInfo <Vector3> posTimeInfo = TimeHistory <Vector3> .RewindTo(positionHistory, time - clampedSeconds); //used to set object's time //rewind transform transform.position = posTimeInfo.data; transform.rotation = TimeHistory <Quaternion> .RewindTo(rotationHistory, time - clampedSeconds).data; transform.localScale = TimeHistory <Vector3> .RewindTo(scaleHistory, time - clampedSeconds).data; //rewind rigidbody if (timeRigidBody != null) { timeRigidBody.realVelocity = TimeHistory <Vector3> .RewindTo(realVelocityHistory, time - clampedSeconds).data; timeRigidBody.realAngularVelocity = TimeHistory <Vector3> .RewindTo(realAngularVelocityHistory, time - clampedSeconds).data; } //TODO: rewind animation time = posTimeInfo.time; }