90 lines
2.7 KiB
C#
90 lines
2.7 KiB
C#
|
using UnityEngine;
|
||
|
using System.Collections;
|
||
|
using System.Reflection;
|
||
|
using UnityEngine.Events;
|
||
|
|
||
|
namespace Dreamteck.Splines
|
||
|
{
|
||
|
[AddComponentMenu("Dreamteck/Splines/Users/Length Calculator")]
|
||
|
public class LengthCalculator : SplineUser
|
||
|
{
|
||
|
[System.Serializable]
|
||
|
public class LengthEvent
|
||
|
{
|
||
|
public bool enabled = true;
|
||
|
public float targetLength = 0f;
|
||
|
public UnityEvent onChange = new UnityEvent();
|
||
|
public enum Type { Growing, Shrinking, Both}
|
||
|
public Type type = Type.Both;
|
||
|
|
||
|
public LengthEvent()
|
||
|
{
|
||
|
|
||
|
}
|
||
|
|
||
|
public LengthEvent(Type t)
|
||
|
{
|
||
|
type = t;
|
||
|
}
|
||
|
|
||
|
public void Check(float fromLength, float toLength)
|
||
|
{
|
||
|
if (!enabled) return;
|
||
|
bool condition = false;
|
||
|
switch (type)
|
||
|
{
|
||
|
case Type.Growing: condition = toLength >= targetLength && fromLength < targetLength; break;
|
||
|
case Type.Shrinking: condition = toLength <= targetLength && fromLength > targetLength; break;
|
||
|
case Type.Both: condition = toLength >= targetLength && fromLength < targetLength || toLength <= targetLength && fromLength > targetLength; break;
|
||
|
}
|
||
|
if (condition) onChange.Invoke();
|
||
|
}
|
||
|
}
|
||
|
[HideInInspector]
|
||
|
public LengthEvent[] lengthEvents = new LengthEvent[0];
|
||
|
[HideInInspector]
|
||
|
public float idealLength = 1f;
|
||
|
private float _length = 0f;
|
||
|
private float lastLength = 0f;
|
||
|
public float length
|
||
|
{
|
||
|
get {
|
||
|
return _length;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
protected override void Awake()
|
||
|
{
|
||
|
base.Awake();
|
||
|
_length = CalculateLength();
|
||
|
lastLength = _length;
|
||
|
for (int i = 0; i < lengthEvents.Length; i++)
|
||
|
{
|
||
|
if (lengthEvents[i].targetLength == _length) lengthEvents[i].onChange.Invoke();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
protected override void Build()
|
||
|
{
|
||
|
base.Build();
|
||
|
_length = CalculateLength();
|
||
|
if (lastLength != _length)
|
||
|
{
|
||
|
for (int i = 0; i < lengthEvents.Length; i++)
|
||
|
{
|
||
|
lengthEvents[i].Check(lastLength, _length);
|
||
|
}
|
||
|
lastLength = _length;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public void AddEvent(LengthEvent lengthEvent)
|
||
|
{
|
||
|
LengthEvent[] newEvents = new LengthEvent[lengthEvents.Length + 1];
|
||
|
lengthEvents.CopyTo(newEvents, 0);
|
||
|
newEvents[newEvents.Length - 1] = lengthEvent;
|
||
|
lengthEvents = newEvents;
|
||
|
}
|
||
|
}
|
||
|
}
|