Есть инвентарь сделанный на канвасе, на котором висит панель. При запуске игры появляются сами слоты, являющиеся баттоном. На панели висит скрипт:
Скрытый текст:
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; } }
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; }
Проблема в том, что я не знаю и не могу найти, как расписать подбор предметов в инвентарь. Я понимаю, что там должен быть триггер, а так же цикл, который будет искать свободное место в инвентаре. Однако недостаток знаний стопорит меня на этом моменте.
Re: Помогите с подбором вещей в инвентарь.
Добавлено: 20 янв 2020, 16:23
Dio5555
Подбор предмета можно сделать путём RayCast и Triger. 1. Пускам луч от курсора в сторону предмета, считываем GetComponent<Item>() и закидываем в массив инвентаря, 2. С триггером сложнее, тут уже нужно закинуть все объекты которые в зоне триггера и закинуть в массив и предложить, что в списке первое то кидаем в массив инвентаря, как то так. Надеюсь помог.
Re: Помогите с подбором вещей в инвентарь.
Добавлено: 20 янв 2020, 17:13
Dio5555
Данный код сделан с учётом фиксированного количества ячеек инвентаря
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, он как говорят быстрее.