using System; using System.Collections; using System.Collections.Generic; using BITKit.Core.Tuple; using UnityEngine; namespace BITKit.Physics { [Serializable] public class JointConfigure { public Transform animate; public ConfigurableJoint joint; public Quaternion InitialRotation { get; set; } } public class PhysicsBasedAnimation : MonoBehaviour { [Range(0, 1)] public float Blend; [SerializeField] private JointConfigure[] jointConfigures; [SerializeField] private float positionSpring; [SerializeField] private float positionDamper; [SerializeField] private float maximumForce; [SerializeField] private Optional> rootSync; [SerializeField] private Optional overrideMotion; [SerializeField] private Optional overrideAngularMotion; private void Start() { foreach (var x in jointConfigures) { x.InitialRotation= x.animate.localRotation; if (x.animate.localRotation != x.joint.transform.localRotation) { BIT4Log.Log($"{x.animate.name}初始旋转与关节旋转不一致,将会导致动画不正确"); } } } private void FixedUpdate() { //var spring = Mathf.Lerp(Blend,0,angularSprint); var drive = new JointDrive { positionDamper = positionDamper, positionSpring =Mathf.Lerp(0,positionSpring,Blend), maximumForce = maximumForce, }; foreach (var jointConfigure in jointConfigures) { jointConfigure.joint.angularXDrive = drive; jointConfigure.joint.angularYZDrive = drive; jointConfigure.joint.xDrive = drive; jointConfigure.joint.yDrive = drive; jointConfigure.joint.zDrive = drive; jointConfigure.joint.targetRotation = Quaternion.Inverse(jointConfigure.animate.localRotation) * jointConfigure.InitialRotation; jointConfigure.joint.targetPosition = jointConfigure.animate.localPosition; if (overrideAngularMotion.Allow) { jointConfigure.joint.angularXMotion = overrideAngularMotion.Value; jointConfigure.joint.angularYMotion = overrideAngularMotion.Value; jointConfigure.joint.angularZMotion = overrideAngularMotion.Value; } if (overrideMotion.Allow) { jointConfigure.joint.xMotion = overrideMotion.Value; jointConfigure.joint.yMotion = overrideMotion.Value; jointConfigure.joint.zMotion = overrideMotion.Value; } } if (rootSync.Allow) { var root = rootSync.Value; root.Item1.transform.localPosition = root.Item2.localPosition; root.Item1.MoveRotation(root.Item2.rotation); } } } }