Advertisement
ElectricJesus

AssetParametersEditor

Aug 13th, 2016
197
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 10.18 KB | None | 0 0
  1. using UnityEditor;
  2. using UnityEngine;
  3. using System.Collections.Generic;
  4. using AC;
  5.  
  6. [CustomEditor(typeof(AssetParameters))]
  7. public class ParametersEditor : Editor
  8. {
  9.     public override void OnInspectorGUI()
  10.     {
  11.         var t = target as AssetParameters;
  12.         var actionList = t.GetComponent<ActionList>();
  13.  
  14.         // Check if ActionList is attached
  15.         if (actionList == null || actionList.source != ActionListSource.AssetFile || actionList.assetFile == null)
  16.         {
  17.             t.SetParametersNumber(0);
  18.             EditorGUILayout.HelpBox("An ActionListAsset is required to use this component!", MessageType.Warning);
  19.             return;
  20.         }
  21.        
  22.         // Check if parameters used by ActionList
  23.         if (actionList.assetFile.parameters.Count == 0)
  24.         {
  25.             t.SetParametersNumber(0);
  26.             EditorGUILayout.HelpBox("No parameters used by attached ActionList.", MessageType.Warning);
  27.             return;
  28.         }
  29.  
  30.         // Set appropriate parameters number
  31.         if (t.parameters.Count != actionList.assetFile.parameters.Count)
  32.         {
  33.             t.SetParametersNumber(actionList.assetFile.parameters.Count);
  34.             EditorUtility.SetDirty(t);
  35.         }
  36.  
  37.         // For each parameter, draw parameter fields
  38.         bool isUpdated = false;
  39.         EditorGUILayout.BeginVertical("button");
  40.         for (int i = 0; i < actionList.assetFile.parameters.Count; i++)
  41.         {
  42.             string parameterLabel = actionList.assetFile.parameters[i].label + ":";
  43.             switch (actionList.assetFile.parameters[i].parameterType)
  44.             {
  45.                 // Draw boolean popup
  46.                 case ParameterType.Boolean:
  47.                     int newBool = EditorGUILayout.IntPopup(parameterLabel, t.parameters[i].intValue > 0 ? 1 : 0, new string[] { "False", "True" }, new int[] { 0, 1 });
  48.                     if ((newBool > 0) != (t.parameters[i].intValue > 0))
  49.                     {
  50.                         t.parameters[i].intValue = newBool;
  51.                         isUpdated = true;
  52.                     }
  53.                     break;
  54.  
  55.                 // Draw float field
  56.                 case ParameterType.Float:
  57.                     float newFloat = EditorGUILayout.FloatField(parameterLabel, t.parameters[i].floatValue);
  58.                     if (newFloat != t.parameters[i].floatValue)
  59.                     {
  60.                         t.parameters[i].floatValue = newFloat;
  61.                         isUpdated = true;
  62.                     }
  63.                     break;
  64.  
  65.                 // Draw integer field
  66.                 case ParameterType.Integer:
  67.                     int newInt = EditorGUILayout.IntField(parameterLabel, t.parameters[i].intValue);
  68.                     if (newInt != t.parameters[i].intValue)
  69.                     {
  70.                         t.parameters[i].intValue = newInt;
  71.                         isUpdated = true;
  72.                     }
  73.                     break;
  74.  
  75.                 // Draw string field
  76.                 case ParameterType.String:
  77.                     string newString = EditorGUILayout.TextField(parameterLabel, t.parameters[i].stringValue);
  78.                     if (newString != t.parameters[i].stringValue)
  79.                     {
  80.                         t.parameters[i].stringValue = newString;
  81.                         isUpdated = true;
  82.                     }
  83.                     break;
  84.  
  85.                 // Draw global variable popup
  86.                 case ParameterType.GlobalVariable:
  87.                     if (AdvGame.GetReferences() && AdvGame.GetReferences().variablesManager)
  88.                     {
  89.                         VariablesManager variablesManager = AdvGame.GetReferences().variablesManager;
  90.                         int newGlobalVar = ShowVarSelectorGUI(parameterLabel, variablesManager.vars, t.parameters[i].intValue);
  91.                         if (newGlobalVar != t.parameters[i].intValue)
  92.                         {
  93.                             t.parameters[i].intValue = newGlobalVar;
  94.                             isUpdated = true;
  95.                         }
  96.                     }
  97.                     else
  98.                     {
  99.                         EditorGUILayout.HelpBox("A Variables Manager is required to pass Global Variables.", MessageType.Warning);
  100.                     }
  101.                     break;
  102.  
  103.                 // Draw local variable popup
  104.                 case ParameterType.LocalVariable:
  105.                     if (KickStarter.localVariables)
  106.                     {
  107.                         int newLocalVar = ShowVarSelectorGUI(parameterLabel, KickStarter.localVariables.localVars, t.parameters[i].intValue);
  108.                         if (newLocalVar != t.parameters[i].intValue)
  109.                         {
  110.                             t.parameters[i].intValue = newLocalVar;
  111.                             isUpdated = true;
  112.                         }
  113.                     }
  114.                     else
  115.                     {
  116.                         EditorGUILayout.HelpBox("A GameEngine prefab is required to pass Local Variables.", MessageType.Warning);
  117.                     }
  118.                     break;
  119.  
  120.                 // Draw inventory popup
  121.                 case ParameterType.InventoryItem:
  122.                     if (AdvGame.GetReferences() && AdvGame.GetReferences().inventoryManager)
  123.                     {
  124.                         InventoryManager inventoryManager = AdvGame.GetReferences().inventoryManager;
  125.                         int newInventoryItem = ShowInvItemSelectorGUI(parameterLabel, inventoryManager.items, t.parameters[i].intValue);
  126.                         if (newInventoryItem != t.parameters[i].intValue)
  127.                         {
  128.                             t.parameters[i].intValue = newInventoryItem;
  129.                             isUpdated = true;
  130.                         }
  131.                     }
  132.                     else
  133.                     {
  134.                         EditorGUILayout.HelpBox("An Inventory Manager is required to pass Inventory items.", MessageType.Warning);
  135.                     }
  136.                     break;
  137.  
  138.                 // Draw unity object selection field
  139.                 case ParameterType.UnityObject:
  140.                     Object newObj = (Object) EditorGUILayout.ObjectField(parameterLabel, t.parameters[i].objectValue, typeof(Object), true);
  141.                     if (newObj != t.parameters[i].objectValue)
  142.                     {
  143.                         t.parameters[i].objectValue = newObj;
  144.                         EditorUtility.SetDirty(t);
  145.                     }
  146.                     break;
  147.  
  148.  
  149.                 // Draw game object selection field
  150.                 case ParameterType.GameObject:
  151.  
  152.                     // If gameObject is not set, try to find it by constantID
  153.                     if (t.parameters[i].gameObject == null)
  154.                         t.parameters[i].SetValue(Utils.GetObjectByID(t.parameters[i].intValue), t.parameters[i].intValue);
  155.  
  156.                     EditorGUILayout.BeginHorizontal();
  157.                     GameObject newGO = EditorGUILayout.ObjectField(parameterLabel, t.parameters[i].gameObject, typeof(GameObject), true) as GameObject;
  158.                     GUILayout.Label("[ID: " + t.parameters[i].intValue + "]", GUILayout.ExpandWidth(false));
  159.                     EditorGUILayout.EndHorizontal();
  160.  
  161.                     // Save new gameObject value and constantID
  162.                     if (newGO != t.parameters[i].gameObject)
  163.                     {
  164.                         if (newGO == null)
  165.                         {
  166.                             t.parameters[i].SetValue(newGO);
  167.                         }
  168.                         else
  169.                         {
  170.                             var constantID = newGO.GetComponent<ConstantID>();
  171.                             if (constantID == null)
  172.                             {
  173.                                 constantID = newGO.AddComponent<ConstantID>();
  174.                                 EditorUtility.SetDirty(newGO);
  175.                             }
  176.                             t.parameters[i].SetValue(newGO, constantID.constantID);
  177.                         }
  178.                         isUpdated = true;
  179.                     }
  180.                     break;
  181.             }
  182.         }
  183.         EditorGUILayout.EndVertical();
  184.        
  185.         if (isUpdated)
  186.         {
  187.             // If any changes made, set target dirty
  188.             EditorUtility.SetDirty(t);
  189.  
  190.             // If changes made while game is playing, apply
  191.             if (Application.isPlaying)
  192.                 t.ApplyValues();
  193.         }
  194.     }
  195.  
  196.     private int ShowInvItemSelectorGUI(string label, List<InvItem> items, int ID)
  197.     {
  198.         int invNumber = -1;
  199.  
  200.         List<string> labelList = new List<string>();
  201.         labelList.Add(" (None)");
  202.         foreach (InvItem _item in items)
  203.         {
  204.             labelList.Add(_item.label);
  205.         }
  206.  
  207.         invNumber = GetInvNumber(items, ID) + 1;
  208.         invNumber = EditorGUILayout.Popup(label, invNumber, labelList.ToArray()) - 1;
  209.  
  210.         if (invNumber >= 0)
  211.         {
  212.             return items[invNumber].id;
  213.         }
  214.         return -1;
  215.     }
  216.  
  217.     private int GetInvNumber(List<InvItem> items, int ID)
  218.     {
  219.         int i = 0;
  220.         foreach (InvItem _item in items)
  221.         {
  222.             if (_item.id == ID)
  223.             {
  224.                 return i;
  225.             }
  226.             i++;
  227.         }
  228.         return -1;
  229.     }
  230.  
  231.     private int ShowVarSelectorGUI(string label, List<GVar> vars, int ID)
  232.     {
  233.         int variableNumber = -1;
  234.  
  235.         List<string> labelList = new List<string>();
  236.         labelList.Add(" (None)");
  237.         foreach (GVar _var in vars)
  238.         {
  239.             labelList.Add(_var.label);
  240.         }
  241.  
  242.         variableNumber = GetVarNumber(vars, ID) + 1;
  243.         variableNumber = EditorGUILayout.Popup(label, variableNumber, labelList.ToArray()) - 1;
  244.  
  245.         if (variableNumber >= 0)
  246.         {
  247.             return vars[variableNumber].id;
  248.         }
  249.  
  250.         return -1;
  251.     }
  252.  
  253.     private int GetVarNumber(List<GVar> vars, int ID)
  254.     {
  255.         int i = 0;
  256.         foreach (GVar _var in vars)
  257.         {
  258.             if (_var.id == ID)
  259.             {
  260.                 return i;
  261.             }
  262.             i++;
  263.         }
  264.         return -1;
  265.     }
  266. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement