Closed acdamiani closed 8 months ago
I can confirm that it works perfectly now. Thank you very much for the fast help. :)
I now can abort the Wander node when the player is in range.
Here is my code. Maybe you or someone else can use it in the future:
using System.Text;
using System.Text.RegularExpressions;
using UnityEngine;
namespace Schema.Builtin.Conditionals
{
[DarkIcon("Conditionals/d_Compare")]
[LightIcon("Conditionals/Compare")]
public class CompareDistance : Conditional
{
public enum ComparisonType
{
Equal,
GreaterThan,
GreaterThanOrEqual,
LessThan,
LessThanOrEqual
}
[Tooltip("LHS Vector 1 for the Distance check")] public BlackboardEntrySelector<Vector3> firstVector;
[Tooltip("LHS Vector 2 for the distance check")] public BlackboardEntrySelector<Vector3> secondVector;
[Tooltip("RHS of the comparison")] public BlackboardEntrySelector<float> distanceToCheck;
[Tooltip("The comparison type for this operation")]
public ComparisonType comparisonType;
public override bool Evaluate(object decoratorMemory, SchemaAgent agent)
{
float distance = Vector3.Distance(firstVector.value, secondVector.value);
switch (comparisonType)
{
case ComparisonType.Equal:
return distance == distanceToCheck.value;
case ComparisonType.GreaterThan:
return distance > distanceToCheck.value;
case ComparisonType.GreaterThanOrEqual:
return distance >= distanceToCheck.value;
case ComparisonType.LessThan:
return distance < distanceToCheck.value;
case ComparisonType.LessThanOrEqual:
return distance <= distanceToCheck.value;
}
return false;
}
public override GUIContent GetConditionalContent()
{
StringBuilder sb = new StringBuilder();
sb.AppendFormat("If distance (<color=red>{0},{1}</color>) is ", firstVector.name, secondVector.name);
string cName = Regex.Replace(comparisonType.ToString(), "(\\B[A-Z])", " $1").ToLower();
switch (comparisonType)
{
case ComparisonType.Equal:
case ComparisonType.LessThanOrEqual:
case ComparisonType.GreaterThanOrEqual:
sb.AppendFormat("{0} to ", cName);
break;
case ComparisonType.GreaterThan:
case ComparisonType.LessThan:
sb.AppendFormat("{0} ", cName);
break;
}
sb.AppendFormat("<color=red>{0}</color>", distanceToCheck.name);
return new GUIContent(sb.ToString());
}
}
}
It looks like there is an issue with Conditional aborts as detailed in issue #6. It looks like a logical error in the
ExecutableNode.RunDynamicConditionals
method. It might be helpful to refactor the boolean logic here, since it's pretty messy and difficult to parse.