Это потому, что вы сделали так, чтобы каждый PickUpItems
беспокоился только о том, смотрит ли камера на какую-либо банку. Я также рекомендую сделать distanceToItem
с плавающей точкой:
if(hit.collider.gameObject.tag == "Food")
{
Debug.Log("pickedup");
pickedUp = true;
StartCoroutine("AddItem");
//play sound here
}
Вместо этого вам следует рассмотреть вопрос о создании каждого PickUpItems
, если камера указывает на PickUpItems
.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PickUpItems : MonoBehaviour
{
Inventory invScript;
public bool item;
public float distanceToItem;
public Camera fpCamera;
// public GameObject itemIcon;
bool pickedUp = false;
// Use this for initialization
void Start()
{
fpCamera = Camera.main;
invScript = GameObject.FindWithTag("GameController").GetComponent<Inventory>();
} //Start
private void Update()
{
Collect();
}
void Collect()
{
if (Input.GetKeyDown(KeyCode.E) && !pickedUp)
{
RaycastHit hit;
Ray ray = fpCamera.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out hit, distanceToItem))
{
if(hit.collider.gameObject == gameObject)
{
Debug.Log("pickedup");
pickedUp = true;
StartCoroutine("AddItem");
//play sound here
}
}
}
} //Collect
IEnumerator AddItem()
{
yield return new WaitForSeconds(1);
//GameObject i = Instantiate(itemIcon);
//i.transform.SetParent(invScript.inventoryPanel.transform);
Destroy(gameObject);
} //AddItem
} //class
Кстати, поскольку это всегда выполняется на каждом экземпляре PickUpItems
, это приведет к большему количеству вычислений, так как на сцене будет больше экземпляров. Рассмотрите возможность рефакторинга, чтобы вы запускали Physics.Raycast
ровно один раз в каждом кадре, возможно, в сценарии, прикрепленном к игроку, а затем, если он попадает в объект gameObject с PickUpItems
, он сообщает, что этот предмет нужно забрать. Так эффективнее в многолюдных сценах.