Пример #1
0
    /// <summary>
    /// Creates the attack listing.
    /// </summary>
    /// <returns>The attack listing.</returns>
    /// <param name="atd">Atd.</param>
    protected AttackController.AttackData CreateAttackListing(AttackController.AttackData atd)
    {
        EditorGUILayout.BeginHorizontal();
        atd.atk.showInEditor = EditorGUILayout.Foldout(atd.atk.showInEditor, atd.atk.attackName);
        if (GUILayout.Button("-", GUILayout.Width(20), GUILayout.Height(14)))
        {
            ScriptableObject.DestroyImmediate(atd.atk);
            atd = null;
        }
        EditorGUILayout.EndHorizontal();

        if (atd != null && atd.atk.showInEditor)
        {
            GUIStyle attacksStyle = new GUIStyle(GUI.skin.box);
            attacksStyle.padding = new RectOffset(12, 1, 5, 5);

            EditorGUILayout.BeginVertical(attacksStyle);

            // get all of the attack scripts
            int thisScriptIndex = 0;

            // get all of the attack scripts
            GUIContent attackScriptLabel = new GUIContent("Attack Script",
                                                          "Attack Script\n" +
                                                          "The script the attack will be executing when the attack is used.");
            GUIContent[] attackScriptOptions = new GUIContent[AttackTypeList.Count];
            int          index = 0;
            foreach (string key in AttackTypeList)
            {
                attackScriptOptions[index] = new GUIContent(key);
                if (atd.atk.GetType() == GetAttackType(key))
                {
                    thisScriptIndex = index;
                }
                index++;
            }

            // list the attack scripts
            int tempAttackScriptIndex = EditorGUILayout.Popup(attackScriptLabel, thisScriptIndex, attackScriptOptions);
            if (tempAttackScriptIndex != thisScriptIndex)
            {
                Attack tempAtk = Instantiate(atd.atk);
                Attack newAtk  = GetAttack(attackScriptOptions[tempAttackScriptIndex].text);
                atd.atk = Instantiate(newAtk);
                atd.atk.CopyComponents(tempAtk);
                ScriptableObject.DestroyImmediate(tempAtk);
                ScriptableObject.DestroyImmediate(newAtk);
            }

            // add the attack's components
            atd.atk.EditorGUISetup();

            // add the attack inputs
            GUIStyle attacksInputStyle = new GUIStyle(GUI.skin.box);
            attacksInputStyle.padding = new RectOffset(12, 1, 1, 5);

            EditorGUILayout.Space();
            EditorGUILayout.BeginHorizontal();
            EditorGUILayout.LabelField("Activation Parameters");
            EditorGUILayout.EndHorizontal();

            EditorGUILayout.BeginVertical(attacksInputStyle);
            EditorGUILayout.BeginHorizontal();
            GUIContent triggerLabel = new GUIContent("Trigger",
                                                     "Trigger\n" +
                                                     "The option for a trigger that needs to happen in order for this attack to start.");
            AttackController.AttackTrigger tempTrigger = (AttackController.AttackTrigger)EditorGUILayout.EnumPopup(triggerLabel, atd.atkTrig);
            if (atd.atkTrig != tempTrigger)
            {
                atd.atkTrig = tempTrigger;
            }
            EditorGUILayout.EndHorizontal();

            EditorGUILayout.BeginHorizontal();
            GUIContent comboLabel = new GUIContent("Combo Label",
                                                   "Combo Label\n" +
                                                   "If this attack is triggered after another attack, add it's ID here. Otherwise leave this section blank.");
            string tempComboID = EditorGUILayout.TextField(comboLabel, atd.comboStarterID);
            if (atd.comboStarterID != tempComboID)
            {
                atd.comboStarterID = tempComboID;
            }
            EditorGUILayout.EndHorizontal();

            EditorGUILayout.BeginHorizontal();

            // if there are no attack inputs
            if (atd.input.Count == 0)
            {
                AttackController.AttackInput ai = new AttackController.AttackInput();
                ai.Pos = AttackController.AttackPositionState.Neutral;
                atd.input.Add(ai);
            }

            GUIContent posDirLabel = new GUIContent("Position State and Input Directions",
                                                    "Position State\n" +
                                                    "The state the character's movement controller has to be in for this attack to activate.\n\n" +
                                                    "Input Direction\n" +
                                                    "The directional influence the attacker is using while in the selected position state.\n" +
                                                    "For a player this would be the joystick position when pressing the attack button.");
            EditorGUILayout.LabelField(posDirLabel);
            if (atd.input.Count < Enum.GetValues(typeof(AttackController.AttackPositionState)).Length)
            {
                if (GUILayout.Button("+", GUILayout.Width(20), GUILayout.Height(14)))
                {
                    AttackController.AttackInput ai = new AttackController.AttackInput();
                    if (atd.InputContains(AttackController.AttackPositionState.Neutral) == -1)
                    {
                        ai.Pos = AttackController.AttackPositionState.Neutral;
                    }
                    else if (atd.InputContains(AttackController.AttackPositionState.Dash) == -1)
                    {
                        ai.Pos = AttackController.AttackPositionState.Dash;
                    }
                    else if (atd.InputContains(AttackController.AttackPositionState.Air) == -1)
                    {
                        ai.Pos = AttackController.AttackPositionState.Air;
                    }
                    atd.input.Add(ai);
                }
            }
            EditorGUILayout.EndHorizontal();

            // add the attack inputs
            for (int posIndex = 0; posIndex < atd.input.Count; posIndex++)
            {
                EditorGUILayout.BeginHorizontal();
                GUIContent posStateLabel = new GUIContent("Input",
                                                          "Input\n" +
                                                          "An input necessary to perform this attack.");
                atd.input[posIndex].showData = EditorGUILayout.Foldout(atd.input[posIndex].showData, posStateLabel);
                AttackController.AttackPositionState tempAttackPosition = (AttackController.AttackPositionState)EditorGUILayout.EnumPopup(atd.input[posIndex].Pos);
                if (atd.input[posIndex].Pos != tempAttackPosition && atd.InputContains(tempAttackPosition) == -1)
                {
                    atd.input[posIndex].Pos = tempAttackPosition;
                }
                if (GUILayout.Button("-", GUILayout.Width(20), GUILayout.Height(14)))
                {
                    atd.input.RemoveAt(posIndex);
                    break;
                }
                EditorGUILayout.EndHorizontal();

                if (atd.input[posIndex].showData)
                {
                    for (int dirIndex = 0; dirIndex < Enum.GetValues(typeof(AttackController.AttackDirection)).Length; dirIndex++)
                    {
                        EditorGUILayout.BeginHorizontal();
                        if (atd.input[posIndex].Dir.Contains((AttackController.AttackDirection)dirIndex))
                        {
                            bool tempDir = EditorGUILayout.ToggleLeft(((AttackController.AttackDirection)dirIndex).ToString(), true);
                            if (!tempDir)
                            {
                                int dir = atd.input[posIndex].Dir.IndexOf((AttackController.AttackDirection)dirIndex);
                                atd.input[posIndex].Dir.RemoveAt(dir);
                                break;
                            }
                        }
                        else
                        {
                            bool tempDir = EditorGUILayout.ToggleLeft(((AttackController.AttackDirection)dirIndex).ToString(), false);
                            if (tempDir)
                            {
                                atd.input[posIndex].Dir.Add((AttackController.AttackDirection)dirIndex);
                                break;
                            }
                        }
                        EditorGUILayout.EndHorizontal();
                    }
                }
            }

            EditorGUILayout.EndVertical();

            EditorGUILayout.EndVertical();
        }

        return(atd);
    }
    /// <summary>
    /// Creates the attack listing.
    /// </summary>
    /// <returns>The attack listing.</returns>
    /// <param name="atd">Atd.</param>
    protected AttackController.AttackData CreateAttackListing(AttackController.AttackData atd)
    {
        EditorGUILayout.BeginHorizontal ();
        atd.atk.showInEditor = EditorGUILayout.Foldout (atd.atk.showInEditor, atd.atk.attackName);
        if (GUILayout.Button ("-", GUILayout.Width (20), GUILayout.Height (14))) {
            ScriptableObject.DestroyImmediate (atd.atk);
            atd = null;
        }
        EditorGUILayout.EndHorizontal ();

        if (atd != null && atd.atk.showInEditor) {

            GUIStyle attacksStyle = new GUIStyle (GUI.skin.box);
            attacksStyle.padding = new RectOffset (12, 1, 5, 5);

            EditorGUILayout.BeginVertical (attacksStyle);

            // get all of the attack scripts
            int thisScriptIndex = 0;

            // get all of the attack scripts
            GUIContent attackScriptLabel = new GUIContent ("Attack Script",
                                                           "Attack Script\n" +
                                                           "The script the attack will be executing when the attack is used.");
            GUIContent[] attackScriptOptions = new GUIContent[AttackTypeList.Count];
            int index = 0;
            foreach (string key in AttackTypeList) {
                attackScriptOptions[index] = new GUIContent(key);
                if (atd.atk.GetType () == GetAttackType (key)) {
                    thisScriptIndex = index;
                }
                index++;
            }

            // list the attack scripts
            int tempAttackScriptIndex = EditorGUILayout.Popup (attackScriptLabel, thisScriptIndex, attackScriptOptions);
            if (tempAttackScriptIndex != thisScriptIndex) {
                Attack tempAtk = Instantiate (atd.atk);
                Attack newAtk = GetAttack (attackScriptOptions[tempAttackScriptIndex].text);
                atd.atk = Instantiate (newAtk);
                atd.atk.CopyComponents (tempAtk);
                ScriptableObject.DestroyImmediate (tempAtk);
                ScriptableObject.DestroyImmediate (newAtk);
            }

            // add the attack's components
            atd.atk.EditorGUISetup ();

            // add the attack inputs
            GUIStyle attacksInputStyle = new GUIStyle (GUI.skin.box);
            attacksInputStyle.padding = new RectOffset (12, 1, 1, 5);

            EditorGUILayout.Space ();
            EditorGUILayout.BeginHorizontal ();
            EditorGUILayout.LabelField ("Activation Parameters");
            EditorGUILayout.EndHorizontal ();

            EditorGUILayout.BeginVertical (attacksInputStyle);
            EditorGUILayout.BeginHorizontal ();
            GUIContent triggerLabel = new GUIContent ("Trigger",
                                                      "Trigger\n" +
                                                      "The option for a trigger that needs to happen in order for this attack to start.");
            AttackController.AttackTrigger tempTrigger = (AttackController.AttackTrigger) EditorGUILayout.EnumPopup (triggerLabel, atd.atkTrig);
            if (atd.atkTrig != tempTrigger) {
                atd.atkTrig = tempTrigger;
            }
            EditorGUILayout.EndHorizontal ();

            EditorGUILayout.BeginHorizontal ();
            GUIContent comboLabel = new GUIContent ("Combo Label",
                                                    "Combo Label\n" +
                                                    "If this attack is triggered after another attack, add it's ID here. Otherwise leave this section blank.");
            string tempComboID = EditorGUILayout.TextField (comboLabel, atd.comboStarterID);
            if (atd.comboStarterID != tempComboID) {
                atd.comboStarterID = tempComboID;
            }
            EditorGUILayout.EndHorizontal ();

            EditorGUILayout.BeginHorizontal ();

            // if there are no attack inputs
            if (atd.input.Count == 0) {
                AttackController.AttackInput ai = new AttackController.AttackInput ();
                ai.Pos = AttackController.AttackPositionState.Neutral;
                atd.input.Add (ai);
            }

            GUIContent posDirLabel = new GUIContent ("Position State and Input Directions",
                                                     "Position State\n" +
                                                     "The state the character's movement controller has to be in for this attack to activate.\n\n" +
                                                     "Input Direction\n" +
                                                     "The directional influence the attacker is using while in the selected position state.\n" +
                                                     "For a player this would be the joystick position when pressing the attack button.");
            EditorGUILayout.LabelField (posDirLabel);
            if (atd.input.Count < Enum.GetValues(typeof(AttackController.AttackPositionState)).Length) {
                if (GUILayout.Button ("+", GUILayout.Width (20), GUILayout.Height (14))) {
                    AttackController.AttackInput ai = new AttackController.AttackInput ();
                    if (atd.InputContains (AttackController.AttackPositionState.Neutral) == -1) {
                        ai.Pos = AttackController.AttackPositionState.Neutral;
                    } else if (atd.InputContains (AttackController.AttackPositionState.Dash) == -1) {
                        ai.Pos = AttackController.AttackPositionState.Dash;
                    } else if (atd.InputContains (AttackController.AttackPositionState.Air) == -1) {
                        ai.Pos = AttackController.AttackPositionState.Air;
                    }
                    atd.input.Add (ai);
                }
            }
            EditorGUILayout.EndHorizontal ();

            // add the attack inputs
            for (int posIndex = 0; posIndex < atd.input.Count; posIndex++) {

                EditorGUILayout.BeginHorizontal ();
                GUIContent posStateLabel = new GUIContent ("Input",
                                                           "Input\n" +
                                                           "An input necessary to perform this attack.");
                atd.input[posIndex].showData = EditorGUILayout.Foldout (atd.input[posIndex].showData, posStateLabel);
                AttackController.AttackPositionState tempAttackPosition = (AttackController.AttackPositionState) EditorGUILayout.EnumPopup (atd.input[posIndex].Pos);
                if (atd.input[posIndex].Pos != tempAttackPosition && atd.InputContains (tempAttackPosition) == -1) {
                    atd.input[posIndex].Pos = tempAttackPosition;
                }
                if (GUILayout.Button ("-", GUILayout.Width (20), GUILayout.Height (14))) {
                    atd.input.RemoveAt (posIndex);
                    break;
                }
                EditorGUILayout.EndHorizontal ();

                if (atd.input[posIndex].showData) {
                    for (int dirIndex = 0; dirIndex < Enum.GetValues(typeof(AttackController.AttackDirection)).Length; dirIndex++) {
                        EditorGUILayout.BeginHorizontal ();
                        if (atd.input[posIndex].Dir.Contains ((AttackController.AttackDirection)dirIndex)) {
                            bool tempDir = EditorGUILayout.ToggleLeft (((AttackController.AttackDirection)dirIndex).ToString (), true);
                            if (!tempDir) {
                                int dir = atd.input[posIndex].Dir.IndexOf ((AttackController.AttackDirection)dirIndex);
                                atd.input[posIndex].Dir.RemoveAt (dir);
                                break;
                            }
                        } else {
                            bool tempDir = EditorGUILayout.ToggleLeft (((AttackController.AttackDirection)dirIndex).ToString (), false);
                            if (tempDir) {
                                atd.input[posIndex].Dir.Add ((AttackController.AttackDirection)dirIndex);
                                break;
                            }
                        }
                        EditorGUILayout.EndHorizontal ();
                    }
                }

            }

            EditorGUILayout.EndVertical ();

            EditorGUILayout.EndVertical ();
        }

        return atd;
    }