You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
114 lines
2.7 KiB
C#
114 lines
2.7 KiB
C#
using System.Collections.Generic;
|
|
using CleverCrow.Fluid.BTs.Trees;
|
|
using UnityEngine;
|
|
|
|
namespace CleverCrow.Fluid.BTs.Tasks {
|
|
public abstract class TaskBase : GenericTaskBase, ITask {
|
|
private bool _init;
|
|
private bool _start;
|
|
private bool _exit;
|
|
private int _lastTickCount;
|
|
private bool _active;
|
|
|
|
public string Name { get; set; }
|
|
public bool Enabled { get; set; } = true;
|
|
public GameObject Owner { get; set; }
|
|
public IBehaviorTree ParentTree { get; set; }
|
|
|
|
public List<ITask> Children { get; } = null;
|
|
public TaskStatus LastStatus { get; private set; }
|
|
|
|
public override TaskStatus Update () {
|
|
base.Update();
|
|
UpdateTicks();
|
|
|
|
if (!_init) {
|
|
Init();
|
|
_init = true;
|
|
}
|
|
|
|
if (!_start) {
|
|
Start();
|
|
_start = true;
|
|
_exit = true;
|
|
}
|
|
|
|
var status = GetUpdate();
|
|
LastStatus = status;
|
|
|
|
if (status != TaskStatus.Continue) {
|
|
if (_active) ParentTree?.RemoveActiveTask(this);
|
|
Exit();
|
|
} else if (!_active) {
|
|
ParentTree?.AddActiveTask(this);
|
|
_active = true;
|
|
}
|
|
|
|
return status;
|
|
}
|
|
|
|
private void UpdateTicks () {
|
|
if (ParentTree == null) {
|
|
return;
|
|
}
|
|
|
|
if (_lastTickCount != ParentTree.TickCount) {
|
|
Reset();
|
|
}
|
|
|
|
_lastTickCount = ParentTree.TickCount;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Reset the node to be re-used
|
|
/// </summary>
|
|
public void Reset () {
|
|
_active = false;
|
|
_start = false;
|
|
_exit = false;
|
|
}
|
|
|
|
public void End () {
|
|
Exit();
|
|
}
|
|
|
|
protected virtual TaskStatus GetUpdate () {
|
|
return TaskStatus.Failure;
|
|
}
|
|
|
|
private void Init () {
|
|
OnInit();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Triggers the first time this node is run or after a hard reset
|
|
/// </summary>
|
|
protected virtual void OnInit () {
|
|
}
|
|
|
|
private void Start () {
|
|
OnStart();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Run every time this node begins
|
|
/// </summary>
|
|
protected virtual void OnStart () {
|
|
}
|
|
|
|
private void Exit () {
|
|
if (_exit) {
|
|
OnExit();
|
|
}
|
|
|
|
Reset();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Triggered when this node is complete
|
|
/// </summary>
|
|
protected virtual void OnExit () {
|
|
}
|
|
}
|
|
}
|