using Rigging.Data; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; namespace Rigging.Animations { // 物理控制的动作 public class AnimationObject : MonoBehaviour { public AnimationParam animations; private Rigidbody rig; private StepHandler stepHandler; private Transform hip; public float smoothing; public float multiplier = 1f; private bool isCurrentlyLeft; public bool isLeft; public UnityEvent switchToForwardEvent; public UnityEvent switchToBackwardsEvent; public bool dontAnimateIfHoldingSomething; private float muscleMultiplier = 1f; private void Start() { rig = GetComponent(); stepHandler = base.transform.root.GetComponentInChildren(); Rigging.BodyPart.Hip componentInChildren = base.transform.root.GetComponentInChildren(); if ((bool)componentInChildren) { hip = componentInChildren.transform; } animations.SetPlayer(transform.root.GetComponent()); } private void FixedUpdate() { SetMultiplier(); AddTorque(); AddForce(); } private void AddForce() { Vector3 vector = Vector3.zero; if (isCurrentlyLeft == isLeft) { Vector3 forwardForce = animations.current.forwardForce; if (animations.current.forceSpace == PhysicsAnimation.ForceSpace.World) { vector = forwardForce; } if (animations.current.forceSpace == PhysicsAnimation.ForceSpace.Hip) { vector = hip.TransformDirection(forwardForce); } } else { Vector3 backwardsForce = animations.current.backwardsForce; if (animations.current.forceSpace == PhysicsAnimation.ForceSpace.World) { vector = backwardsForce; } if (animations.current.forceSpace == PhysicsAnimation.ForceSpace.Hip) { vector = hip.TransformDirection(backwardsForce); } } rig.AddForce(vector * muscleMultiplier * multiplier, ForceMode.Acceleration); } private void AddTorque() { Vector3 vector = ((isCurrentlyLeft != isLeft) ? hip.TransformDirection(animations.current.backwardsTorque) : hip.TransformDirection(animations.current.forwardTorque)); Vector3 toque = vector * muscleMultiplier * multiplier; //Debug.DrawLine(rig.transform.position, rig.transform.position + toque.normalized * 0.3f); rig.AddTorque(toque, ForceMode.Acceleration); } private void SetMultiplier() { if (smoothing != 0f) { float b = 1f; if (isCurrentlyLeft != stepHandler.isLeft) { b = 0f; } multiplier = Mathf.Lerp(multiplier, b, 1f / smoothing); if (multiplier < 0.1f) { ChangeStep(); } } else { ChangeStep(); } } private void ChangeStep() { if (isCurrentlyLeft != stepHandler.isLeft) { if (stepHandler.isLeft == isLeft) { switchToForwardEvent.Invoke(); } else { switchToBackwardsEvent.Invoke(); } isCurrentlyLeft = stepHandler.isLeft; } } } }