acdamiani / schema

Visual intelligence for the Unity game engine
https://schema-ai.com
MIT License
53 stars 4 forks source link

Conditionals do not abort lower priority nodes on failure #9

Closed acdamiani closed 8 months ago

acdamiani commented 8 months ago

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.

ijisthee commented 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());
        }
    }
}