GUI и массивы
id0 Дата: Вс, 29 Июл 2012, 01:53 | Сообщение # 1
Сообщений: 9
Награды:
0
Репутация:
7
Статус: Offline
Здравствуйте, друзья. Значит есть такой скрипт: Code
using UnityEngine; using System.Collections; using System.Collections.Generic; public class Shop : MonoBehaviour { public int BuyPrice; public int SellPrice; public string[] Name = new string[4]; private Vector2 shopScroll; private int i = 4; private GameObject GC; private delegate void MenuPage(); private MenuPage currentMenu; //shop screen private Rect shopWindowView = new Rect(810f, 50f, 250f, 505f); private Rect shopWindow = new Rect(800f, 0f, 300f, 800f); private bool itemWindowDraw = false; private Rect shopButton = new Rect(0f, 0f, 480f, 20f); private InventoryItem shopMenuItem; // Use this for initialization void Start () { GC = GameObject.Find("GameControl"); currentMenu = NoMenu; } // Update is called once per frame void Update () { } public void NoMenu(){ } //shop menu public void ShopMenu(){ GameControl gac = (GameControl)GC.GetComponent("GameControl"); Rect r = new Rect(820,70,200,30); InventoryItem it = gac.inventoryControl.FindItem(Name[i]); //итем ищется в инвентаре по имени GUI.Box(shopWindowView, "Shop"); for (i = 0; i < Name.Length; i++){ if(GUI.Button(r, it.fullName + " - " + (it.price + BuyPrice))){ if (it != null){ if(gac.Money >= (it.price + BuyPrice)){ gac.messages.AddMessage("Item added:" + it.name + "-" + it.fullName, 5.0f); gac.AddjustMoney(-(it.price + BuyPrice)); gac.currentChar.AddItem(it, true); } else gac.messages.AddMessage("Not enough money", 5.0f); } r.y += 36; } } } void OnGUI(){ currentMenu(); } public void OnTriggerEnter(Collider other) { if(other.CompareTag("Player")){ currentMenu = ShopMenu; } } public void OnTriggerExit(Collider other) { if(other.CompareTag("Player")){ currentMenu = NoMenu; } } }
Наверное понятно что я хочу сделать, это скрипт магазина, он вызываает переменные из другого скрипта - скрипта инвентаря. Ошибку при компиляции не выдаёт - всё нормально. Но когда заходишь в магазин получаешь ошибку - Array index is out of range. - на этой строке: Code
InventoryItem it = gac.inventoryControl.FindItem(Name[i]);
Помогите пожалуйста. Я понимаю что я что-то делаю неправильно, но не знаю что, я уже весь мозг себе сломал. Может быть это совсем не так делается, тогда подскажите как лучше. В общем я пытаюсь сделать чтобы количество и имена итемов лежащих в магазине (кнопок) можно было назначить в инспекторе, а не иметь заранее подготовленное количество (так-то как раз всё работает).
Сообщение отредактировал id0 - Вс, 29 Июл 2012, 01:57
Сообщение Здравствуйте, друзья. Значит есть такой скрипт: Code
using UnityEngine; using System.Collections; using System.Collections.Generic; public class Shop : MonoBehaviour { public int BuyPrice; public int SellPrice; public string[] Name = new string[4]; private Vector2 shopScroll; private int i = 4; private GameObject GC; private delegate void MenuPage(); private MenuPage currentMenu; //shop screen private Rect shopWindowView = new Rect(810f, 50f, 250f, 505f); private Rect shopWindow = new Rect(800f, 0f, 300f, 800f); private bool itemWindowDraw = false; private Rect shopButton = new Rect(0f, 0f, 480f, 20f); private InventoryItem shopMenuItem; // Use this for initialization void Start () { GC = GameObject.Find("GameControl"); currentMenu = NoMenu; } // Update is called once per frame void Update () { } public void NoMenu(){ } //shop menu public void ShopMenu(){ GameControl gac = (GameControl)GC.GetComponent("GameControl"); Rect r = new Rect(820,70,200,30); InventoryItem it = gac.inventoryControl.FindItem(Name[i]); //итем ищется в инвентаре по имени GUI.Box(shopWindowView, "Shop"); for (i = 0; i < Name.Length; i++){ if(GUI.Button(r, it.fullName + " - " + (it.price + BuyPrice))){ if (it != null){ if(gac.Money >= (it.price + BuyPrice)){ gac.messages.AddMessage("Item added:" + it.name + "-" + it.fullName, 5.0f); gac.AddjustMoney(-(it.price + BuyPrice)); gac.currentChar.AddItem(it, true); } else gac.messages.AddMessage("Not enough money", 5.0f); } r.y += 36; } } } void OnGUI(){ currentMenu(); } public void OnTriggerEnter(Collider other) { if(other.CompareTag("Player")){ currentMenu = ShopMenu; } } public void OnTriggerExit(Collider other) { if(other.CompareTag("Player")){ currentMenu = NoMenu; } } }
Наверное понятно что я хочу сделать, это скрипт магазина, он вызываает переменные из другого скрипта - скрипта инвентаря. Ошибку при компиляции не выдаёт - всё нормально. Но когда заходишь в магазин получаешь ошибку - Array index is out of range. - на этой строке: Code
InventoryItem it = gac.inventoryControl.FindItem(Name[i]);
Помогите пожалуйста. Я понимаю что я что-то делаю неправильно, но не знаю что, я уже весь мозг себе сломал. Может быть это совсем не так делается, тогда подскажите как лучше. В общем я пытаюсь сделать чтобы количество и имена итемов лежащих в магазине (кнопок) можно было назначить в инспекторе, а не иметь заранее подготовленное количество (так-то как раз всё работает). Автор - id0 Дата добавления - 29 Июл 2012 в 01:53
Aswo Дата: Вс, 29 Июл 2012, 09:03 | Сообщение # 2
КЗОИ
Сообщений: 1031
Награды:
18
Репутация:
430
Статус: Offline
id0 , не пробовали увеличить размер массива?
end.
Сообщение id0 , не пробовали увеличить размер массива?Автор - Aswo Дата добавления - 29 Июл 2012 в 09:03
id0 Дата: Вс, 29 Июл 2012, 10:40 | Сообщение # 3
Сообщений: 9
Награды:
0
Репутация:
7
Статус: Offline
В каком смысле? Я уже всё перепробовал. Я не программист, художник я - помоггите!
Сообщение отредактировал id0 - Вс, 29 Июл 2012, 10:46
Сообщение В каком смысле? Я уже всё перепробовал. Я не программист, художник я - помоггите! Автор - id0 Дата добавления - 29 Июл 2012 в 10:40
seaman Дата: Вс, 29 Июл 2012, 10:46 | Сообщение # 4
Гуру
Сообщений: 1748
Награды:
10
Репутация:
660
Статус: Offline
Вообще должна быть ошибка при компиляции, т.к. в строке, которую вы привели i еще не определено. Перенесите ее внутрь цикла. Да, еще непонятно зачем Вы ищете каждый раз компонент GameControl? Правильнее его найти один раз в Start: Code
private GameControl gac; ... void Start () { gac = GameObject.Find("GameControl").GetComponent<GameControl>();
Сообщение Вообще должна быть ошибка при компиляции, т.к. в строке, которую вы привели i еще не определено. Перенесите ее внутрь цикла. Да, еще непонятно зачем Вы ищете каждый раз компонент GameControl? Правильнее его найти один раз в Start: Code
private GameControl gac; ... void Start () { gac = GameObject.Find("GameControl").GetComponent<GameControl>();
Автор - seaman Дата добавления - 29 Июл 2012 в 10:46
id0 Дата: Вс, 29 Июл 2012, 11:12 | Сообщение # 5
Сообщений: 9
Награды:
0
Репутация:
7
Статус: Offline
Урррря!!! Спасибо Сделал вот так: Code
public void ShopMenu(){ Rect r = new Rect(820,70,200,30); InventoryItem it; //итем ищется в инвентаре по имени GUI.Box(shopWindowView, "Shop"); for (i = 0; i < Name.Length; i++){ it = gac.inventoryControl.FindItem(Name[i]); if(GUI.Button(r, it.fullName + " - " + (it.price + BuyPrice))){ if (it != null){ if(gac.Money >= (it.price + BuyPrice)){ gac.messages.AddMessage("Item added:" + it.name + "-" + it.fullName, 5.0f); gac.AddjustMoney(-(it.price + BuyPrice)); gac.currentChar.AddItem(it, true); } else gac.messages.AddMessage("Not enough money", 5.0f); } } r.y += 36; } }
Теперь всё пашёт. У меня теперь другой вопрос. Как убить кнопку из массива, когда она нажимается? (чтобы итем покупался один только раз?) З.Ы. Кому интересно - инвентарь брал вот тут И сейчас допиливаю его под себя, могу потом выложить пак
Сообщение отредактировал id0 - Вс, 29 Июл 2012, 11:23
Сообщение Урррря!!! Спасибо Сделал вот так: Code
public void ShopMenu(){ Rect r = new Rect(820,70,200,30); InventoryItem it; //итем ищется в инвентаре по имени GUI.Box(shopWindowView, "Shop"); for (i = 0; i < Name.Length; i++){ it = gac.inventoryControl.FindItem(Name[i]); if(GUI.Button(r, it.fullName + " - " + (it.price + BuyPrice))){ if (it != null){ if(gac.Money >= (it.price + BuyPrice)){ gac.messages.AddMessage("Item added:" + it.name + "-" + it.fullName, 5.0f); gac.AddjustMoney(-(it.price + BuyPrice)); gac.currentChar.AddItem(it, true); } else gac.messages.AddMessage("Not enough money", 5.0f); } } r.y += 36; } }
Теперь всё пашёт. У меня теперь другой вопрос. Как убить кнопку из массива, когда она нажимается? (чтобы итем покупался один только раз?) З.Ы. Кому интересно - инвентарь брал вот тут И сейчас допиливаю его под себя, могу потом выложить пак Автор - id0 Дата добавления - 29 Июл 2012 в 11:12
seaman Дата: Вс, 29 Июл 2012, 11:32 | Сообщение # 6
Гуру
Сообщений: 1748
Награды:
10
Репутация:
660
Статус: Offline
Quote
Как убить кнопку из массива
1. Ставить ей имя "None". При выводе проверять на равенство этому имени. Если да - не выводить. 2. Но лучше перейти на Lsit<string> вместо массива и просто удалять оттуда не нужные элементы/добавлять в свой лист при покупке. Гораздо гибче, чем массивы.
Сообщение Quote
Как убить кнопку из массива
1. Ставить ей имя "None". При выводе проверять на равенство этому имени. Если да - не выводить. 2. Но лучше перейти на Lsit<string> вместо массива и просто удалять оттуда не нужные элементы/добавлять в свой лист при покупке. Гораздо гибче, чем массивы.Автор - seaman Дата добавления - 29 Июл 2012 в 11:32
id0 Дата: Вс, 29 Июл 2012, 11:40 | Сообщение # 7
Сообщений: 9
Награды:
0
Репутация:
7
Статус: Offline
Там в List что-то очень страшное, я ничего не понял). Разберусь конечно, если будет крайняя необходимость. Ну хорошо, а вот я нажал на кнопочку, и как её после заблокировать (необязательно убирать, главное чтобы нельзя больше было нажать на неё)? Ткните рыльцем где что написать? Повторяю, я художник, у меня с логикой туго) Ну ладно, всё равно спасибо
Сообщение отредактировал id0 - Вс, 29 Июл 2012, 12:41
Сообщение Там в List что-то очень страшное, я ничего не понял). Разберусь конечно, если будет крайняя необходимость. Ну хорошо, а вот я нажал на кнопочку, и как её после заблокировать (необязательно убирать, главное чтобы нельзя больше было нажать на неё)? Ткните рыльцем где что написать? Повторяю, я художник, у меня с логикой туго) Ну ладно, всё равно спасибо Автор - id0 Дата добавления - 29 Июл 2012 в 11:40
seaman Дата: Вс, 29 Июл 2012, 15:30 | Сообщение # 8
Гуру
Сообщений: 1748
Награды:
10
Репутация:
660
Статус: Offline
Пропускаем все кнопки, у которых имя "None" Code
for (i = 0; i < Name.Length; i++){ if(Name[i] == "None") continue;
Устанавливает имя при покупке - в следующем кадре эта кнопка не будет отрисовываться, т.к. имя = "None" Code
if(gac.Money >= (it.price + BuyPrice)){ Name[i] = "None";
Но на самом деле - правильнее не просто не выводить кнопки, а удалять их из инвентаря. Это проще сделать с List
Сообщение Пропускаем все кнопки, у которых имя "None" Code
for (i = 0; i < Name.Length; i++){ if(Name[i] == "None") continue;
Устанавливает имя при покупке - в следующем кадре эта кнопка не будет отрисовываться, т.к. имя = "None" Code
if(gac.Money >= (it.price + BuyPrice)){ Name[i] = "None";
Но на самом деле - правильнее не просто не выводить кнопки, а удалять их из инвентаря. Это проще сделать с List Автор - seaman Дата добавления - 29 Июл 2012 в 15:30
id0 Дата: Вс, 29 Июл 2012, 18:41 | Сообщение # 9
Сообщений: 9
Награды:
0
Репутация:
7
Статус: Offline
Спасибо большое!
Сообщение Спасибо большое! Автор - id0 Дата добавления - 29 Июл 2012 в 18:41