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.

96 lines
2.4 KiB
C#

6 months ago
using UnityEngine;
using System.Collections;
namespace RootMotion.FinalIK {
/// <summary>
/// Contains and manages a set of constraints.
/// </summary>
[System.Serializable]
public class Constraints {
#region Main Interface
/// <summary>
/// The transform.
/// </summary>
public Transform transform;
/// <summary>
/// The target.
/// </summary>
public Transform target;
/// <summary>
/// The position offset.
/// </summary>
public Vector3 positionOffset;
/// <summary>
/// The position to lerp to by positionWeight
/// </summary>
public Vector3 position;
/// <summary>
/// The weight of lerping to position
/// </summary>
[Range(0f, 1f)]
public float positionWeight;
/// <summary>
/// The rotation offset.
/// </summary>
public Vector3 rotationOffset;
/// <summary>
/// The rotation to slerp to by rotationWeight
/// </summary>
public Vector3 rotation;
/// <summary>
/// The weight of slerping to rotation
/// </summary>
[Range(0f, 1f)]
public float rotationWeight;
private Vector3 defaultLocalPosition;
private Quaternion defaultLocalRotation;
/// <summary>
/// Determines whether this instance is valid.
/// </summary>
public bool IsValid() {
return transform != null;
}
/// <summary>
/// Initiate to the specified transform.
/// </summary>
public void Initiate(Transform transform) {
this.transform = transform;
this.position = transform.position;
this.rotation = transform.eulerAngles;
defaultLocalPosition = transform.localPosition;
defaultLocalRotation = transform.localRotation;
}
public void FixTransforms()
{
transform.localPosition = defaultLocalPosition;
transform.localRotation = defaultLocalRotation;
}
/// <summary>
/// Updates the constraints.
/// </summary>
public void Update() {
if (!IsValid()) return;
// Position
if (target != null) position = target.position;
transform.position += positionOffset;
if (positionWeight > 0f) transform.position = Vector3.Lerp(transform.position, position, positionWeight);
// Rotation
if (target != null) rotation = target.eulerAngles;
transform.rotation = Quaternion.Euler(rotationOffset) * transform.rotation;
if (rotationWeight > 0f) transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.Euler(rotation), rotationWeight);
}
#endregion Main Interface
}
}