//draws the in app purchase editor void DrawIAP(List<IAPGroup> list) { EditorGUILayout.BeginHorizontal(); GUI.backgroundColor = Color.yellow; //draw yellow button for adding a new IAP group if (GUILayout.Button("Add new Category")) { //create new group, give it a generic name based on //the current unix time and add it to the list of groups IAPGroup newGroup = new IAPGroup(); string timestamp = GenerateUnixTime(); newGroup.name = "Grp " + timestamp; newGroup.id = timestamp; list.Add(newGroup); return; } GUI.backgroundColor = Color.white; EditorGUILayout.EndHorizontal(); //begin a scrolling view inside this tab, pass in current Vector2 scroll position scrollPosIAP = EditorGUILayout.BeginScrollView(scrollPosIAP, GUILayout.Height(462)); GUILayout.Space(20); //loop over IAP groups for (int i = 0; i < list.Count; i++) { //cache group IAPGroup group = list[i]; //populate shop container variables if ShopManager is present Container shopGroup = null; if (shop) { shopGroup = shop.GetContainer(group.id); if (shopGroup == null) { shopGroup = new Container(); shopGroup.id = group.id; shop.containers.Add(shopGroup); } } EditorGUILayout.BeginHorizontal(); GUI.backgroundColor = Color.yellow; //button for adding a new IAPObject (product) to this group if (GUILayout.Button("New Object", GUILayout.Width(120))) { IAPObject newObj = new IAPObject(); //add platform dependent ids to the local list int platforms = System.Enum.GetValues(typeof(IAPPlatform)).Length; for (int j = 0; j < platforms; j++) newObj.localId.Add(new IAPIdentifier()); group.items.Add(newObj); break; } //draw group properties GUI.backgroundColor = Color.white; EditorGUILayout.LabelField("Category:", GUILayout.Width(60)); group.name = EditorGUILayout.TextField(group.name, GUILayout.Width(90)); GUILayout.FlexibleSpace(); if (!shop) EditorGUILayout.LabelField("No ShopManager prefab found in this scene!", GUILayout.Width(300)); else { EditorGUILayout.LabelField("Prefab:", GUILayout.Width(45)); shopGroup.prefab = (GameObject)EditorGUILayout.ObjectField(shopGroup.prefab, typeof(GameObject), false, GUILayout.Width(100)); GUILayout.Space(10); EditorGUILayout.LabelField("Parent:", GUILayout.Width(45)); shopGroup.parent = (Transform)EditorGUILayout.ObjectField(shopGroup.parent, typeof(Transform), true, GUILayout.Width(100)); } GUILayout.FlexibleSpace(); //button width for up & down buttons. These should always be at the same width, //so if there's only one button (e.g. if there's only one group), the width must be extended int groupUpWidth = 22; int groupDownWidth = 22; if (i == 0) groupDownWidth = 48; if (i == list.Count - 1) groupUpWidth = 48; //draw up & down buttons for re-ordering groups //this will simply switch references in the list //hotControl and keyboardControl unsets current mouse focus if (i > 0 && GUILayout.Button("▲", GUILayout.Width(groupUpWidth))) { list[i] = list[i - 1]; list[i - 1] = group; EditorGUIUtility.hotControl = 0; EditorGUIUtility.keyboardControl = 0; } if (i < list.Count - 1 && GUILayout.Button("▼", GUILayout.Width(groupDownWidth))) { list[i] = list[i + 1]; list[i + 1] = group; EditorGUIUtility.hotControl = 0; EditorGUIUtility.keyboardControl = 0; } //button for removing a group including items GUI.backgroundColor = Color.gray; if (GUILayout.Button("X", GUILayout.Width(20))) { if(shop) shop.containers.Remove(shopGroup); list.RemoveAt(i); break; } GUI.backgroundColor = Color.white; EditorGUILayout.EndHorizontal(); GUILayout.Box("", GUILayout.ExpandWidth(true), GUILayout.Height(1)); //draw header information for each item property EditorGUILayout.BeginHorizontal(); GUILayout.Space(58); EditorGUILayout.LabelField("ID:", GUILayout.Width(100)); EditorGUILayout.LabelField("Icon:", GUILayout.Width(65)); EditorGUILayout.LabelField("Type:", GUILayout.Width(80)); EditorGUILayout.LabelField("Fetch:", GUILayout.Width(100)); EditorGUILayout.LabelField("Title:", GUILayout.Width(145)); if (group.items.Count == 1) GUILayout.Space(50); EditorGUILayout.LabelField("Description:", GUILayout.Width(150)); EditorGUILayout.LabelField("Specific Settings:", GUILayout.Width(135)); EditorGUILayout.LabelField("Price:", GUILayout.Width(100)); EditorGUILayout.EndHorizontal(); //loop over items in this group for (int j = 0; j < group.items.Count; j++) { //cache item reference IAPObject obj = group.items[j]; EditorGUILayout.BeginHorizontal(); obj.platformFoldout = EditorGUILayout.Foldout(obj.platformFoldout, ""); IAPType selectedType = obj.type; //draw IAPObject (item/product) properties obj.id = EditorGUILayout.TextField(obj.id, GUILayout.Width(100)); obj.icon = EditorGUILayout.ObjectField(obj.icon, typeof(Sprite), false, GUILayout.Width(65)) as Sprite; obj.type = (IAPType)EditorGUILayout.EnumPopup(obj.type, GUILayout.Width(90)); obj.fetch = EditorGUILayout.Toggle(obj.fetch, GUILayout.Width(20)); obj.title = EditorGUILayout.TextField(obj.title); obj.description = EditorGUILayout.TextField(obj.description); if (obj.type != selectedType) { obj.specific = ""; obj.amount = 0; } DrawTypeSettings(obj); obj.realPrice = EditorGUILayout.TextField(obj.realPrice, GUILayout.Width(60)); //button for adding a requirement to this item if (!string.IsNullOrEmpty(obj.req.entry)) GUI.backgroundColor = Color.yellow; if (GUILayout.Button("R", GUILayout.Width(20))) { reqEditor = (RequirementEditor)EditorWindow.GetWindowWithRect(typeof(RequirementEditor), new Rect(0, 0, 300, 150), false, "Requirement"); reqEditor.obj = obj; } GUI.backgroundColor = Color.white; //do the same here as with the group up & down buttons //(see above) int buttonUpWidth = 22; int buttonDownWidth = 22; if (j == 0) buttonDownWidth = 48; if (j == group.items.Count - 1) buttonUpWidth = 48; //draw up & down buttons for re-ordering items in a group //this will simply switch references in the list if (j > 0 && GUILayout.Button("▲", GUILayout.Width(buttonUpWidth))) { group.items[j] = group.items[j - 1]; group.items[j - 1] = obj; EditorGUIUtility.hotControl = 0; EditorGUIUtility.keyboardControl = 0; } if (j < group.items.Count - 1 && GUILayout.Button("▼", GUILayout.Width(buttonDownWidth))) { group.items[j] = group.items[j + 1]; group.items[j + 1] = obj; EditorGUIUtility.hotControl = 0; EditorGUIUtility.keyboardControl = 0; } //button for removing an item of the group GUI.backgroundColor = Color.gray; if (GUILayout.Button("X")) { group.items.RemoveAt(j); break; } GUI.backgroundColor = Color.white; EditorGUILayout.EndHorizontal(); //draw platform override foldout if (obj.platformFoldout) { EditorGUILayout.LabelField("Platform ID Overrides"); for (int k = 0; k < obj.localId.Count; k++) { EditorGUILayout.BeginHorizontal(); GUILayout.Space(40); obj.localId[k].overridden = EditorGUILayout.BeginToggleGroup("", obj.localId[k].overridden); EditorGUILayout.BeginHorizontal(); obj.localId[k].id = EditorGUILayout.TextField(obj.localId[k].id, GUILayout.Width(120)); EditorGUILayout.LabelField(((IAPPlatform)k).ToString()); EditorGUILayout.EndHorizontal(); EditorGUILayout.EndToggleGroup(); EditorGUILayout.EndHorizontal(); } } } GUILayout.Box("", GUILayout.ExpandWidth(true), GUILayout.Height(1)); GUILayout.Space(30); } //ends the scrollview defined above EditorGUILayout.EndScrollView(); }
//draws the in game content editor void DrawIGC(List<IAPGroup> list) { EditorGUILayout.BeginHorizontal(); GUI.backgroundColor = Color.yellow; //draw currencies up to a maximum of 9 //(there is no limitation, but 9 currencies do fit in the window nicely, //and there really shouldnt be a reason to have 9+ different currencies) if (script.currency.Count < 9) { //button for adding a new currency if (GUILayout.Button("Add Currency")) { //create new currency, then loop over items //and add a new currency slot for each of them IAPCurrency currency = new IAPCurrency(); script.currency.Add(currency); return; } } else { //for more than 9 currencies, //we show a transparent button with no functionality GUI.backgroundColor = new Color(1, 0.9f, 0, 0.4f); if (GUILayout.Button("Add Currency")) { } } GUI.backgroundColor = Color.yellow; //draw yellow button for adding a new IAP group if (GUILayout.Button("Add new Category")) { //create new group, give it a generic name based on //the current system time and add it to the list of groups IAPGroup newGroup = new IAPGroup(); string timestamp = GenerateUnixTime(); newGroup.name = "Grp " + timestamp; newGroup.id = timestamp; list.Add(newGroup); return; } GUI.backgroundColor = Color.white; EditorGUILayout.EndHorizontal(); //begin a scrolling view inside tab, pass in current Vector2 scroll position scrollPosIGC = EditorGUILayout.BeginScrollView(scrollPosIGC, GUILayout.Height(462)); GUILayout.Space(10); //only draw a box behind currencies if there are any if (script.currency.Count > 0) { EditorGUILayout.LabelField("Currencies:", EditorStyles.boldLabel); GUILayout.Space(10); GUI.Box(new Rect(10, 35, script.currency.Count * 110, 65), ""); } EditorGUILayout.BeginHorizontal(); GUILayout.Space(10); //loop through currencies for (int i = 0; i < script.currency.Count; i++) { IAPCurrency current = script.currency[i]; EditorGUILayout.BeginVertical(); //draw currency properties, //such as name and amount EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Name", GUILayout.Width(44)); current.name = EditorGUILayout.TextField(current.name, GUILayout.Width(54)); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Default", GUILayout.Width(44)); script.currency[i].amount = EditorGUILayout.IntField(script.currency[i].amount, GUILayout.Width(54)); EditorGUILayout.EndHorizontal(); //button for deleting a currency EditorGUILayout.BeginHorizontal(); GUILayout.Space(52); GUI.backgroundColor = Color.gray; if (GUILayout.Button("X", GUILayout.Width(54))) { //ask again before deleting the currency, //as deleting it could cause angry customers! //it's probably better not to remove currencies in production versions if (EditorUtility.DisplayDialog("Delete Currency?", "Existing users might lose their funds associated with this currency when updating.", "Continue", "Abort")) { //then remove the currency script.currency.RemoveAt(i); break; } } GUI.backgroundColor = Color.white; EditorGUILayout.EndHorizontal(); EditorGUILayout.EndVertical(); } GUILayout.FlexibleSpace(); EditorGUILayout.EndHorizontal(); GUILayout.Space(30); //loop over IAP groups for (int i = 0; i < list.Count; i++) { //cache group IAPGroup group = list[i]; Container shopGroup = null; if (shop) { shopGroup = shop.GetContainer(group.id); if (shopGroup == null) { shopGroup = new Container(); shopGroup.id = group.id; shop.containers.Add(shopGroup); } } EditorGUILayout.BeginHorizontal(); GUI.backgroundColor = Color.yellow; //button for adding a new IAPObject (product) to this group if (GUILayout.Button("New Object", GUILayout.Width(120))) { IAPObject obj = new IAPObject(); group.items.Add(obj); break; } GUI.backgroundColor = Color.white; //draw group properties EditorGUILayout.LabelField("Category:", GUILayout.Width(60)); group.name = EditorGUILayout.TextField(group.name, GUILayout.Width(90)); GUILayout.FlexibleSpace(); if (!shop) EditorGUILayout.LabelField("No ShopManager prefab found in this scene!", GUILayout.Width(300)); else { EditorGUILayout.LabelField("Prefab:", GUILayout.Width(45)); shopGroup.prefab = (GameObject)EditorGUILayout.ObjectField(shopGroup.prefab, typeof(GameObject), false, GUILayout.Width(100)); GUILayout.Space(10); EditorGUILayout.LabelField("Parent:", GUILayout.Width(45)); shopGroup.parent = (Transform)EditorGUILayout.ObjectField(shopGroup.parent, typeof(Transform), true, GUILayout.Width(100)); } GUILayout.FlexibleSpace(); //same as in DrawIAP(), //move group up & down buttons int groupUpWidth = 22; int groupDownWidth = 22; if (i == 0) groupDownWidth = 48; if (i == list.Count - 1) groupUpWidth = 48; if (i > 0 && GUILayout.Button("▲", GUILayout.Width(groupUpWidth))) { list[i] = list[i - 1]; list[i - 1] = group; EditorGUIUtility.hotControl = 0; EditorGUIUtility.keyboardControl = 0; } if (i < list.Count - 1 && GUILayout.Button("▼", GUILayout.Width(groupDownWidth))) { list[i] = list[i + 1]; list[i + 1] = group; EditorGUIUtility.hotControl = 0; EditorGUIUtility.keyboardControl = 0; } //button for removing a group including items GUI.backgroundColor = Color.gray; if (GUILayout.Button("X", GUILayout.Width(20))) { if(shop) shop.containers.Remove(shopGroup); list.RemoveAt(i); break; } GUI.backgroundColor = Color.white; EditorGUILayout.EndHorizontal(); GUILayout.Box("", GUILayout.ExpandWidth(true), GUILayout.Height(1)); //draw header information for each item property EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("ID:", GUILayout.Width(120)); EditorGUILayout.LabelField("Icon:", GUILayout.Width(65)); EditorGUILayout.LabelField("Type:", GUILayout.Width(165)); EditorGUILayout.LabelField("Title:", GUILayout.Width(122)); if (group.items.Count == 1) GUILayout.Space(50); EditorGUILayout.LabelField("Description:", GUILayout.Width(150)); EditorGUILayout.LabelField("Specific Settings:", GUILayout.Width(135)); EditorGUILayout.LabelField("Price:", GUILayout.Width(100)); EditorGUILayout.EndHorizontal(); //loop over items in this group for (int j = 0; j < group.items.Count; j++) { //cache item reference IAPObject obj = group.items[j]; EditorGUILayout.BeginHorizontal(); IAPType selectedType = obj.type; //draw IAPObject (item/product) properties obj.id = EditorGUILayout.TextField(obj.id, GUILayout.Width(120)); obj.icon = EditorGUILayout.ObjectField(obj.icon, typeof(Sprite), false, GUILayout.Width(65)) as Sprite; obj.type = (IAPType)EditorGUILayout.EnumPopup(obj.type, GUILayout.Width(110)); obj.title = EditorGUILayout.TextField(obj.title); obj.description = EditorGUILayout.TextField(obj.description); if (obj.type != selectedType) { obj.specific = ""; obj.amount = 0; } DrawTypeSettings(obj); //price field int priceIndex = 0; for (int k = 0; k < currencyNames.Length; k++) { if (obj.virtualPrice.name == currencyNames[k]) priceIndex = k; } priceIndex = EditorGUILayout.Popup(priceIndex, currencyNames, GUILayout.Width(60)); obj.virtualPrice.name = currencyNames[priceIndex]; obj.virtualPrice.amount = EditorGUILayout.IntField(obj.virtualPrice.amount, GUILayout.Width(60)); //same as in DrawIAP(), requirement button if (!string.IsNullOrEmpty(obj.req.entry)) GUI.backgroundColor = Color.yellow; if (GUILayout.Button("R", GUILayout.Width(20))) { reqEditor = (RequirementEditor)EditorWindow.GetWindowWithRect(typeof(RequirementEditor), new Rect(0, 0, 300, 150), false, "Requirement"); reqEditor.obj = obj; } GUI.backgroundColor = Color.white; //same as in DrawIAP(), move item up & down buttons int buttonUpWidth = 22; int buttonDownWidth = 22; if (j == 0) buttonDownWidth = 48; if (j == group.items.Count - 1) buttonUpWidth = 48; if (j > 0 && GUILayout.Button("▲", GUILayout.Width(buttonUpWidth))) { group.items[j] = group.items[j - 1]; group.items[j - 1] = obj; EditorGUIUtility.hotControl = 0; EditorGUIUtility.keyboardControl = 0; } if (j < group.items.Count - 1 && GUILayout.Button("▼", GUILayout.Width(buttonDownWidth))) { group.items[j] = group.items[j + 1]; group.items[j + 1] = obj; EditorGUIUtility.hotControl = 0; EditorGUIUtility.keyboardControl = 0; } //button for removing an item of the group GUI.backgroundColor = Color.gray; if (GUILayout.Button("X")) { group.items.RemoveAt(j); break; } GUI.backgroundColor = Color.white; EditorGUILayout.EndHorizontal(); } GUILayout.Box("", GUILayout.ExpandWidth(true), GUILayout.Height(1)); GUILayout.Space(30); } //ends the scrollview defined above EditorGUILayout.EndScrollView(); }
//draws the in game content editor void DrawIGC(List<IAPGroup> list) { EditorGUILayout.BeginHorizontal(); GUI.backgroundColor = Color.yellow; //draw currencies up to a maximum of 7 //(there is no limitation, but 7 currencies do fit in the window nicely, //and there really shouldnt be a reason to have 7+ different currencies) if (script.currency.Count < 7) { //button for adding a new currency if (GUILayout.Button("Add Currency")) { //switch current currency selection to the first entry currencyIndex = 0; //create new currency, then loop over items //and add a new currency slot for each of them script.currency.Add(new IAPCurrency()); for (int i = 0; i < list.Count; i++) for (int j = 0; j < list[i].items.Count; j++) list[i].items[j].virtualPrice.Add(new IAPCurrency()); return; } } else { //for more than 7 currencies, //we show a transparent button with no functionality GUI.backgroundColor = new Color(1, 0.9f, 0, 0.4f); if (GUILayout.Button("Add Currency")) { } } //draw yellow button for adding a new IAP group if (GUILayout.Button("Add new Group")) { //create new group, give it a generic name based on //the current system time and add it to the list of groups IAPGroup newGroup = new IAPGroup(); string timestamp = GenerateUnixTime(); newGroup.name = "Grp " + timestamp; newGroup.id = timestamp; list.Add(newGroup); return; } GUI.backgroundColor = Color.white; EditorGUILayout.EndHorizontal(); //begin a scrolling view inside tab, pass in current Vector2 scroll position scrollPosIGC = EditorGUILayout.BeginScrollView(scrollPosIGC, GUILayout.Height(350)); GUILayout.Space(20); EditorGUILayout.BeginHorizontal(); //only draw a box behind currencies if there are any if (script.currency.Count > 0) GUI.Box(new Rect(3, 15, 796, 95), ""); //loop through currencies for (int i = 0; i < script.currency.Count; i++) { EditorGUILayout.BeginVertical(); //draw currency properties, //such as name and amount EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Name", GUILayout.Width(44)); script.currency[i].name = EditorGUILayout.TextField(script.currency[i].name, GUILayout.Width(54)); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Default", GUILayout.Width(44)); script.currency[i].amount = EditorGUILayout.IntField(script.currency[i].amount, GUILayout.Width(54)); EditorGUILayout.EndHorizontal(); //button for deleting a currency EditorGUILayout.BeginHorizontal(); GUILayout.Space(52); GUI.backgroundColor = Color.gray; if (GUILayout.Button("X", GUILayout.Width(54))) { //ask again before deleting the currency, //as deleting it could cause angry customers! //it's probably better not to remove currencies in production versions if (EditorUtility.DisplayDialog("Delete Currency?", "Existing users might lose their funds associated with this currency when updating.", "Continue", "Abort")) { //loop over items and remove the //associated currency slot for each of them for (int j = 0; j < list.Count; j++) for (int k = 0; k < list[j].items.Count; k++) list[j].items[k].virtualPrice.RemoveAt(i); //then remove the currency script.currency.RemoveAt(i); //reposition current currency index if (script.currency.Count > 0) currencyIndex = 0; else currencyIndex = -1; break; } } GUI.backgroundColor = Color.white; EditorGUILayout.EndHorizontal(); EditorGUILayout.EndVertical(); } GUILayout.FlexibleSpace(); EditorGUILayout.EndHorizontal(); //draw currency selector, if there are any if (script.currency.Count > 0) { GUILayout.Space(10); EditorGUILayout.BeginHorizontal(); //get all currency names, //then draw a popup list for selecting the desired index currencyNames = GetCurrencyNames(); EditorGUILayout.LabelField("Selected Currency:", GUILayout.Width(120)); currencyIndex = EditorGUILayout.Popup(currencyIndex, currencyNames, GUILayout.Width(140)); EditorGUILayout.EndHorizontal(); GUILayout.Space(20); } //loop over IAP groups for (int i = 0; i < list.Count; i++) { //cache group IAPGroup group = list[i]; //version 1.2 backwards compatibility fix (empty IAPGroup ids) if (string.IsNullOrEmpty(group.id)) group.id = GenerateUnixTime(); Container shopGroup = null; if (shop) { shopGroup = shop.GetContainer(group.id); if (shopGroup == null) { shopGroup = new Container(); shopGroup.id = group.id; shop.containers.Add(shopGroup); } } EditorGUILayout.BeginHorizontal(); GUI.backgroundColor = Color.yellow; //button for adding a new IAPObject (product) to this group if (GUILayout.Button("New Product", GUILayout.Width(120))) { IAPObject newObj = new IAPObject(); for (int j = 0; j < script.currency.Count; j++) newObj.virtualPrice.Add(new IAPCurrency()); group.items.Add(newObj); break; } GUI.backgroundColor = Color.white; //draw group properties EditorGUILayout.LabelField("Group:", GUILayout.Width(45)); group.name = EditorGUILayout.TextField(group.name, GUILayout.Width(90)); GUILayout.Space(10); EditorGUILayout.LabelField("Sort:", GUILayout.Width(35)); orderType = (OrderType)EditorGUILayout.EnumPopup(orderType, GUILayout.Width(60)); GUILayout.Space(10); if (!shop) EditorGUILayout.LabelField("No ShopManager prefab found in this scene!", GUILayout.Width(300)); else { EditorGUILayout.LabelField("Prefab:", GUILayout.Width(45)); shopGroup.prefab = (GameObject)EditorGUILayout.ObjectField(shopGroup.prefab, typeof(GameObject), false, GUILayout.Width(100)); GUILayout.Space(10); EditorGUILayout.LabelField("Parent:", GUILayout.Width(45)); shopGroup.parent = (Transform)EditorGUILayout.ObjectField(shopGroup.parent, typeof(Transform), true, GUILayout.Width(100)); } GUILayout.FlexibleSpace(); if (orderType != OrderType.none) { group.items = orderProducts(group.items); break; } //same as in DrawIAP(), //move group up & down buttons int groupUpWidth = 22; int groupDownWidth = 22; if (i == 0) groupDownWidth = 48; if (i == list.Count - 1) groupUpWidth = 48; if (i > 0 && GUILayout.Button("▲", GUILayout.Width(groupUpWidth))) { list[i] = list[i - 1]; list[i - 1] = group; EditorGUIUtility.hotControl = 0; EditorGUIUtility.keyboardControl = 0; } if (i < list.Count - 1 && GUILayout.Button("▼", GUILayout.Width(groupDownWidth))) { list[i] = list[i + 1]; list[i + 1] = group; EditorGUIUtility.hotControl = 0; EditorGUIUtility.keyboardControl = 0; } //button for removing a group including items GUI.backgroundColor = Color.gray; if (GUILayout.Button("X", GUILayout.Width(20))) { if(shop) shop.containers.Remove(shopGroup); list.RemoveAt(i); break; } GUI.backgroundColor = Color.white; EditorGUILayout.EndHorizontal(); GUILayout.Box("", GUILayout.ExpandWidth(true), GUILayout.Height(1)); //draw header information for each item property EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("ID:", GUILayout.Width(110)); GUILayout.Space(20); EditorGUILayout.LabelField("Icon:", GUILayout.Width(75)); GUILayout.Space(20); EditorGUILayout.LabelField("Type:", GUILayout.Width(100)); GUILayout.Space(20); int spaceTitleToDescription = 90; if (group.items.Count == 1) spaceTitleToDescription = 110; EditorGUILayout.LabelField("Title:", GUILayout.Width(spaceTitleToDescription)); GUILayout.Space(20); int spaceDescriptionToPrice = 135; if (group.items.Count == 1) spaceDescriptionToPrice = 145; EditorGUILayout.LabelField("Description:", GUILayout.Width(spaceDescriptionToPrice)); GUILayout.Space(20); EditorGUILayout.LabelField("Price:", GUILayout.Width(40)); GUILayout.Space(80); EditorGUILayout.EndHorizontal(); //loop over items in this group for (int j = 0; j < group.items.Count; j++) { //cache item reference IAPObject obj = group.items[j]; EditorGUILayout.BeginHorizontal(); //draw IAPObject (item/product) properties obj.id = EditorGUILayout.TextField(obj.id, GUILayout.Width(120)); obj.icon = EditorGUILayout.ObjectField(obj.icon, typeof(Sprite), false, GUILayout.Width(65)) as Sprite; obj.type = (IAPType)EditorGUILayout.EnumPopup(obj.type, GUILayout.Width(110)); //don't allow consumable/non consumable/subscription IAP types, they must be virtual if (obj.type == IAPType.consumable) obj.type = IAPType.consumableVirtual; else if (obj.type == IAPType.nonConsumable || obj.type == IAPType.subscription) obj.type = IAPType.nonConsumableVirtual; //other item properties obj.title = EditorGUILayout.TextField(obj.title); obj.description = EditorGUILayout.TextField(obj.description); //if a currency has been selected previously, //draw an input field for the selected currency if (currencyIndex > -1) { //version 1.1 compability fix (virtual currency int -> IAPCurrency conversion) if (obj.virtualPrice == null || currencyIndex > obj.virtualPrice.Count - 1) { GUI.backgroundColor = Color.gray; if (GUILayout.Button("X")) { group.items.RemoveAt(j); break; } GUI.backgroundColor = Color.white; EditorGUILayout.EndHorizontal(); continue; } EditorGUILayout.BeginHorizontal(); IAPCurrency cur = obj.virtualPrice[currencyIndex]; cur.name = currencyNames[currencyIndex]; EditorGUILayout.LabelField(cur.name, GUILayout.Width(40)); cur.amount = EditorGUILayout.IntField(cur.amount, GUILayout.Width(60)); EditorGUILayout.EndHorizontal(); } else GUILayout.FlexibleSpace(); //same as in DrawIAP(), requirement button if (!string.IsNullOrEmpty(obj.req.entry) || !string.IsNullOrEmpty(obj.req.nextId)) GUI.backgroundColor = Color.yellow; if (GUILayout.Button("R", GUILayout.Width(20))) { reqEditor = (RequirementEditor)EditorWindow.GetWindowWithRect(typeof(RequirementEditor), new Rect(0, 0, 300, 170), false, "Requirement"); reqEditor.obj = obj; } GUI.backgroundColor = Color.white; //same as in DrawIAP(), //move item up & down buttons int buttonUpWidth = 22; int buttonDownWidth = 22; if (j == 0) buttonDownWidth = 48; if (j == group.items.Count - 1) buttonUpWidth = 48; if (j > 0 && GUILayout.Button("▲", GUILayout.Width(buttonUpWidth))) { group.items[j] = group.items[j - 1]; group.items[j - 1] = obj; EditorGUIUtility.hotControl = 0; EditorGUIUtility.keyboardControl = 0; } if (j < group.items.Count - 1 && GUILayout.Button("▼", GUILayout.Width(buttonDownWidth))) { group.items[j] = group.items[j + 1]; group.items[j + 1] = obj; EditorGUIUtility.hotControl = 0; EditorGUIUtility.keyboardControl = 0; } //button for removing an item of the group GUI.backgroundColor = Color.gray; if (GUILayout.Button("X")) { group.items.RemoveAt(j); break; } GUI.backgroundColor = Color.white; EditorGUILayout.EndHorizontal(); } GUILayout.Box("", GUILayout.ExpandWidth(true), GUILayout.Height(1)); GUILayout.Space(30); } //ends the scrollview defined above EditorGUILayout.EndScrollView(); }