创建库存。两个脚本。我做了一个库存UI,即槽位。 Inventory 对象附加有 Inventory 代码。不错,经典装备
我还做了一个东西并附加了项目代码
但我不能做到这样,如果库存已满(所有两个插槽都被占用),那么就不可能再拿更多了。我写过、做过不同的事情,我已经准备好碰壁了。
玩家拿走第一件事 - 一切都很好,但在第二件事上(为此显示一条日志)他写道“库存已满”。第二个空单元格是无稽之谈。为了方便起见,我使用神经元输入文档
我上两堂课,第一堂课
using UnityEngine;
using UnityEngine.UI;
public class Inventory : MonoBehaviour
{
public bool[] isFull;
public GameObject[] slots;
public bool AddItem(Item item)
{
for (int i = 0; i < slots.Length; i++)
{
if (!isFull[i])
{
isFull[i] = true;
GameObject itemGO = Instantiate(item.itemPrefab, slots[i].transform);
// Настройка RectTransform для центрирования иконки
RectTransform rectTransform = itemGO.GetComponent<RectTransform>();
if (rectTransform == null)
{
rectTransform = itemGO.AddComponent<RectTransform>();
}
// Центрирование
rectTransform.anchorMin = new Vector2(0.5f, 0.5f);
rectTransform.anchorMax = new Vector2(0.5f, 0.5f);
rectTransform.anchoredPosition = Vector2.zero;
// Установка размера иконки
rectTransform.sizeDelta = new Vector2(50, 50); // Измените размер по необходимости
// Убедимся, что масштаб равен 1
rectTransform.localScale = Vector3.one;
// Если у префаба есть Image компонент, убедимся, что он заполняет родительский объект
Image image = itemGO.GetComponent<Image>();
if (image != null)
{
image.preserveAspect = true;
}
return true; // Предмет успешно добавлен
}
}
return false; // Все слоты заполнены, предмет не добавлен
}
public bool IsInventoryFull()
{
foreach (bool slotFull in isFull)
{
if (!slotFull)
{
return false; // Найден пустой слот
}
}
return true; // Все слоты заполнены
}
}
第二项:
using UnityEngine;
public class Item : MonoBehaviour
{
public string itemName;
public float dropChance = 0.5f;
public int damageBonus = 5;
public GameObject itemPrefab;
public GameObject hintPrefab; // Префаб подсказки E
public float displayDistance = 2f;
public float itemHeight = 1f;
private GameObject itemInstance;
private GameObject hintInstance; // Экземпляр подсказки E
private Transform playerTransform;
private Camera mainCamera;
private void Start()
{
playerTransform = GameObject.FindGameObjectWithTag("Player").transform;
mainCamera = Camera.main;
itemInstance = Instantiate(itemPrefab, CalculateItemPosition(), Quaternion.identity);
itemInstance.SetActive(false);
// Создаем экземпляр подсказки E
hintInstance = Instantiate(hintPrefab, CalculateHintPosition(), Quaternion.identity);
hintInstance.SetActive(false);
}
private void Update()
{
float distanceToPlayer = Vector3.Distance(transform.position, playerTransform.position);
if (distanceToPlayer <= displayDistance)
{
ShowItem();
ShowHint();
CheckPickup();
}
else
{
HideItem();
HideHint();
}
if (itemInstance != null && itemInstance.activeSelf)
{
UpdateItemPosition();
}
if (hintInstance != null && hintInstance.activeSelf)
{
UpdateHintPosition();
}
}
private void ShowItem()
{
if (itemInstance != null && !itemInstance.activeSelf)
{
itemInstance.SetActive(true);
}
}
private void HideItem()
{
if (itemInstance != null && itemInstance.activeSelf)
{
itemInstance.SetActive(false);
}
}
private void ShowHint()
{
if (hintInstance != null && !hintInstance.activeSelf)
{
hintInstance.SetActive(true);
}
}
private void HideHint()
{
if (hintInstance != null && hintInstance.activeSelf)
{
hintInstance.SetActive(false);
}
}
private Vector3 CalculateItemPosition()
{
return transform.position + Vector3.up * itemHeight;
}
private Vector3 CalculateHintPosition()
{
return transform.position + Vector3.up * (itemHeight + 0.5f); // Подсказка немного выше предмета
}
private void UpdateItemPosition()
{
itemInstance.transform.position = CalculateItemPosition();
}
private void UpdateHintPosition()
{
hintInstance.transform.position = CalculateHintPosition();
hintInstance.transform.LookAt(hintInstance.transform.position + mainCamera.transform.rotation * Vector3.forward,
mainCamera.transform.rotation * Vector3.up);
}
private void CheckPickup()
{
if (Input.GetKeyDown(KeyCode.E))
{
PlayerController player = playerTransform.GetComponent<PlayerController>();
if (player != null)
{
Inventory inventory = player.GetComponent<Inventory>();
if (inventory != null)
{
if (!inventory.IsInventoryFull())
{
if (inventory.AddItem(this))
{
DestroyItemAndInstance();
}
}
else
{
Debug.Log("Инвентарь полон! Нельзя подобрать предмет.");
}
}
else
{
Debug.LogError("Компонент Inventory не найден на игроке!");
}
}
}
}
private void DestroyItemAndInstance()
{
if (itemInstance != null)
{
Destroy(itemInstance);
}
if (hintInstance != null)
{
Destroy(hintInstance);
}
Destroy(gameObject);
}
private void OnDestroy()
{
if (itemInstance != null)
{
Destroy(itemInstance);
}
if (hintInstance != null)
{
Destroy(hintInstance);
}
}
}
该问题已通过更新项目选择类得到解决。
我向库存添加了一种新方法
HasFreeSlot()
,并且在项目本身中,检查选择的方法略有变化。