Скрипт инвентаря

Программирование на Юнити.

Скрипт инвентаря

Сообщение tietan 13 ноя 2018, 20:07

Нужна помощь. Необходимо создать инвентарь, но в трехмерном пространстве.
вот скажем есть у меня шар. Он выступает в роли инвентаря. То есть при соприкосновении с землёй он открывает над собой ячейки(кубы).
Если начать закидывать в этот шар-инвентарь объекты он их сохраняет и перемещает в свободную куб-ячейку, то есть делает его дочерним и устанавливает локальные 0 координаты. Вот вопрос в этом, как перебрать все куб-ячейки и если он не имеет дочерних предметов, помещает туды объект, а если имеет то пихает в следующую свободную.
Так вот что сделал. На подбираймых предметах висит скрипт Item, где есть ссылка на префаб. Все нормуль предметы подбираются, но не инстанциируются.
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class InventoryV2 : MonoBehaviour {


    List<Item> item; // создаем список предметов

    public GameObject cellContainer; // получаем доступ к ячейкам инвентаря

    // Use this for initialization
    void Start () {

        item = new List<Item>();
        for (int i = 0; i < cellContainer.transform.childCount; i++) // подсчитываем колличество ячеек в инвентаре
        {
            item.Add(new Item()); // добавляем в инвентарь пустые объекты
        }
        }
       
        // Update is called once per frame
        void Update () {
               
        }

    void OnTriggerEnter(Collider coll)
    {
        if (coll.tag == "Ground")
        {
            cellContainer.SetActive(true);
        }
        if (coll.GetComponent<Item>())
        {
            //  Item currentItem = coll.GetComponent<Item>(); // подбираем объект если он имеет скрипт Item
            for (int i = 0; i < item.Count; i ++ )
            {
                if (item[i].id == 0)
                {
                    item[i] = coll.GetComponent<Item>();
                    Destroy(coll.GetComponent<Item>().gameObject);
                    break;
                }
            }
        }

    }
    void DisplayItem()
    {
        for (int i = 0; i < item.Count; i++)
        {
            if (item[i].id != 0)
            {
                Transform cell = cellContainer.transform.GetChild(i);
                GameObject myItem = Instantiate(Resources.Load(item[i].pathPrefab)) as GameObject;
                myItem.transform.parent = cell;
            }
        }
    }

    void OnTriggerExit(Collider coll)
    {

        if (coll.tag == "Ground")
        {
            cellContainer.SetActive(false);
        }
    }
}
 
tietan
UNец
 
Сообщения: 8
Зарегистрирован: 13 ноя 2018, 20:04

Re: Скрипт инвентаря

Сообщение DimaJoke 13 ноя 2018, 20:28

Ну... А ты повесь на каждый кубик-ячейку скрипт, где будет лишь одна bool переменная, если она false, то отправляй у нему объект и делай её true и наоборот
Что бы повзрослеть, человек должен преодолеть ошибки юности.

Поэтому я снова здесь..
Аватара пользователя
DimaJoke
UNITрон
 
Сообщения: 293
Зарегистрирован: 12 авг 2018, 18:59
Откуда: Ульяновск
  • Сайт

Re: Скрипт инвентаря

Сообщение tietan 13 ноя 2018, 21:02

DimaJoke писал(а):Ну... А ты повесь на каждый кубик-ячейку скрипт, где будет лишь одна bool переменная, если она false, то отправляй у нему объект и делай её true и наоборот


А можно кусочком кода. Ну не bool конечно а как направлять.
tietan
UNец
 
Сообщения: 8
Зарегистрирован: 13 ноя 2018, 20:04

Re: Скрипт инвентаря

Сообщение DimaJoke 13 ноя 2018, 21:36

Ну comon запускай цикл for, проверяй все ячейки и проверяй у них эту bool переменную, если она true то ничего не делай, если она false, то transform.parent = ячейка
И сам ячейки добавь как массив, что бы легче было проверять
Типо
Синтаксис:
Используется csharp
bool Example;
GameObject[] yacheyka;
for(int i; i <= yacheyka.Lengtn; i++)
{
if(yacheyka[i].GetComponent<ExampleScript>().ExampleBool)
{
Predmet.transform.parent = yacheyka[i];
}
}
 
Что бы повзрослеть, человек должен преодолеть ошибки юности.

Поэтому я снова здесь..
Аватара пользователя
DimaJoke
UNITрон
 
Сообщения: 293
Зарегистрирован: 12 авг 2018, 18:59
Откуда: Ульяновск
  • Сайт

Re: Скрипт инвентаря

Сообщение tietan 13 ноя 2018, 22:53

в общем я не дождался ответов, решил сам все переделать.
Вот что вышло и все, сука работает. Но не знаю насколько грамотно написано.
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class Inventory : MonoBehaviour
{
    public GameObject collisionItem;
    public GameObject cellContainer;

    void Start()
    {
        collisionItem = null;


    }
    void OnTriggerEnter(Collider coll)
    {
        if (coll.GetComponent<Item>())
        {
            collisionItem = coll.transform.gameObject;
            for (int i = 0; i < cellContainer.transform.childCount; i++) // подсчитываем колличество ячеек в инвентаре
            {
                Transform cell = cellContainer.transform.GetChild(i);
                var storage = cell.GetComponent<CellContainer>();

                if (storage.pathPrefab == collisionItem.GetComponent<Item>().pathPrefab && collisionItem.GetComponent<Item>().isStackable == true)
                {
                    storage.amountItem++;
                    Destroy(collisionItem);
                    break;
                }
                else if( storage.isFree == true)
                    {
                    storage.nameItem = collisionItem.GetComponent<Item>().nameItem;
                    storage.pathPrefab = collisionItem.GetComponent<Item>().pathPrefab;
                    storage.isFree = false;
                    Destroy(collisionItem);

                    break;
                }



            }
        }
    }

   
tietan
UNец
 
Сообщения: 8
Зарегистрирован: 13 ноя 2018, 20:04

Re: Скрипт инвентаря

Сообщение Friend123 14 ноя 2018, 14:28

tietan писал(а):в общем я не дождался ответов, решил сам все переделать.
Вот что вышло и все, сука работает. Но не знаю насколько грамотно написано.

Главное, что работает. То, что сходу видно - это нужно избавляться от множественного вызова метода GetComponent (один раз надо его закешировать в начале метода OnTriggerEnter)
Аватара пользователя
Friend123
Старожил
 
Сообщения: 701
Зарегистрирован: 26 фев 2012, 22:12
Откуда: Тверь
  • ICQ


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: GoGo.Ru [Bot], Google [Bot] и гости: 5