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