嗨,我是統一和編程的新手,所以很抱歉,如果這是一個愚蠢的問題,我相信有更好的方法可以做到這一點。基本上,我遵循了帶有可拖動組件的庫存教程,現在我正在實施他的方法來拾取我游戲中的物品。我用他的 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 回圈中的 lenght 變數。
我已經用正確的標簽標記了所有專案,并且我檢查了兩次我的角色只有 1 個 Collider2D 和剛體,所以我的所有專案都是如此。只有 1 個 Collider2D 設定為觸發器。所以我不知道為什么我有時會兩次拿起這些物品:
這是結果
任何想法為什么它會多次拾取或一些更好的方法如何處理拾取物品???我會很高興得到任何建議。非常感謝
uj5u.com熱心網友回復:
不要每次都使用標簽,特別是如果這意味著每次將某些東西拖到您的庫存上時您都必須遍歷許多專案。這是不必要的計算,如果您有多種物品,可能會減慢您的游戲速度。
相反,將一個簡單的 mb 附加到每個專案:
public class Pickupable : MonoBehaviour
{
public int itemId;
}
然后在 中OnTriggerEnter2D,檢查觸發器是否附加到這樣的 mb,如果是,則從中獲取 id:
Pickupable p = other.GetComponent<Pickupable>();
if (p != null)
{
int id = p.itemId;
GiveItem(id);
Debug.Log($"Item_{id}"); // format string is easier to read
Destroy(other.gameObject);
}
uj5u.com熱心網友回復:
我很蠢。我的角色確實有多個盒子碰撞器。唯一的問題是他隱藏在兒童游戲物件中,并為其他游戲機制提供功能,所以我洗掉了那個 BoxCollider 并以其他方式找出了該機制。現在一切正常:)
因此,如果有人遇到類似問題,請務必確保您只有 1 個 BoxCollider。關于物件和角色
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/387887.html
