Помогите с подбором вещей в инвентарь.

Общие вопросы о Unity3D

Помогите с подбором вещей в инвентарь.

Сообщение RoadFoster 19 янв 2020, 15:54

Есть инвентарь сделанный на канвасе, на котором висит панель. При запуске игры появляются сами слоты, являющиеся баттоном.
На панели висит скрипт:
Скрытый текст:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class AInv : MonoBehaviour
{
public int width;
public int height;
public Transform Panel;
public AItem[] items;
public AItem mouseItem;
public RectTransform mouseItemImage;

public AItem nul;
public AItem helm;
void Start()
{
for (int i = 0; i < width * height; i++)
{
GameObject newSlot = Instantiate((GameObject)Resources.Load("Button"));
newSlot.transform.SetParent(Panel);
newSlot.GetComponent<AInvButton>().myInv = this;
newSlot.GetComponent<AInvButton>().myID = i;
}
for (int i = 0; i < width * height; i++)
{
GameObject newItem = new GameObject("Item", typeof(AItem));
items[i] = newItem.GetComponent<AItem>();
}
Redraw();
}
public void selectSlot(int ID)
{
if (items[ID].ID == mouseItem.ID)
{
if (!Input.GetKey(KeyCode.LeftShift))
{
if (mouseItem.stack > items[ID].maxStack - items[ID].stack)
{
mouseItem.stack -= items[ID].maxStack - items[ID].stack; ;
items[ID].stack = items[ID].maxStack;
}
else
{
items[ID].stack += mouseItem.stack;
mouseItem.name = nul.Name;
mouseItem.Image = nul.Image;
mouseItem.stack = 0;
mouseItem.maxStack = 0;
mouseItem.ID = 0;
}
}

else
{
if (mouseItem.stack > 1 & items[ID].stack < items[ID].maxStack)
{
items[ID].stack++;
mouseItem.stack--;
}
}
}
else
{
AItem tempItem = items[ID];
items[ID] = mouseItem;
mouseItem = tempItem;
print(ID);
}
Redraw();
}
public void Redraw()
{
for (int i = 0; i < width * height; i++)
{
Panel.GetChild(i).GetChild(0).GetComponent<RawImage>().texture = items[i].Image;
if (items[i].stack == 0)
{
Panel.GetChild(i).GetChild(1).GetComponent<Text>().text = "";
}
else
{
Panel.GetChild(i).GetChild(1).GetComponent<Text>().text = items[i].stack + "/" + items[i].maxStack;
}

}
if (mouseItem.Image == null)
{
mouseItemImage.GetComponent<RawImage>().color = new Color(0, 0, 0, 0);
mouseItemImage.transform.GetChild(0).GetComponent<Text>().text = "";
}
else
{
mouseItemImage.GetComponent<RawImage>().color = new Color(1, 1, 1, 1);
mouseItemImage.GetComponent<RawImage>().texture = mouseItem.Image;
mouseItemImage.transform.GetChild(0).GetComponent<Text>().text = mouseItem.stack + "/" + mouseItem.maxStack;
}


}
void Update()
{
mouseItemImage.transform.position = Input.mousePosition - new Vector3(0, 100, 0);
}
}

Скрипт, висящий на баттоне:
Скрытый текст:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AInvButton : MonoBehaviour
{
public AInv myInv;
public int myID;

public void Press()
{
myInv.selectSlot(myID);
}
}

А так же есть скрипт, созданный непосредственно для предметов, которые размещаются в инвентаре:
Скрытый текст:
using System.Collections.Generic;
using UnityEngine;

public class AItem : MonoBehaviour
{
public string Name;
public Texture Image;
public int stack;
public int maxStack;
public int ID;
}


Проблема в том, что я не знаю и не могу найти, как расписать подбор предметов в инвентарь.
Я понимаю, что там должен быть триггер, а так же цикл, который будет искать свободное место в инвентаре. Однако недостаток знаний стопорит меня на этом моменте.
RoadFoster
UNец
 
Сообщения: 3
Зарегистрирован: 19 янв 2020, 15:40

Re: Помогите с подбором вещей в инвентарь.

Сообщение Dio5555 20 янв 2020, 16:23

Подбор предмета можно сделать путём RayCast и Triger.
1. Пускам луч от курсора в сторону предмета, считываем GetComponent<Item>() и закидываем в массив инвентаря,
2. С триггером сложнее, тут уже нужно закинуть все объекты которые в зоне триггера и закинуть в массив и предложить, что в списке первое то кидаем в массив инвентаря, как то так.
Надеюсь помог.
Dio5555
UNIт
 
Сообщения: 83
Зарегистрирован: 06 сен 2018, 11:05

Re: Помогите с подбором вещей в инвентарь.

Сообщение Dio5555 20 янв 2020, 17:13

Данный код сделан с учётом фиксированного количества ячеек инвентаря

Синтаксис:
Используется csharp
        void Update()
        {
            if (Input.GetKeyDown(KeyCode.E))
        {
            Ray ray = Camera.main.ScreenPointToRay(_Canvas[1].transform.position);
            RaycastHit hit;
            //подбор предметов в массив
            if (Physics.Raycast(ray, out hit, 3f))
            {
                Item items = hit.collider.GetComponent<Item>();
                if (items != null) // проверка на то что мы обращаемся к предмету.
                {

                    for (int i = 0; i < list.Count; i++) // Делаем перебор массива
                    {
                        if (list[i].id == 0) //проверка но то что у нас есть свободная ячейка и она пустая " list.Count мы знаем так как в List у нас уже есть объекты пустышки и мы их перезаписываем "
                        {
                            list[i] = (items); // Добавляем Предмет в ячейку
                            Destroy(hit.collider.gameObject); // Удаляем предмет в мире
                            break; // Выходим из цикла
                        }
                    }
                }
            }
        }

        }


Есть и другой способ добавлять в инвентарь через List.Add, он как говорят быстрее.
Dio5555
UNIт
 
Сообщения: 83
Зарегистрирован: 06 сен 2018, 11:05


Вернуться в Общие вопросы

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10