GUI и массивы - Форум Игроделов
Вс, 09 Фев 2025, 18:52 
 
Приветствую Вас Гость Главная | Регистрация | Вход
Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
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
В каком смысле?

Я уже всё перепробовал. Я не программист, художник я - помоггите! cry


Сообщение отредактировал id0 - Вс, 29 Июл 2012, 10:46
 
СообщениеВ каком смысле?

Я уже всё перепробовал. Я не программист, художник я - помоггите! cry

Автор - 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
Урррря!!! Спасибо smile Сделал вот так:

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
 
СообщениеУрррря!!! Спасибо smile Сделал вот так:

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 что-то очень страшное, я ничего не понял). Разберусь конечно, если будет крайняя необходимость.
Ну хорошо, а вот я нажал на кнопочку, и как её после заблокировать (необязательно убирать, главное чтобы нельзя больше было нажать на неё)? Ткните рыльцем где что написать? Повторяю, я художник, у меня с логикой туго)
Ну ладно, всё равно спасибо smile


Сообщение отредактировал id0 - Вс, 29 Июл 2012, 12:41
 
СообщениеТам в List что-то очень страшное, я ничего не понял). Разберусь конечно, если будет крайняя необходимость.
Ну хорошо, а вот я нажал на кнопочку, и как её после заблокировать (необязательно убирать, главное чтобы нельзя больше было нажать на неё)? Ткните рыльцем где что написать? Повторяю, я художник, у меня с логикой туго)
Ну ладно, всё равно спасибо smile

Автор - 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
  • Страница 1 из 1
  • 1
Поиск:
Загрузка...

Game Creating CommUnity © 2009 - 2025