【发布时间】:2022-01-22 08:01:52
【问题描述】:
嗨,我是统一和编程的新手,如果这是个愚蠢的问题,我很抱歉,我相信有更好的方法可以做到这一点。基本上我遵循了带有可拖动组件的库存教程,现在我正在实施他的方法来在我的游戏中拾取物品。我用他的 id 标记了每个项目。标签是 Item_0、Item_1、Item_2 等。我在 OnTriggerEnter2D 中使用 for 循环来确定我拾取的项目。
库存有代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Inventory : MonoBehaviour
{
public List<Item> CharacterItmes = new List<Item>();
public ItemDatabase itemDatabase;
public UIInventory inventoryUI;
[SerializeField] private GameObject inventory;
private void Start()
{
inventoryUI.gameObject.SetActive(true);
// Iniciate Items
inventoryUI.gameObject.SetActive(false);
}
private void Update()
{
if (Input.GetButtonDown("Inventory"))
{
inventoryUI.gameObject.SetActive(!inventoryUI.gameObject.activeSelf);
}
}
public void GiveItem(int id)
{
Item itemToAdd = itemDatabase.GetItem(id);
CharacterItmes.Add(itemToAdd);
inventoryUI.AddNewItem(itemToAdd);
// Debug.Log("Added item: " + itemToAdd.title);
}
public void GiveItem(string itemName)
{
Item itemToAdd = itemDatabase.GetItem(itemName);
CharacterItmes.Add(itemToAdd);
inventoryUI.AddNewItem(itemToAdd);
// Debug.Log("Added item: " + itemToAdd.title);
}
public Item CheckForItem(int id)
{
return CharacterItmes.Find(item => item.id == id);
}
public void RemoveItem(int id)
{
Item itemToRemove = CheckForItem(id);
if (itemToRemove != null)
{
CharacterItmes.Remove(itemToRemove);
inventoryUI.RemoveItem(itemToRemove);
// Debug.Log("Removed Item: " + itemToRemove.title);
}
}
private void OnTriggerEnter2D(Collider2D other)
{
for (int i = 0; i <= 5; i++)
{
if (other.gameObject.CompareTag("Item_" + i.ToString()))
{
GiveItem(i);
Debug.Log("Item_" + i.ToString());
Destroy(other.gameObject);
}
}
}
}
我现在只有 6 个项目用于测试目的,稍后我将用 ItemDatabase 中的所有项目替换 for 循环中的长度。
我已经用正确的标签标记了所有项目,并且我检查了两次我的角色只有 1 个 Collider2D 和刚体,以及我的所有项目。只有 1 个 Collider2D 设置为触发器。所以我不知道为什么我有时会两次拿起这个物品:
任何想法为什么它会多次拾取或一些更好的方法来处理拾取它? 我会很高兴得到任何建议。非常感谢
【问题讨论】:
-
当您重新运行并重试时会发生什么?具体是 Item_4 出现了两次还是有所不同?