예제 #1
0
    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);
    }
예제 #2
0
 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);
 }
예제 #3
0
    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();
    }
예제 #4
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();
    }
예제 #5
0
    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;
        }
    }