Example #1
0
    public virtual void EditValueComparisionConditionData(AtomConditionData ConditionData)
    {
        EditorGUILayout.BeginHorizontal();
        ConditionData.ValueComparisionCondition = (AIValueComparisionCondition)EditorGUILayout.EnumPopup(ConditionData.ValueComparisionCondition);
        ConditionData.ValueOperator             = (ValueComparisionOperator)EditorGUILayout.EnumPopup(ConditionData.ValueOperator);
        switch (ConditionData.ValueComparisionCondition)
        {
        case AIValueComparisionCondition.BehaviorLastExecutionInterval:
        case AIValueComparisionCondition.BehaveTime:
        case AIValueComparisionCondition.CurrentTagetDistance:
        case AIValueComparisionCondition.FarestEnemyDistance:
        case AIValueComparisionCondition.NearestEnemyDistance:
        case AIValueComparisionCondition.LastConditionMatchTimeInterval:
        case AIValueComparisionCondition.WaypointDistance:
            ConditionData.RightValueForComparision = EditorGUILayout.FloatField(ConditionData.RightValueForComparision);
            break;

        case AIValueComparisionCondition.RandomValue:
            ConditionData.RightValueForComparision = EditorGUILayout.Slider(ConditionData.RightValueForComparision, 0, 100);
            break;

        case AIValueComparisionCondition.CurrentTargetHPPercentage:
        case AIValueComparisionCondition.HPPercentage:
            ConditionData.RightValueForComparision = EditorGUILayout.Slider(ConditionData.RightValueForComparision, 0, 1);
            break;

        case AIValueComparisionCondition.ExeuctionCount:
        case AIValueComparisionCondition.AttackCount:
        case AIValueComparisionCondition.DoDamageCount:
            ConditionData.RightValueForComparision = EditorGUILayout.IntField((int)ConditionData.RightValueForComparision);
            break;
        }
        EditorGUILayout.EndHorizontal();
    }
Example #2
0
    void EditConditionWrapper(CompositeConditionWrapper compositionConditionWrapper)
    {
        //Edit Atom condition
        EnableEditAtomCondition = EditorGUILayout.BeginToggleGroup("Edit atom condition", EnableEditAtomCondition);
        if (EnableEditAtomCondition)
        {
            if (GUILayout.Button("Add atom condition"))
            {
                AtomConditionData atomCondition = new AtomConditionData();
                compositionConditionWrapper.atomConditionDataArray = Util.AddToArray <AtomConditionData> (atomCondition, compositionConditionWrapper.atomConditionDataArray);
            }
            foreach (AtomConditionData atomCondition in compositionConditionWrapper.atomConditionDataArray)
            {
                this.aiEditor.EditAtomConditionData(atomCondition);
                if (GUILayout.Button("Delete atom condition:" + atomCondition.Id))
                {
                    compositionConditionWrapper.atomConditionDataArray =
                        Util.CloneExcept <AtomConditionData> (compositionConditionWrapper.atomConditionDataArray, atomCondition);
                }
                EditorGUILayout.Space();
                EditorGUILayout.Space();
            }
        }
        EditorGUILayout.EndToggleGroup();

        //Edit composite condition
        EnableEditCompositeCondition = EditorGUILayout.BeginToggleGroup("Edit composite condition", EnableEditCompositeCondition);
        if (EnableEditCompositeCondition)
        {
            if (GUILayout.Button("Add composite condition"))
            {
                CompositeCondition compositeCondition = new CompositeCondition();
                compositionConditionWrapper.CompositeConditionArray = Util.AddToArray <CompositeCondition> (compositeCondition, compositionConditionWrapper.CompositeConditionArray);
            }
            foreach (CompositeCondition compositeCondition in compositionConditionWrapper.CompositeConditionArray)
            {
                this.aiEditor.EditCompositeCondition(compositeCondition, compositionConditionWrapper);
                if (GUILayout.Button("Delete composite condition:" + compositeCondition.Id))
                {
                    compositionConditionWrapper.CompositeConditionArray =
                        Util.CloneExcept <CompositeCondition> (compositionConditionWrapper.CompositeConditionArray,
                                                               compositeCondition);
                }
                EditorGUILayout.Space();
                EditorGUILayout.Space();
            }
        }
        EditorGUILayout.EndToggleGroup();

        //Edit root composite condition
        EnableEditRootCompositeCondition = EditorGUILayout.BeginToggleGroup("Edit root composite condition", EnableEditRootCompositeCondition);
        if (EnableEditRootCompositeCondition)
        {
            this.aiEditor.EditCompositeCondition(compositionConditionWrapper.RootCompositeCondition, compositionConditionWrapper);
        }
        EditorGUILayout.EndToggleGroup();
    }
Example #3
0
 public AtomConditionData GetClone()
 {
     AtomConditionData clone = new AtomConditionData();
     clone.Id = this.Id;
     clone.ConditionType = this.ConditionType;
     clone.BooleanOperator = this.BooleanOperator;
     clone.BooleanCondition = this.BooleanCondition;
     clone.CheckArea = this.CheckArea;
     clone.ValueComparisionCondition = this.ValueComparisionCondition;
     clone.ValueOperator = this.ValueOperator;
     clone.RightValueForComparision = this.RightValueForComparision;
     clone.LayerMaskForComparision = this.LayerMaskForComparision;
     clone.StringValue = this.StringValue;
     clone.StringValueArray = this.StringValueArray;
     return clone;
 }
Example #4
0
    public virtual void EditAtomConditionData(AtomConditionData ConditionData)
    {
        EditorGUILayout.LabelField(" -------------- Atom condition:" + ConditionData.Id + "------------");
        ConditionData.ConditionType = (AIBehaviorConditionType)EditorGUILayout.EnumPopup(new GUIContent("Condition type:", ""), ConditionData.ConditionType);
        ConditionData.Id            = EditorGUILayout.TextField("AtomCondition ID:", ConditionData.Id);
        switch (ConditionData.ConditionType)
        {
        case AIBehaviorConditionType.Boolean:
            EditBooleanConditionData(ConditionData);
            break;

        case AIBehaviorConditionType.ValueComparision:
            EditValueComparisionConditionData(ConditionData);
            break;
        }
    }
Example #5
0
    /// <summary>
    /// Check if the AIBehavior condition is true
    /// </summary>
    /// <param name="AIBehaviorCondition"></param>
    /// <returns></returns>
    public virtual bool CheckAtomCondition(AtomConditionData AIBehaviorCondition, AIBehavior behavior)
    {
        bool ret = false;

        switch (AIBehaviorCondition.ConditionType)
        {
        case AIBehaviorConditionType.Boolean:
            ret = CheckBooleanCondition(AIBehaviorCondition, behavior);
            break;

        case AIBehaviorConditionType.ValueComparision:
            ret = CheckValueComparisionCondition(AIBehaviorCondition, behavior);
            break;
        }
        return(ret);
    }
Example #6
0
    public CompositeConditionWrapper GetClone()
    {
        CompositeConditionWrapper clone = new CompositeConditionWrapper();

        clone.RootCompositeCondition = this.RootCompositeCondition.GetClone();
        foreach (CompositeCondition compositeCondition in this.CompositeConditionArray)
        {
            CompositeCondition cloneCompositiobCondition = compositeCondition.GetClone();
            clone.CompositeConditionArray = Util.AddToArray <CompositeCondition>(cloneCompositiobCondition, clone.CompositeConditionArray);
        }
        foreach (AtomConditionData atomCondition in this.atomConditionDataArray)
        {
            AtomConditionData cloneAtomCondition = atomCondition.GetClone();
            clone.atomConditionDataArray = Util.AddToArray <AtomConditionData>(cloneAtomCondition, clone.atomConditionDataArray);
        }
        return(clone);
    }
Example #7
0
    public AtomConditionData GetClone()
    {
        AtomConditionData clone = new AtomConditionData();

        clone.Id                        = this.Id;
        clone.ConditionType             = this.ConditionType;
        clone.BooleanOperator           = this.BooleanOperator;
        clone.BooleanCondition          = this.BooleanCondition;
        clone.CheckArea                 = this.CheckArea;
        clone.ValueComparisionCondition = this.ValueComparisionCondition;
        clone.ValueOperator             = this.ValueOperator;
        clone.RightValueForComparision  = this.RightValueForComparision;
        clone.LayerMaskForComparision   = this.LayerMaskForComparision;
        clone.StringValue               = this.StringValue;
        clone.StringValueArray          = this.StringValueArray;
        return(clone);
    }
Example #8
0
    private bool IsConditionEntityMatched(ConditionEntity conditionEntity,
                                          CompositeConditionWrapper compositeConditionWrapper,
                                          AIBehavior behavior)
    {
        bool ret = false;

        switch (conditionEntity.EntityType)
        {
        case ConditionEntityType.AtomCondition:
            AtomConditionData atomCondition = compositeConditionWrapper.AtomConditionDataDict[conditionEntity.EntityReferenceId];
            ret = CheckAtomCondition(atomCondition, behavior);
            break;

        case ConditionEntityType.ReferenceToComposite:
            CompositeCondition compositeCondition = compositeConditionWrapper.CompositeConditionDict[conditionEntity.EntityReferenceId];
            ret = IsCompositeConditionMatched(compositeCondition, compositeConditionWrapper, behavior);
            break;
        }
        return(ret);
    }
Example #9
0
    public virtual void EditBooleanConditionData(AtomConditionData ConditionData)
    {
        EditorGUILayout.BeginHorizontal();
        ConditionData.BooleanCondition = (AIBooleanConditionEnum)EditorGUILayout.EnumPopup(ConditionData.BooleanCondition);
        ConditionData.BooleanOperator  = (BooleanComparisionOperator)EditorGUILayout.EnumPopup(ConditionData.BooleanOperator);
        switch (ConditionData.BooleanCondition)
        {
        case AIBooleanConditionEnum.AlwaysTrue:
            break;

        case AIBooleanConditionEnum.CurrentTargetInLayer:
            ConditionData.LayerMaskForComparision = EditorGUILayoutx.LayerMaskField("Current target in layermask:", ConditionData.LayerMaskForComparision);
            break;

        case AIBooleanConditionEnum.EnemyInDetectiveRange:
            break;

        case AIBooleanConditionEnum.EnemyInOffensiveRange:
            break;

        case AIBooleanConditionEnum.InArea:
            ConditionData.CheckArea = (Collider)EditorGUILayout.ObjectField("Check against collider:", ConditionData.CheckArea, typeof(Collider));
            break;

        case AIBooleanConditionEnum.LatestBehaviorNameIs:
            string[] AllBehaviorName = AI.Behaviors.Select(x => x.Name).ToArray();
            ConditionData.StringValue = EditorCommon.EditPopup("behavior name:", ConditionData.StringValue
                                                               , AllBehaviorName);
            break;

        case AIBooleanConditionEnum.LastestBehaviorNameIsOneOf:
            AllBehaviorName = AI.Behaviors.Select(x => x.Name).ToArray();
            EditorGUILayout.BeginVertical();
            ConditionData.StringValueArray = EditorCommon.EditStringArray("behavior name:", ConditionData.StringValueArray
                                                                          , AllBehaviorName);
            EditorGUILayout.EndVertical();
            break;
        }
        EditorGUILayout.EndHorizontal();
    }
Example #10
0
 /// <summary>
 /// Check if the AIBehavior condition is true
 /// </summary>
 /// <param name="AIBehaviorCondition"></param>
 /// <returns></returns>
 public virtual bool CheckAtomCondition(AtomConditionData AIBehaviorCondition, AIBehavior behavior)
 {
     bool ret = false;
     switch (AIBehaviorCondition.ConditionType)
     {
         case AIBehaviorConditionType.Boolean:
             ret = CheckBooleanCondition(AIBehaviorCondition, behavior);
             break;
         case AIBehaviorConditionType.ValueComparision:
             ret = CheckValueComparisionCondition(AIBehaviorCondition, behavior);
             break;
     }
     return ret;
 }
    void EditConditionWrapper(CompositeConditionWrapper compositionConditionWrapper)
    {
        //Edit Atom condition
        EnableEditAtomCondition = EditorGUILayout.BeginToggleGroup ("Edit atom condition", EnableEditAtomCondition);
        if (EnableEditAtomCondition) {
            if (GUILayout.Button ("Add atom condition")) {
                AtomConditionData atomCondition = new AtomConditionData ();
                compositionConditionWrapper.atomConditionDataArray = Util.AddToArray<AtomConditionData> (atomCondition, compositionConditionWrapper.atomConditionDataArray);
            }
            foreach (AtomConditionData atomCondition in compositionConditionWrapper.atomConditionDataArray) {
                this.aiEditor.EditAtomConditionData (atomCondition);
                if (GUILayout.Button ("Delete atom condition:" + atomCondition.Id)) {
                    compositionConditionWrapper.atomConditionDataArray =
                      Util.CloneExcept<AtomConditionData> (compositionConditionWrapper.atomConditionDataArray, atomCondition);
                }
                EditorGUILayout.Space ();
                EditorGUILayout.Space ();
            }
        }
        EditorGUILayout.EndToggleGroup ();

        //Edit composite condition
        EnableEditCompositeCondition = EditorGUILayout.BeginToggleGroup ("Edit composite condition", EnableEditCompositeCondition);
        if (EnableEditCompositeCondition) {
            if (GUILayout.Button ("Add composite condition")) {
                CompositeCondition compositeCondition = new CompositeCondition ();
                compositionConditionWrapper.CompositeConditionArray = Util.AddToArray<CompositeCondition> (compositeCondition, compositionConditionWrapper.CompositeConditionArray);
            }
            foreach (CompositeCondition compositeCondition in compositionConditionWrapper.CompositeConditionArray) {
                this.aiEditor.EditCompositeCondition (compositeCondition, compositionConditionWrapper);
                if (GUILayout.Button ("Delete composite condition:" + compositeCondition.Id)) {
                    compositionConditionWrapper.CompositeConditionArray =
                      Util.CloneExcept<CompositeCondition> (compositionConditionWrapper.CompositeConditionArray,
                                                            compositeCondition);
                }
                EditorGUILayout.Space ();
                EditorGUILayout.Space ();
            }
        }
        EditorGUILayout.EndToggleGroup ();

        //Edit root composite condition
        EnableEditRootCompositeCondition = EditorGUILayout.BeginToggleGroup ("Edit root composite condition", EnableEditRootCompositeCondition);
        if (EnableEditRootCompositeCondition) {
            this.aiEditor.EditCompositeCondition (compositionConditionWrapper.RootCompositeCondition, compositionConditionWrapper);
        }
        EditorGUILayout.EndToggleGroup ();
    }
Example #12
0
    public void OnGUI()
    {
        if (compositionConditionWrapper == null || aiEditor == null)
        {
            EditorGUILayout.LabelField("No condition wrapper or AIEditor!!");
            return;
        }

        if (GUILayout.Button("Save"))
        {
            EditorUtility.SetDirty(aiEditor.AI);
        }

        ScrollPos = EditorGUILayout.BeginScrollView(ScrollPos, false, true, null);

        //Edit Atom condition
        EnableEditAtomCondition = EditorGUILayout.BeginToggleGroup("Edit atom condition", EnableEditAtomCondition);
        if (EnableEditAtomCondition)
        {
            if (GUILayout.Button("Add atom condition"))
            {
                AtomConditionData atomCondition = new AtomConditionData();
                compositionConditionWrapper.atomConditionDataArray = Util.AddToArray <AtomConditionData> (atomCondition, compositionConditionWrapper.atomConditionDataArray);
            }
            foreach (AtomConditionData atomCondition in compositionConditionWrapper.atomConditionDataArray)
            {
                this.aiEditor.EditAtomConditionData(atomCondition);
                if (GUILayout.Button("Delete atom condition:" + atomCondition.Id))
                {
                    compositionConditionWrapper.atomConditionDataArray =
                        Util.CloneExcept <AtomConditionData> (compositionConditionWrapper.atomConditionDataArray, atomCondition);
                }
                EditorGUILayout.Space();
                EditorGUILayout.Space();
            }
        }
        EditorGUILayout.EndToggleGroup();

        //Edit composite condition
        EnableEditCompositeCondition = EditorGUILayout.BeginToggleGroup("Edit composite condition", EnableEditCompositeCondition);
        if (EnableEditCompositeCondition)
        {
            if (GUILayout.Button("Add composite condition"))
            {
                CompositeCondition compositeCondition = new CompositeCondition();
                compositionConditionWrapper.CompositeConditionArray = Util.AddToArray <CompositeCondition> (compositeCondition, compositionConditionWrapper.CompositeConditionArray);
            }
            foreach (CompositeCondition compositeCondition in compositionConditionWrapper.CompositeConditionArray)
            {
                this.aiEditor.EditCompositeCondition(compositeCondition, compositionConditionWrapper);
                if (GUILayout.Button("Delete composite condition:" + compositeCondition.Id))
                {
                    compositionConditionWrapper.CompositeConditionArray =
                        Util.CloneExcept <CompositeCondition> (compositionConditionWrapper.CompositeConditionArray,
                                                               compositeCondition);
                }
                EditorGUILayout.Space();
                EditorGUILayout.Space();
            }
        }
        EditorGUILayout.EndToggleGroup();

        //Edit root composite condition
        EnableEditRootCompositeCondition = EditorGUILayout.BeginToggleGroup("Edit root composite condition", EnableEditRootCompositeCondition);
        if (EnableEditRootCompositeCondition)
        {
            this.aiEditor.EditCompositeCondition(compositionConditionWrapper.RootCompositeCondition, compositionConditionWrapper);
        }

        EditorGUILayout.EndScrollView();
    }
Example #13
0
    /// <summary>
    /// Default check value comparision condition routine.
    /// Offspring class should override this method to check custom value comparision condition.
    /// </summary>
    /// <param name="AIBehaviorCondition"></param>
    /// <returns></returns>
    public virtual bool CheckValueComparisionCondition(AtomConditionData AIBehaviorCondition, AIBehavior behavior)
    {
        bool  ret           = false;
        float LeftValue     = 0;
        float RightValue    = AIBehaviorCondition.RightValueForComparision;
        bool  ShouldCompare = false;

        switch (AIBehaviorCondition.ValueComparisionCondition)
        {
        //Check if any enemy closer than AIBehaviorCondition.RightValueForComparision
        case AIValueComparisionCondition.NearestEnemyDistance:
            Transform NearestEnemy = null;
            ShouldCompare = FindClosestEnemyAround(this.DetectiveRange, out NearestEnemy);
            LeftValue     = ShouldCompare ? Util.DistanceOfCharacters(gameObject, NearestEnemy.gameObject) : 0;
            break;

        //Check if any enemy farer than AIBehaviorCondition.RightValueForComparision
        case AIValueComparisionCondition.FarestEnemyDistance:
            Transform FarestEnemy = null;
            ShouldCompare = FindClosestEnemyAround(this.DetectiveRange, out FarestEnemy);
            LeftValue     = ShouldCompare ? Util.DistanceOfCharacters(gameObject, FarestEnemy.gameObject) : 0;
            break;

        case AIValueComparisionCondition.HPPercentage:
            ShouldCompare = true;
            LeftValue     = Unit.HP / Unit.MaxHP;
            break;

        case AIValueComparisionCondition.CurrentTargetHPPercentage:
            ShouldCompare = CurrentTarget != null || FindTarget(this.DetectiveRange);
            LeftValue     = ShouldCompare ? CurrentTarget.GetComponent <UnitHealth>().GetCurrentHP() / CurrentTarget.GetComponent <UnitHealth>().GetMaxHP()
                                          : 0;
            if (PrintDebugMessage)
            {
                Debug.Log("Left value:" + LeftValue + " rightValue:" + RightValue);
            }
            break;

        case AIValueComparisionCondition.BehaviorLastExecutionInterval:
            ShouldCompare = true;
            float LastExecutionTimeInterval = Time.time - behavior.LastExecutionTime;
            LeftValue = LastExecutionTimeInterval;
            break;

        case AIValueComparisionCondition.CurrentTagetDistance:
            ShouldCompare = (CurrentTarget != null || FindTarget(this.DetectiveRange));
            LeftValue     = ShouldCompare ? Util.DistanceOfCharacters(gameObject, CurrentTarget.gameObject)
                    : 0;
            break;

        case AIValueComparisionCondition.ExeuctionCount:
            ShouldCompare = true;
            LeftValue     = behavior.ExecutionCounter;
            break;

        case AIValueComparisionCondition.RandomValue:
            ShouldCompare = true;
//                Random.seed = System.DateTime.Now.Millisecond;
            LeftValue = Random.Range(0, 100);
            break;

        case AIValueComparisionCondition.BehaveTime:
            ShouldCompare = true;
            LeftValue     = Time.time - behavior.StartTime;
            break;

        case AIValueComparisionCondition.AttackCount:
            ShouldCompare = true;
            LeftValue     = this.Unit.AttackCounter;
            break;

        case AIValueComparisionCondition.DoDamageCount:
            ShouldCompare = true;
            LeftValue     = this.Unit.DoDamageCounter;
            break;

        case AIValueComparisionCondition.LastConditionMatchTimeInterval:
            ShouldCompare = true;
            LeftValue     = Time.time - AIBehaviorCondition.PreviousConditionTrueTime;
            break;

        case AIValueComparisionCondition.WaypointDistance:
            ShouldCompare = behavior.selectedWaypoint != null;
            LeftValue     = Util.DistanceOfCharacters(this.gameObject, behavior.selectedWaypoint.gameObject);
            break;

        default:
            Debug.LogError("GameObject:" + this.gameObject.name + " - unsupported value comparision condition:" + AIBehaviorCondition.ValueComparisionCondition.ToString());
            break;
        }
        if (ShouldCompare)
        {
            ret = Util.CompareValue(LeftValue, AIBehaviorCondition.ValueOperator, RightValue);
        }
        //if the atom condition is true, set the current time in  PreviousConditionTrueTime variable.
        if (ret)
        {
            AIBehaviorCondition.PreviousConditionTrueTime = Time.time;
        }
        return(ret);
    }
Example #14
0
    /// <summary>
    /// Default check boolean condition routine.
    /// Offspring class should override this method to check custom boolean condition.
    /// </summary>
    /// <param name="AIBehaviorCondition"></param>
    /// <returns></returns>
    public virtual bool CheckBooleanCondition(AtomConditionData AIBehaviorCondition, AIBehavior behavior)
    {
        bool ret       = false;
        bool LeftValue = false;

        switch (AIBehaviorCondition.BooleanCondition)
        {
        case AIBooleanConditionEnum.AlwaysTrue:
            LeftValue = true;
            break;

        //See if there's any enemy in offensive range?
        case AIBooleanConditionEnum.EnemyInOffensiveRange:
            LeftValue = FindEnemyAround(this.OffensiveRange);
            break;

        //See if there's any enemy in detective range?
        case AIBooleanConditionEnum.EnemyInDetectiveRange:
            LeftValue = FindEnemyAround(this.DetectiveRange);
            break;

        //See if current transform located within the predefined area?
        case AIBooleanConditionEnum.InArea:
            LeftValue = Util.IsTransformInsideBounds(transform, AIBehaviorCondition.CheckArea);
            break;

        //See if the CurrentTarget's gameObject layer within the layermask
        case AIBooleanConditionEnum.CurrentTargetInLayer:
            LeftValue = (CurrentTarget == null && FindTarget(OffensiveRange) == false) ?
                        false :
                        Util.CheckLayerWithinMask(CurrentTarget.gameObject.layer, AIBehaviorCondition.LayerMaskForComparision);
            break;

        case AIBooleanConditionEnum.LatestBehaviorNameIs:
            if (this.CurrentBehavior == null)
            {
                LeftValue = false;
            }
            else
            {
                LeftValue = (AIBehaviorCondition.StringValue == this.CurrentBehavior.Name);
            }
            break;

        case AIBooleanConditionEnum.LastestBehaviorNameIsOneOf:
            if (this.CurrentBehavior == null)
            {
                LeftValue = false;
            }
            else
            {
                LeftValue = Util.ArrayContains <string>(AIBehaviorCondition.StringValueArray, this.CurrentBehavior.Name);
            }
            break;

        default:
            Debug.LogError("GameObject:" + this.gameObject.name + " - Unsupported boolean condition:" + AIBehaviorCondition.BooleanCondition.ToString());
            break;
        }
        ret = AIBehaviorCondition.BooleanOperator == BooleanComparisionOperator.IsTrue ? LeftValue
            : !LeftValue;
        return(ret);
    }
Example #15
0
    public void OnGUI()
    {
        if (compositionConditionWrapper == null || aiEditor == null) {
            EditorGUILayout.LabelField ("No condition wrapper or AIEditor!!");
            return;
        }

        if(GUILayout.Button("Save"))
        {
            EditorUtility.SetDirty (aiEditor.AI);
        }

        ScrollPos = EditorGUILayout.BeginScrollView(ScrollPos,false, true, null);

        //Edit Atom condition
        EnableEditAtomCondition = EditorGUILayout.BeginToggleGroup ("Edit atom condition", EnableEditAtomCondition);
        if (EnableEditAtomCondition) {
            if (GUILayout.Button ("Add atom condition")) {
                AtomConditionData atomCondition = new AtomConditionData ();
                compositionConditionWrapper.atomConditionDataArray = Util.AddToArray<AtomConditionData> (atomCondition, compositionConditionWrapper.atomConditionDataArray);
            }
            foreach (AtomConditionData atomCondition in compositionConditionWrapper.atomConditionDataArray) {
                this.aiEditor.EditAtomConditionData (atomCondition);
                if (GUILayout.Button ("Delete atom condition:" + atomCondition.Id)) {
                    compositionConditionWrapper.atomConditionDataArray =
                      Util.CloneExcept<AtomConditionData> (compositionConditionWrapper.atomConditionDataArray, atomCondition);
                }
                EditorGUILayout.Space ();
                EditorGUILayout.Space ();
            }
        }
        EditorGUILayout.EndToggleGroup ();

        //Edit composite condition
        EnableEditCompositeCondition = EditorGUILayout.BeginToggleGroup ("Edit composite condition", EnableEditCompositeCondition);
        if(EnableEditCompositeCondition)
        {
            if (GUILayout.Button ("Add composite condition")) {
                CompositeCondition compositeCondition = new CompositeCondition ();
                compositionConditionWrapper.CompositeConditionArray = Util.AddToArray<CompositeCondition> (compositeCondition, compositionConditionWrapper.CompositeConditionArray);
            }
            foreach (CompositeCondition compositeCondition in compositionConditionWrapper.CompositeConditionArray) {
                this.aiEditor.EditCompositeCondition (compositeCondition, compositionConditionWrapper);
                if (GUILayout.Button ("Delete composite condition:" + compositeCondition.Id)) {
                    compositionConditionWrapper.CompositeConditionArray =
                      Util.CloneExcept<CompositeCondition> (compositionConditionWrapper.CompositeConditionArray,
                                                            compositeCondition);
                }
                EditorGUILayout.Space ();
                EditorGUILayout.Space ();
            }
        }
        EditorGUILayout.EndToggleGroup();

        //Edit root composite condition
        EnableEditRootCompositeCondition = EditorGUILayout.BeginToggleGroup("Edit root composite condition", EnableEditRootCompositeCondition);
        if(EnableEditRootCompositeCondition)
        {
            this.aiEditor.EditCompositeCondition (compositionConditionWrapper.RootCompositeCondition, compositionConditionWrapper);
        }

        EditorGUILayout.EndScrollView();
    }
Example #16
0
    /// <summary>
    /// Default check boolean condition routine.
    /// Offspring class should override this method to check custom boolean condition.
    /// </summary>
    /// <param name="AIBehaviorCondition"></param>
    /// <returns></returns>
    public virtual bool CheckBooleanCondition(AtomConditionData AIBehaviorCondition, AIBehavior behavior)
    {
        bool ret = false;
        bool LeftValue = false;
        switch (AIBehaviorCondition.BooleanCondition)
        {
            case AIBooleanConditionEnum.AlwaysTrue:
                LeftValue = true;
                break;
            //See if there's any enemy in offensive range?
            case AIBooleanConditionEnum.EnemyInOffensiveRange:
                LeftValue = FindEnemyAround(this.OffensiveRange);
                break;
            //See if there's any enemy in detective range?
            case AIBooleanConditionEnum.EnemyInDetectiveRange:
                LeftValue = FindEnemyAround(this.DetectiveRange);
                break;
            //See if current transform located within the predefined area?
            case AIBooleanConditionEnum.InArea:
                LeftValue = Util.IsTransformInsideBounds(transform, AIBehaviorCondition.CheckArea);
                break;
            //See if the CurrentTarget's gameObject layer within the layermask
            case AIBooleanConditionEnum.CurrentTargetInLayer:
                LeftValue = (CurrentTarget == null && FindTarget(OffensiveRange) == false) ?
                    false :
                    Util.CheckLayerWithinMask(CurrentTarget.gameObject.layer, AIBehaviorCondition.LayerMaskForComparision);
                break;

            case AIBooleanConditionEnum.LatestBehaviorNameIs:
                if(this.CurrentBehavior == null)
                   LeftValue = false;
                else
                   LeftValue = (AIBehaviorCondition.StringValue == this.CurrentBehavior.Name);
                break;
        case AIBooleanConditionEnum.LastestBehaviorNameIsOneOf:
            if(this.CurrentBehavior == null)
            {
                LeftValue = false;
            }
            else {
                LeftValue = Util.ArrayContains<string>(AIBehaviorCondition.StringValueArray, this.CurrentBehavior.Name);
            }
            break;
            default:
                Debug.LogError("GameObject:" + this.gameObject.name + " - Unsupported boolean condition:" + AIBehaviorCondition.BooleanCondition.ToString());
                break;
        }
        ret = AIBehaviorCondition.BooleanOperator == BooleanComparisionOperator.IsTrue ? LeftValue
            : !LeftValue;
        return ret;
    }
Example #17
0
 /// <summary>
 /// Default check value comparision condition routine.
 /// Offspring class should override this method to check custom value comparision condition.
 /// </summary>
 /// <param name="AIBehaviorCondition"></param>
 /// <returns></returns>
 public virtual bool CheckValueComparisionCondition(AtomConditionData AIBehaviorCondition, AIBehavior behavior)
 {
     bool ret = false;
     float LeftValue = 0;
     float RightValue = AIBehaviorCondition.RightValueForComparision;
     bool ShouldCompare = false;
     switch (AIBehaviorCondition.ValueComparisionCondition)
     {
         //Check if any enemy closer than AIBehaviorCondition.RightValueForComparision
         case AIValueComparisionCondition.NearestEnemyDistance:
             Transform NearestEnemy = null;
             ShouldCompare = FindClosestEnemyAround(this.DetectiveRange, out NearestEnemy);
             LeftValue = ShouldCompare ? Util.DistanceOfCharacters(gameObject, NearestEnemy.gameObject) : 0;
             break;
         //Check if any enemy farer than AIBehaviorCondition.RightValueForComparision
         case AIValueComparisionCondition.FarestEnemyDistance:
             Transform FarestEnemy = null;
             ShouldCompare = FindClosestEnemyAround(this.DetectiveRange, out FarestEnemy);
             LeftValue = ShouldCompare ? Util.DistanceOfCharacters(gameObject, FarestEnemy.gameObject) : 0;
             break;
         case AIValueComparisionCondition.HPPercentage:
             ShouldCompare = true;
             LeftValue = Unit.HP / Unit.MaxHP;
             break;
         case AIValueComparisionCondition.CurrentTargetHPPercentage:
             ShouldCompare = CurrentTarget != null || FindTarget(this.DetectiveRange);
             LeftValue = ShouldCompare ? CurrentTarget.GetComponent<UnitHealth>().GetCurrentHP() / CurrentTarget.GetComponent<UnitHealth>().GetMaxHP()
                                       : 0;
             if (PrintDebugMessage)
                 Debug.Log("Left value:" + LeftValue + " rightValue:" + RightValue);
             break;
         case AIValueComparisionCondition.BehaviorLastExecutionInterval:
             ShouldCompare = true;
             float LastExecutionTimeInterval = Time.time - behavior.LastExecutionTime;
             LeftValue = LastExecutionTimeInterval;
             break;
         case AIValueComparisionCondition.CurrentTagetDistance:
             ShouldCompare = (CurrentTarget != null || FindTarget(this.DetectiveRange));
             LeftValue = ShouldCompare ? Util.DistanceOfCharacters(gameObject, CurrentTarget.gameObject)
                 : 0;
             break;
         case AIValueComparisionCondition.ExeuctionCount:
             ShouldCompare = true;
             LeftValue = behavior.ExecutionCounter;
             break;
         case AIValueComparisionCondition.RandomValue:
             ShouldCompare = true;
     //                Random.seed = System.DateTime.Now.Millisecond;
             LeftValue = Random.Range(0, 100);
             break;
         case AIValueComparisionCondition.BehaveTime:
             ShouldCompare = true;
             LeftValue = Time.time - behavior.StartTime;
             break;
         case AIValueComparisionCondition.AttackCount:
             ShouldCompare = true;
             LeftValue = this.Unit.AttackCounter;
             break;
         case AIValueComparisionCondition.DoDamageCount:
             ShouldCompare = true;
             LeftValue = this.Unit.DoDamageCounter;
             break;
         case AIValueComparisionCondition.LastConditionMatchTimeInterval:
             ShouldCompare = true;
             LeftValue = Time.time - AIBehaviorCondition.PreviousConditionTrueTime;
             break;
         case AIValueComparisionCondition.WaypointDistance:
             ShouldCompare = behavior.selectedWaypoint != null;
             LeftValue = Util.DistanceOfCharacters(this.gameObject, behavior.selectedWaypoint.gameObject);
             break;
         default:
             Debug.LogError("GameObject:" + this.gameObject.name + " - unsupported value comparision condition:" + AIBehaviorCondition.ValueComparisionCondition.ToString());
             break;
     }
     if (ShouldCompare)
     {
         ret = Util.CompareValue(LeftValue, AIBehaviorCondition.ValueOperator, RightValue);
     }
     //if the atom condition is true, set the current time in  PreviousConditionTrueTime variable.
     if(ret)
     {
         AIBehaviorCondition.PreviousConditionTrueTime = Time.time;
     }
     return ret;
 }
Example #18
0
    /// <summary>
    /// Composites the condition to string description.
    /// </summary>
    public string GetCompositeConditionDescription(CompositeCondition compositeCondition,
                                                   CompositeConditionWrapper compositeConditionWrapper)
    {
        string LeftEntityDescription  = "";
        string RightEntityDescription = "";

        string refId = "";

        switch (compositeCondition.Entity1.EntityType)
        {
        case ConditionEntityType.AtomCondition:
            refId = compositeCondition.Entity1.EntityReferenceId;
            IEnumerable <AtomConditionData> AllAtomConditionData = compositeConditionWrapper.atomConditionDataArray.Where(x => x.Id == refId);
            if (AllAtomConditionData.Count() > 0)
            {
                AtomConditionData atomCondition = AllAtomConditionData.First();
                LeftEntityDescription = atomCondition.GetDescription();
            }
            break;

        case ConditionEntityType.ReferenceToComposite:
            refId = compositeCondition.Entity1.EntityReferenceId;
            IEnumerable <CompositeCondition> AllCompositeConditionData = compositeConditionWrapper.CompositeConditionArray.Where(x => x.Id == refId);
            if (AllCompositeConditionData.Count() > 0)
            {
                CompositeCondition referComposite = AllCompositeConditionData.Where(x => x.Id == refId).First();
                if (referComposite == compositeCondition)
                {
                    LeftEntityDescription = "Error !!! CompositeCondition - Id:" + compositeCondition.Id + " is referring to itself!";
                }
                else
                {
                    LeftEntityDescription = GetCompositeConditionDescription(referComposite, compositeConditionWrapper);
                }
            }
            break;
        }

        switch (compositeCondition.Entity2.EntityType)
        {
        case ConditionEntityType.AtomCondition:
            refId = compositeCondition.Entity2.EntityReferenceId;
            IEnumerable <AtomConditionData> AllAtomConditionData = compositeConditionWrapper.atomConditionDataArray.Where(x => x.Id == refId);
            if (AllAtomConditionData.Count() > 0)
            {
                AtomConditionData atomCondition = AllAtomConditionData.First();
                RightEntityDescription = atomCondition.GetDescription();
            }
            break;

        case ConditionEntityType.ReferenceToComposite:
            refId = compositeCondition.Entity2.EntityReferenceId;
            IEnumerable <CompositeCondition> AllCompositeConditionData = compositeConditionWrapper.CompositeConditionArray.Where(x => x.Id == refId);
            if (AllCompositeConditionData.Count() > 0)
            {
                CompositeCondition referComposite = AllCompositeConditionData.First();
                if (referComposite == compositeCondition)
                {
                    RightEntityDescription = "Error !!! CompositeCondition - Id:" + compositeCondition.Id + " is referring to itself!";
                }
                else
                {
                    RightEntityDescription = GetCompositeConditionDescription(referComposite, compositeConditionWrapper);
                }
            }
            break;
        }

        string ret = "({0} {1} {2})";

        switch (compositeCondition.Operator)
        {
        case LogicConjunction.None:
            ret = string.Format(ret, LeftEntityDescription, "", "");
            break;

        case LogicConjunction.And:
        case LogicConjunction.Or:
            ret = string.Format(ret, LeftEntityDescription, compositeCondition.Operator.ToString(), RightEntityDescription);
            break;
        }
        return(ret);
    }