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