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