51 lines
1.4 KiB
C#
51 lines
1.4 KiB
C#
using UnityEngine;
|
|
|
|
namespace Obi.Samples
|
|
{
|
|
public class PinholeRatchet : MonoBehaviour
|
|
{
|
|
public ObiPinhole pinhole;
|
|
public bool direction = false;
|
|
public float teethSeparation = 0.1f;
|
|
|
|
public float distanceToNextTooth { get; private set; }
|
|
|
|
void Update()
|
|
{
|
|
if (pinhole == null || pinhole.rope == null)
|
|
return;
|
|
|
|
float restLength = (pinhole.rope as ObiRopeBase).restLength;
|
|
float normalizedTeethDistance = Mathf.Max(0.001f, teethSeparation / restLength);
|
|
var range = pinhole.range;
|
|
|
|
if (direction)
|
|
{
|
|
distanceToNextTooth = (range.y - pinhole.position) * restLength;
|
|
while (distanceToNextTooth > teethSeparation)
|
|
{
|
|
range.y -= normalizedTeethDistance;
|
|
distanceToNextTooth -= teethSeparation;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
distanceToNextTooth = (pinhole.position - range.x) * restLength;
|
|
while (distanceToNextTooth > teethSeparation)
|
|
{
|
|
range.x += normalizedTeethDistance;
|
|
distanceToNextTooth -= teethSeparation;
|
|
}
|
|
}
|
|
|
|
pinhole.range = range;
|
|
}
|
|
|
|
public void OnDisable()
|
|
{
|
|
if (pinhole != null)
|
|
pinhole.range = new Vector2(0, 1);
|
|
}
|
|
}
|
|
}
|