SpawnEntity[] EditSpawnEntityArray(SpawnEntity[] spawnEntityArray, string[] SpawnDataNameArray) { if (GUILayout.Button("Add SpawnEntity")) { spawnEntityArray = Util.AddToArray <SpawnEntity>(new SpawnEntity(), spawnEntityArray); } for (int i = 0; i < spawnEntityArray.Length; i++) { EditorGUILayout.LabelField("------------------------ SpawnEntity:" + spawnEntityArray[i].Name); spawnEntityArray[i].Name = EditorGUILayout.TextField("Name:", spawnEntityArray[i].Name); spawnEntityArray[i].SpawnDataNameArray = EditorCommon.EditStringArray("Use these spawn data:", spawnEntityArray[i].SpawnDataNameArray, SpawnDataNameArray); spawnEntityArray[i].WaitForSpawnedDieOut = EditorGUILayout.Toggle(new GUIContent("Wait for spawned unit die out to spawn next:", ""), spawnEntityArray[i].WaitForSpawnedDieOut); if (spawnEntityArray[i].WaitForSpawnedDieOut == false) { spawnEntityArray[i].WaitTime = EditorGUILayout.FloatField(new GUIContent("Wait time to spawn next:", ""), spawnEntityArray[i].WaitTime); } if (GUILayout.Button("Remove this SpawnEntity")) { spawnEntityArray = Util.CloneExcept <SpawnEntity>(spawnEntityArray, spawnEntityArray[i]); } EditorGUILayout.Space(); } return(spawnEntityArray); }
public static PredatorCombatData EditCombat(string label, Predator3rdPersonalUnit Unit, PredatorCombatData Combat) { EditorGUILayout.LabelField(label); Combat.Name = EditorGUILayout.TextField("Combat name:", Combat.Name); Combat.userInput = (UserInputType)EditorGUILayout.EnumPopup(new GUIContent("Gesture:", "The matched gesture trigger this combat?"), Combat.userInput); string[] AllAttackDataName = Unit.PredatorAttackData.Select(x => x.Name).ToArray(); Combat.useAttackDataName = EditorCommon.EditStringArray("Use these attack data:", Combat.useAttackDataName, AllAttackDataName); EditorGUILayout.BeginHorizontal(); Combat.WaitUntilAnimationReturn = EditorGUILayout.Toggle("Wait animation return:", Combat.WaitUntilAnimationReturn); Combat.BlockPlayerInput = EditorGUILayout.Toggle("Block player input", Combat.BlockPlayerInput); EditorGUILayout.EndHorizontal(); Combat.OverrideAttackData = EditorGUILayout.BeginToggleGroup(new GUIContent("Override attackData setting", "If true, some of the attack data property would be overrided"), Combat.OverrideAttackData); Combat.DamagePointBase = EditorGUILayout.FloatField("DamagePoint base:", Combat.DamagePointBase); EditorGUILayout.BeginHorizontal(); Combat.MinDamagePointBonus = EditorGUILayout.FloatField("Min damage bonus:", Combat.MinDamagePointBonus); Combat.MaxDamagePointBonus = EditorGUILayout.FloatField("Max damage bonus:", Combat.MaxDamagePointBonus); EditorGUILayout.EndHorizontal(); Combat.CanDoCriticalAttack = EditorGUILayout.Toggle("Can do critical attack", Combat.CanDoCriticalAttack); if (Combat.CanDoCriticalAttack) { EditorGUILayout.BeginHorizontal(); Combat.CriticalAttackChance = EditorGUILayout.Slider("Critical chance:", Combat.CriticalAttackChance, 0, 1); Combat.CriticalAttackBonusRate = EditorGUILayout.FloatField("Critical bonus rate", Combat.CriticalAttackBonusRate); EditorGUILayout.EndHorizontal(); } EditorGUILayout.EndToggleGroup(); return(Combat); }
public virtual void EditAIBehavior(AIBehavior behavior) { behavior.Name = EditorGUILayout.TextField(new GUIContent("Behavior Name:", ""), behavior.Name); if (AIBehaviorEnableEditFlags.ContainsKey(behavior.Name) == false) { AIBehaviorEnableEditFlags [behavior.Name] = false; } AIBehaviorEnableEditFlags [behavior.Name] = EditorGUILayout.BeginToggleGroup(new GUIContent( string.Format("------------- Edit AI Behavior: {0} ----------------------", behavior.Name), ""), AIBehaviorEnableEditFlags [behavior.Name]); if (AIBehaviorEnableEditFlags [behavior.Name]) { behavior.Type = (AIBehaviorType)EditorGUILayout.EnumPopup(new GUIContent("Behavior type:", ""), behavior.Type); AIBehavior[] AIBehaviors = this.AI.Behaviors; behavior.AlterBehaviorInterval = EditorGUILayout.FloatField("Alter behavior interval:", behavior.AlterBehaviorInterval); behavior.SelectTargetRule = (SelectTargetRule)EditorGUILayout.EnumPopup(new GUIContent("Select enemy rule:", "当这个行为生效的时候,选择敌人的规则, 默认是Closest,也就是选择最近的敌人做为当前目标."), behavior.SelectTargetRule); //Edit behavior data EditAIBehaviorData(behavior); //Edit End Condition Wrapper, for behavior type = SwitchToAI, it's not necessary to edit end condition. if (behavior.Type != AIBehaviorType.SwitchToAI) { EditorGUILayout.Space(); if (GUILayout.Button("Edit alternate behavior data")) { AlternateBehaviorEditorWindow.DisplayConditionEditorWindow(this, behavior); } EditorGUILayout.Space(); } if (GUILayout.Button("Delete " + behavior.Type.ToString() + " behavior: " + behavior.Name)) { IList <AIBehavior> l = AI.Behaviors.ToList <AIBehavior> (); l.Remove(behavior); AI.Behaviors = l.ToArray <AIBehavior> (); } //Start and End message: behavior.MessageAtStart = EditorCommon.EditStringArray("Message sent when behavior start", behavior.MessageAtStart); behavior.MessageAtEnd = EditorCommon.EditStringArray("Message sent when behavior end", behavior.MessageAtEnd); } EditorGUILayout.EndToggleGroup(); EditorGUILayout.Space(); EditorGUILayout.Space(); }
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(); }
public virtual void EditAIBehaviorData(AIBehavior behavior) { string[] IdleDataNameArray = this.AI.Unit.IdleData.Select(x => x.Name).ToArray <string> (); string[] AttackDataNameArray = this.AI.Unit.AttackData.Select(x => x.Name).ToArray <string> (); string[] MoveDataNameArray = this.AI.Unit.MoveData.Select(x => x.Name).ToArray <string> (); string[] SceneWaypointNameArray = Object.FindObjectsOfType(typeof(WayPoint)).Select(x => x.name).ToArray(); SceneWaypointNameArray.OrderBy(x => x.ToString()); int idx = 0; switch (behavior.Type) { case AIBehaviorType.Idle: if (IdleDataNameArray == null || IdleDataNameArray.Length == 0) { EditorGUILayout.LabelField("!!!There is no Idle Data defined in this Unit!!!"); } else { idx = IndexOfArray <string> (IdleDataNameArray, behavior.IdleDataName); idx = EditorGUILayout.Popup("Use Idle data:", idx, IdleDataNameArray); behavior.IdleDataName = IdleDataNameArray [idx]; } break; case AIBehaviorType.MoveToTransform: if (MoveDataNameArray == null || MoveDataNameArray.Length == 0) { EditorGUILayout.LabelField("!!!There is no Move Data defined in this Unit!!!"); } else { idx = IndexOfArray <string> (MoveDataNameArray, behavior.MoveDataName); idx = EditorGUILayout.Popup("Use Move data:", idx, MoveDataNameArray); behavior.MoveDataName = MoveDataNameArray [idx]; behavior.MoveToTarget = (Transform)EditorGUILayout.ObjectField(new GUIContent("Move to target", ""), behavior.MoveToTarget, typeof(Transform)); } break; case AIBehaviorType.MoveAtDirection: if (MoveDataNameArray == null || MoveDataNameArray.Length == 0) { EditorGUILayout.LabelField("!!!There is no Move Data defined in this Unit!!!"); } else { idx = IndexOfArray <string> (MoveDataNameArray, behavior.MoveDataName); idx = EditorGUILayout.Popup("Use Move data:", idx, MoveDataNameArray); behavior.MoveDataName = MoveDataNameArray [idx]; behavior.MoveDirection = EditorGUILayout.Vector3Field("Move at direction", behavior.MoveDirection); behavior.IsWorldDirection = EditorGUILayout.Toggle(new GUIContent("Is world direction?", "Move at Direction 指定的方向,是世界方向还是局部方向?"), behavior.IsWorldDirection); } break; case AIBehaviorType.MoveToCurrentTarget: if (MoveDataNameArray == null || MoveDataNameArray.Length == 0) { EditorGUILayout.LabelField("!!!There is no Move Data defined in this Unit!!!"); } else { idx = IndexOfArray <string> (MoveDataNameArray, behavior.MoveDataName); idx = EditorGUILayout.Popup("Use Move data:", idx, MoveDataNameArray); behavior.MoveDataName = MoveDataNameArray [idx]; } break; case AIBehaviorType.Attack: case AIBehaviorType.AttackToPosition: case AIBehaviorType.AttackToDirection: case AIBehaviorType.HoldPosition: if (AttackDataNameArray == null || AttackDataNameArray.Length == 0) { EditorGUILayout.LabelField("!!!There is no Attack Data defined in this Unit!!!"); return; } if (MoveDataNameArray == null || MoveDataNameArray.Length == 0) { EditorGUILayout.LabelField("!!!There is no Move Data defined in this Unit!!!"); return; } //Attack Data: behavior.UseRandomAttackData = EditorGUILayout.Toggle(new GUIContent("Use random attack data", ""), behavior.UseRandomAttackData); if (behavior.UseRandomAttackData) { behavior.AttackDataNameArray = EditorCommon.EditStringArray("Attack data:", behavior.AttackDataNameArray, AttackDataNameArray); } else { behavior.AttackDataName = EditorCommon.EditPopup("Attack data:", behavior.AttackDataName, AttackDataNameArray); } // Move data: idx = IndexOfArray <string> (MoveDataNameArray, behavior.MoveDataName); idx = EditorGUILayout.Popup("Move data:", idx, MoveDataNameArray); behavior.MoveDataName = MoveDataNameArray [idx]; if (behavior.Type == AIBehaviorType.AttackToPosition) { behavior.MoveToTarget = (Transform)EditorGUILayout.ObjectField(new GUIContent("Move to target", ""), behavior.MoveToTarget, typeof(Transform)); } if (behavior.Type == AIBehaviorType.AttackToDirection) { behavior.MoveDirection = EditorGUILayout.Vector3Field("Move at direction", behavior.MoveDirection); behavior.IsWorldDirection = EditorGUILayout.Toggle(new GUIContent("Is world direction?", "Move at Direction in world space or local space?"), behavior.IsWorldDirection); } if (behavior.Type == AIBehaviorType.HoldPosition) { behavior.HoldRadius = EditorGUILayout.FloatField(new GUIContent("Hold Position:", "The position transform."), behavior.HoldRadius); } //Idle data: behavior.AttackInterrupt = EditorGUILayout.Toggle("Attack interrupt:", behavior.AttackInterrupt); if (behavior.AttackInterrupt) { behavior.IdleDataName = EditorCommon.EditPopup("Interval Idle data:", behavior.IdleDataName, IdleDataNameArray); behavior.AttackIntervalMin = EditorGUILayout.FloatField("Min attack interval:", behavior.AttackIntervalMin); behavior.AttackIntervalMax = EditorGUILayout.FloatField("Max attack interval:", behavior.AttackIntervalMax); } break; case AIBehaviorType.SwitchToAI: AbstractAI[] AllAI = this.AI.Unit.GetComponents <AbstractAI> (); behavior.SwitchToAIName = EditorCommon.EditStringArray("Switch to next AI:", behavior.SwitchToAIName, AllAI.Select(x => x.Name).ToArray()); break; case AIBehaviorType.MoveToWaypoint: // Move data: idx = IndexOfArray <string> (MoveDataNameArray, behavior.MoveDataName); idx = EditorGUILayout.Popup("Move data:", idx, MoveDataNameArray); behavior.MoveDataName = MoveDataNameArray [idx]; behavior.WaypointNames = EditorCommon.EditStringArray("Select scene waypoint:", behavior.WaypointNames, SceneWaypointNameArray); break; } }