78 lines
1.6 KiB
C#
78 lines
1.6 KiB
C#
using System;
|
|
using UnityEngine;
|
|
|
|
namespace RoR2;
|
|
|
|
public class LimbMatcher : MonoBehaviour
|
|
{
|
|
[Serializable]
|
|
public struct LimbPair
|
|
{
|
|
public Transform originalTransform;
|
|
|
|
public string targetChildLimb;
|
|
|
|
public float originalLimbLength;
|
|
|
|
[NonSerialized]
|
|
public Transform targetTransform;
|
|
}
|
|
|
|
public bool scaleLimbs = true;
|
|
|
|
private bool valid;
|
|
|
|
public LimbPair[] limbPairs;
|
|
|
|
public void SetChildLocator(ChildLocator childLocator)
|
|
{
|
|
valid = true;
|
|
for (int i = 0; i < limbPairs.Length; i++)
|
|
{
|
|
LimbPair limbPair = limbPairs[i];
|
|
Transform transform = childLocator.FindChild(limbPair.targetChildLimb);
|
|
if (!transform)
|
|
{
|
|
valid = false;
|
|
break;
|
|
}
|
|
limbPairs[i].targetTransform = transform;
|
|
}
|
|
}
|
|
|
|
private void LateUpdate()
|
|
{
|
|
UpdateLimbs();
|
|
}
|
|
|
|
private void UpdateLimbs()
|
|
{
|
|
if (!valid)
|
|
{
|
|
return;
|
|
}
|
|
for (int i = 0; i < limbPairs.Length; i++)
|
|
{
|
|
LimbPair limbPair = limbPairs[i];
|
|
Transform targetTransform = limbPair.targetTransform;
|
|
if (!targetTransform || !limbPair.originalTransform)
|
|
{
|
|
continue;
|
|
}
|
|
limbPair.originalTransform.position = targetTransform.position;
|
|
limbPair.originalTransform.rotation = targetTransform.rotation;
|
|
if (i < limbPairs.Length - 1)
|
|
{
|
|
float num = Vector3.Magnitude(limbPairs[i + 1].targetTransform.position - targetTransform.position);
|
|
float originalLimbLength = limbPair.originalLimbLength;
|
|
if (scaleLimbs)
|
|
{
|
|
Vector3 localScale = limbPair.originalTransform.localScale;
|
|
localScale.y = num / originalLimbLength;
|
|
limbPair.originalTransform.localScale = localScale;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|