2024-06-23 19:12:22 +01:00

64 lines
1.8 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace MBT
{
public abstract class Service : Decorator, IMonoBehaviourTreeTickListener
{
public float interval = 1f;
public float randomDeviation = 0f;
public bool callOnEnter = true;
/// <summary>
/// Time of the next update of the task
/// </summary>
protected float nextScheduledTime;
public override void OnEnter()
{
// Set time of the next update
nextScheduledTime = Time.time + interval + Random.Range(-randomDeviation, randomDeviation);
behaviourTree.AddTickListener(this);
if (callOnEnter)
{
Task();
}
}
public override NodeResult Execute()
{
Node node = GetChild();
if (node == null) {
return NodeResult.failure;
}
if (node.status == Status.Success || node.status == Status.Failure) {
return NodeResult.From(node.status);
}
return node.runningNodeResult;
}
public abstract void Task();
public override void OnExit()
{
behaviourTree.RemoveTickListener(this);
}
void IMonoBehaviourTreeTickListener.OnBehaviourTreeTick()
{
if (nextScheduledTime <= Time.time)
{
// Set time of the next update and run the task
nextScheduledTime = Time.time + interval + Random.Range(-randomDeviation, randomDeviation);
Task();
}
}
protected virtual void OnValidate()
{
interval = Mathf.Max(0f, interval);
randomDeviation = Mathf.Clamp(randomDeviation, 0f, interval);
}
}
}