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#
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;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|