Как сделать инвентаризацию подкачки на Unity C#?

Как сделать инвентаризацию с 3 Storage. Например :

если я нажму кнопку хранилища 1, он покажет 20 слотов в инвентаре,

если я нажму кнопку хранилища 2, он покажет от 21 слота до 40 слотов в инвентаре, и

если я нажму кнопку хранилища 3, он покажет от 41 слота до 60 слотов в инвентаре.

так что у него всего 60 слотов.

Ниже мой код:

inventory.cs

 using UnityEngine;
 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine.UI;

 public class inventory : MonoBehaviour {
     public List<GameObject> slotsx = new List<GameObject> ();
     public player Player;
     public List<item> itemx = new List<item> ();
     public GameObject slots;
     item itemxs;
     public int indexofdragitem;
     public Sprite icon;

     int sisa;
     itemDatabase database;
     int totalSlot = 60;
     int currentStorage = 1;
     int view = 20;

     // Use this for initialization
     void Start () {
         Player = new player();
         int slotAmount = 0;
         database = GameObject.FindGameObjectWithTag ("itemDatabase").GetComponent<itemDatabase> ();


         //Generate the Slot and Slot Name;
         for(int i = 1; i <= 60; i++) {
                 GameObject Slot = (GameObject) Instantiate(slots);
                 Slot.GetComponent<slotScript>().slotNumber = slotAmount;

                 slotsx.Add(Slot);

                 Player.items.Add(new item());
                 addChilParent (this.gameObject,Slot);
                 //Slot.transform.parent = this.gameObject.transform;
                 Slot.name = "slot-" + i;
                 Slot.SetActive(false);
                 slotAmount++;

         }
      ShowStorage1();

     }

     //Add Slot Child To GridSlot Game Object
     public void addChilParent(GameObject parentx, GameObject childx) {
         childx.transform.SetParent (parentx.gameObject.transform);
     }
  }

Спасибо

Код обновления:

public void onClickStorage1() {
        HideAllSlot ();
        ShowStorage1 ();
    }

    public void onClickStorage2() {
        HideAllSlot ();
        ShowStorage2 ();
    }

    public void onClickStorage3() {
        HideAllSlot ();
        ShowStorage3 ();
    }

    public void HideAllSlot () {
        GameObject hslot;
        for(int i = 1; i <= 60; i++) {
            hslot = GameObject.Find("slot-"+i);
            hslot.SetActive(false);
        }
    }

    public void ShowStorage1 () {
        GameObject hslot;
        for(int i = 1; i <= 20; i++) {
            hslot = GameObject.Find("slot-"+i).SetActive(true);
            hslot.SetActive(true);
        }
    }

    public void ShowStorage2 () {
        GameObject hslot;
        for(int i = 21; i <= 40; i++) {
            hslot = GameObject.Find("slot-"+i);
            hslot.SetActive(true);
        }
    }

    public void ShowStorage3 () {
        GameObject hslot;
        for(int i = 41; i <= 60; i++) {
            hslot = GameObject.Find("slot-"+i);
            hslot.SetActive(true);
        }
    }

person Dennis Liu    schedule 01.07.2016    source источник
comment
Вы просите логику для создания хранилища с 20 слотами. когда 1 нажмете кнопку 1, он покажет 1-20, когда 2 щелкнет, он покажет 21-40, а когда 3, он покажет 41-60. (кнопка -1)* Просмотр +1 =› кнопка * Просмотр. Предполагая, что кнопка имеет значение 1,2,3.   -  person Miller    schedule 01.07.2016
comment
Да @Miller, но я уже получил ответ ниже .. Спасибо, Миллер :)   -  person Dennis Liu    schedule 02.07.2016


Ответы (1)


«Если я нажму кнопку хранилища 1, он покажет 20 слотов в инвентаре, если я нажму кнопку хранилища 2, он покажет от 21 слота до 40 слотов в инвентаре, а если я нажму кнопку хранилища 3, он покажет от 41 слота до 60 слотов в инвентаре. инвентарь».

1, нажмите добавить холст

2, нажмите, чтобы добавить кнопку .. на самом деле добавить три

3, под кнопкой находится «текст» кнопки. Пометьте три кнопки «Хранилище 1», «Хранилище 2», «Хранилище 3».

4. Напишите что-то вроде этого...

public GameObject yourFIRSTPanel;
public GameObject yourSECONDPanel;
public GameObject yourTHIRDPanel;

private void HideAllThreePanels()
 {
 yourFIRSTPanel.setActive(false);
 yourSECONDPanel.setActive(false);
 yourTHIRDPanel.setActive(false);
 }



public void UserClickedS1()
 {
 Debug.Log("storage 1 needed!")
 HideAllThreePanels()
 yourFIRSTPanel.setActive(true);
 }
public void UserClickedS2()
 {
 Debug.Log("storage 2 needed!")
 HideAllThreePanels()
 yourSECONDPanel.setActive(true);
 }
public void UserClickedS3()
 {
 Debug.Log("storage 3 needed!")
 HideAllThreePanels()
 yourTHIRDPanel.setActive(true);
 }

5, в этих трех подпрограммах называйте все, что хотите. кажется, у вас уже есть скрипт, который делает... что-то. просто есть ТРИ таких сценария, которые имеют разные «суммы» или что вы там говорите. просто вызовите три разных сценария с трех разных кнопок.

Обратите внимание, что вы только что сделали все три скрытыми, а затем открыли нужный элемент. Это так просто!


ПРИМЕЧАНИЕ в редактировании кода,

   for(int i = 1; i <= 20; i++) {
        hslot = GameObject.Find("slot-"+i).SetActive(true);
        hslot.SetActive(true);
    }

Это неправильно: "hslot = GameObject.Find("slot-"+i).SetActive(true);"

Также весь цикл неверен, должно быть

  for(int i = 1; i <= 20; i++) {
       String theName = "slot-" + i.ToString();
       Debug.Log("Looking for: " +theName);
       GameObject gFound = GameObject.Find("slot-"+i);
       if (gFound == nil)
        {
        Debug.Log("COULD NOT FIND IT! " +theName);
        continue;
        }
       gFound.SetActive(true);
    }

ОДНАКО ВНИМАНИЕ!

GameObject.Find НЕ НАХОДИТ неактивные объекты!

Обратите внимание, что вы УЖЕ СОХРАНЯЕТЕ ИХ В МАССИВЕ! (slotsx я думаю.)

Просто используйте этот массив!


Наконец, на самом деле вы должны сделать это:

Сгруппируйте все слоты под тремя пустыми игровыми объектами и просто отключите/включите их. Таким образом, вам не нужна петля.

person Fattie    schedule 01.07.2016
comment
Я последовал вашему совету, но последний слот все еще отображается. Как скрыть слот для хранения 1, если я нажму на слот для хранения 2? Спасибо - person Dennis Liu; 01.07.2016
comment
поэтому в основном используйте .SetActive(false). Можете ли вы найти некоторые примеры этого? Кроме того, Денис, вежливо отметить ответ, который вы прокомментировали и из которого что-то получили. - person Fattie; 01.07.2016
comment
Хе-хе... Извините... Я забыл отметить вопрос. - person Dennis Liu; 01.07.2016
comment
дайте мне знать, если у вас возникнут проблемы с setActive -- я приведу грубый пример кода - person Fattie; 01.07.2016
comment
@DennisLiu, пожалуйста, посмотрите на код, который я только что добавил, так как он вам очень поможет. - person Fattie; 01.07.2016
comment
Привет, Джо, у меня возникли проблемы с добавлением игрового объекта Slot со скриптом. Как это сделать ? так что я могу скрыть его с ним. До сих пор я делал так, как это немного отличается от вашего, но на самом деле это то же самое. Мой такой же, как указано выше.. Я добавил больше кода.. - person Dennis Liu; 01.07.2016
comment
я забыл добавить ошибку. Это ошибка: NullReferenceException: ссылка на объект не установлена ​​​​на экземпляр объекта - person Dennis Liu; 01.07.2016
comment
Привет, Джо, если GameObject.Find не находит неактивный объект, что мне делать? я попытался использовать список массивов gameobject: slotsx, например: slotsx[i].setactive(true) результат тот же, после того как я установил setactive(false), он не может быть setactive(true). Я тоже использовал ваш код выше. То же самое после setactive(false) не может быть setactive(true). - person Dennis Liu; 01.07.2016
comment
вы только что сделали простую ошибку. отредактируйте вопрос, удалите свой код с помощью GameObject.Find и введите новый код! - person Fattie; 01.07.2016
comment
Действительно, сделайте то, что сказал Джо, используйте массив, содержащий слоты. Выполнение 20 Finds одновременно может привести к небольшой задержке, и, конечно, это не работает для неактивных. Если эти функции находятся в классе инвентаризации, это просто slotsx[i].SetActive(true/false);. Нет необходимости в строке. - person Gunnar B.; 01.07.2016
comment
верно. поместите свой новый код в вопрос, чтобы мы могли его увидеть - @GunnarB. легко поможет вам исправить это, если у вас есть какие-то мелкие проблемы! делай что он говорит! - person Fattie; 01.07.2016
comment
Другой оптимизацией было бы сгруппировать все слоты под тремя игровыми объектами хранения (пустыми игровыми объектами) и просто отключить/включить их. Таким образом, вам не нужна петля. - person Gunnar B.; 02.07.2016
comment
ДА - оп обязательно должен это сделать ! - person Fattie; 02.07.2016
comment
привет @DennisLiu - отлично! сделайте ссылку на другой вопрос здесь, чтобы мы все могли его найти... - person Fattie; 02.07.2016
comment
Привет, @JoeBlow, у меня проблемы с перетаскиванием значка предмета. Не могли бы вы проверить эту ссылку . Мне нужна помощь.. :) - person Dennis Liu; 02.07.2016
comment
Привет @JoeBlow, не могли бы вы проверить эту ссылку link Мне нужна твоя помощь, чтобы ответить на этот вопрос. Спасибо. - person Dennis Liu; 12.07.2016
comment
Привет @JoeBlow, не могли бы вы помочь мне решить эту проблему. У меня возникла проблема с сохранением игры. Это ссылка ссылка Спасибо. - person Dennis Liu; 20.07.2016