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.

71 lines
2.2 KiB
C#

3 years ago
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace RootMotion.Dynamics
{
/// <summary>
/// Adds force and torque to a Rigidbody to make it follow a target Transform.
/// </summary>
public class RigidbodyController : MonoBehaviour
{
public Transform target;
[Range(0f, 1f)] public float forceWeight = 1f;
[Range(0f, 1f)] public float torqueWeight = 1f;
public bool useTargetVelocity = true;
private Rigidbody r;
private Vector3 lastTargetPos;
private Quaternion lastTargetRot = Quaternion.identity;
/// <summary>
/// Call this after target has been teleported
/// </summary>
public void OnTargetTeleported()
{
lastTargetPos = target.position;
lastTargetRot = target.rotation;
}
private void Start()
{
r = GetComponent<Rigidbody>();
OnTargetTeleported();
}
private void FixedUpdate()
{
Vector3 targetVelocity = Vector3.zero;
Vector3 targetAngularVelocity = Vector3.zero;
// Calculate target velocity and angular velocity
if (useTargetVelocity)
{
targetVelocity = (target.position - lastTargetPos) / Time.deltaTime;
targetAngularVelocity = PhysXTools.GetAngularVelocity(lastTargetRot, target.rotation, Time.deltaTime);
}
lastTargetPos = target.position;
lastTargetRot = target.rotation;
// Force
Vector3 force = PhysXTools.GetLinearAcceleration(r.position, target.position);
force += targetVelocity;
force -= r.velocity;
if (r.useGravity) force -= Physics.gravity * Time.deltaTime;
force *= forceWeight;
r.AddForce(force, ForceMode.VelocityChange);
// Torque
Vector3 torque = PhysXTools.GetAngularAcceleration(r.rotation, target.rotation);
torque += targetAngularVelocity;
torque -= r.angularVelocity;
torque *= torqueWeight;
r.AddTorque(torque, ForceMode.VelocityChange);
}
}
}