using System.Collections.Generic; using UnityEngine; using UnityEngine.Rendering; [ExecuteAlways] public class TransformContraint : MonoBehaviour { public Transform pivot; [Header("Constraints")] public Transform constraintA; public Transform constraintB; [Range(0f, 1f)] public float blendContraints = 0f; [Header("Blend Controls")] [Range(0f, 1f)] public float blendTotal = 0f; [Range(0f, 1f)] public float blendPosition = 0f; [Range(0f, 1f)] public float blendRotation = 0f; [Range(0f, 1f)] public float blendScale = 0f; private Vector3 positionWS; private Quaternion rotation; private Vector3 scale = Vector3.one; public float dampening = 0.1f; private Vector3 posVel; private Quaternion rotVel; private void OnEnable() { RenderPipelineManager.beginContextRendering += BeginFrame; RenderPipelineManager.endContextRendering += EndFrame; } private void OnDisable() { RenderPipelineManager.beginContextRendering -= BeginFrame; RenderPipelineManager.endContextRendering -= EndFrame; } private void Update() { // If we are in playmode we want to update the constraint every frame //if(Application.isPlaying) //UpdateConstraint(); } /// /// When out of playmode we want ot still update the position of the Transform but not commit to it since /// it will dirty the scene with changes to the transforms position. /// /// Rendering Context, this is unused in this context /// List of cameras, this is unused in this context private void BeginFrame(ScriptableRenderContext context, List cameras) { if (!Application.isPlaying) { var transform1 = transform; positionWS = transform1.position; rotation = transform1.rotation; scale = transform1.localScale; } UpdateConstraint(); } /// /// At the end of the frame, when not in Playmode we want to revert the transform back to its original state, /// doing this will not dirty the scene with changes to the transforms position. /// /// /// private void EndFrame(ScriptableRenderContext context, List cameras) { if (!Application.isPlaying) { pivot.SetPositionAndRotation(positionWS, rotation); pivot.localScale = scale; } } /// /// Updates the constraint transform based on the blend values between the two constraints. /// private void UpdateConstraint() { if (!constraintA || !constraintB) return; var targetPosition = Vector3.Lerp(constraintA.position, constraintB.position, blendContraints); var targetRotation = Quaternion.Lerp(constraintA.rotation, constraintB.rotation, blendContraints); var targetScale = Vector3.Lerp(constraintA.lossyScale, constraintB.lossyScale, blendContraints); var pos = Vector3.Lerp(transform.position, targetPosition, blendTotal * blendPosition); var rot = Quaternion.Lerp(transform.rotation, targetRotation, blendTotal * blendRotation); pivot.SetPositionAndRotation( pos, rot ); pivot.localScale = Vector3.Lerp(transform.localScale, targetScale, blendTotal * blendScale); } }