You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

99 lines
3.6 KiB
C#

6 months ago
using UnityEngine;
using System.Collections;
namespace Autohand {
[DefaultExecutionOrder(-50)]
[RequireComponent(typeof(InterpolatedTransformUpdater))]
public class InterpolatedTransform : MonoBehaviour {
private TransformData[] m_lastTransforms;
private int m_newTransformIndex;
bool run = true;
void OnEnable() {
ForgetPreviousTransforms();
}
public void ForgetPreviousTransforms() {
m_lastTransforms = new TransformData[2];
TransformData t = new TransformData(
transform.localPosition,
transform.localRotation,
transform.localScale);
m_lastTransforms[0] = t;
m_lastTransforms[1] = t;
m_newTransformIndex = 0;
}
void FixedUpdate() {
if(run) {
TransformData newestTransform = m_lastTransforms[m_newTransformIndex];
transform.localPosition = newestTransform.position;
transform.localRotation = newestTransform.rotation;
transform.localScale = newestTransform.scale;
}
}
public void LateFixedUpdate() {
m_newTransformIndex = OldTransformIndex();
m_lastTransforms[m_newTransformIndex] = new TransformData(
transform.localPosition,
transform.localRotation,
transform.localScale);
}
void Update() {
TransformData newestTransform = m_lastTransforms[m_newTransformIndex];
TransformData olderTransform = m_lastTransforms[OldTransformIndex()];
if(run) {
transform.localPosition = Vector3.Lerp(
olderTransform.position,
newestTransform.position,
InterpolationController.InterpolationFactor);
transform.localRotation = Quaternion.Slerp(
olderTransform.rotation,
newestTransform.rotation,
InterpolationController.InterpolationFactor);
transform.localScale = Vector3.Lerp(
olderTransform.scale,
newestTransform.scale,
InterpolationController.InterpolationFactor);
}
}
public void DisableForSeconds(float time) {
if(disableForTime != null) {
StopCoroutine(disableForTime);
disableForTime = null;
}
if(gameObject.activeInHierarchy)
disableForTime = StartCoroutine(Disable(time));
}
Coroutine disableForTime;
IEnumerator Disable(float time) {
run = false;
yield return new WaitForSeconds(time);
run = true;
}
private int OldTransformIndex() {
return (m_newTransformIndex == 0 ? 1 : 0);
}
private struct TransformData {
public Vector3 position;
public Quaternion rotation;
public Vector3 scale;
public TransformData(Vector3 position, Quaternion rotation, Vector3 scale) {
this.position = position;
this.rotation = rotation;
this.scale = scale;
}
}
}
}