вот скажем есть у меня шар. Он выступает в роли инвентаря. То есть при соприкосновении с землёй он открывает над собой ячейки(кубы).
Если начать закидывать в этот шар-инвентарь объекты он их сохраняет и перемещает в свободную куб-ячейку, то есть делает его дочерним и устанавливает локальные 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);
}
}
}
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);
}
}
}