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