61 lines
1.1 KiB
C#
61 lines
1.1 KiB
C#
|
using UnityEngine;
|
||
|
|
||
|
public class FloatPID : MonoBehaviour
|
||
|
{
|
||
|
[Tooltip("PID Constants.")]
|
||
|
public Vector3 PID = new Vector3(1f, 0f, 0f);
|
||
|
|
||
|
public float gain = 1f;
|
||
|
|
||
|
[Tooltip("The value we are currently at.")]
|
||
|
[HideInInspector]
|
||
|
public float inputFloat;
|
||
|
|
||
|
[HideInInspector]
|
||
|
[Tooltip("The value we want to be at.")]
|
||
|
public float targetFloat;
|
||
|
|
||
|
[Tooltip("Value output from PID controller; what we read.")]
|
||
|
[HideInInspector]
|
||
|
public float outputFloat;
|
||
|
|
||
|
public float timeBetweenUpdates;
|
||
|
|
||
|
private float timer;
|
||
|
|
||
|
private float errorSum;
|
||
|
|
||
|
private float deltaError;
|
||
|
|
||
|
private float lastError;
|
||
|
|
||
|
private float lastTimer;
|
||
|
|
||
|
public bool automaticallyUpdate;
|
||
|
|
||
|
private void Start()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
private void FixedUpdate()
|
||
|
{
|
||
|
timer += Time.fixedDeltaTime;
|
||
|
if (automaticallyUpdate && timer > timeBetweenUpdates)
|
||
|
{
|
||
|
timer -= timeBetweenUpdates;
|
||
|
outputFloat = UpdatePID();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public float UpdatePID()
|
||
|
{
|
||
|
float num = timer - lastTimer;
|
||
|
lastTimer = timer;
|
||
|
float num2 = targetFloat - inputFloat;
|
||
|
errorSum += num2 * num;
|
||
|
deltaError = (num2 - lastError) / num;
|
||
|
lastError = num2;
|
||
|
return (num2 * PID.x + errorSum * PID.y + deltaError * PID.z) * gain;
|
||
|
}
|
||
|
}
|