Собирание предметов в Unity C# - PullRequest
0 голосов
/ 20 марта 2020

Привет! Я реализую игру FPS и пытаюсь настроить систему инвентаризации, чтобы при просмотре предмета он поднимался и сохранялся в моем инвентаре. Проблема в том, что я не могу подобрать / уничтожить только один предмет. Все предметы разрушаются. Следующий элемент прикреплен к элементу, на котором я его тестирую.

Изображение элемента инспектора выглядит следующим образом:

Сценарий, прикрепленный к Пункт выглядит следующим образом:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PickUpItems : MonoBehaviour
{

    Inventory invScript;
    public bool item;
    public int 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.tag == "Food")
                {
                    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

Я был бы очень признателен, если бы кто-то мог помочь с такой проблемой!

1 Ответ

0 голосов
/ 20 марта 2020

Это потому, что вы сделали так, чтобы каждый 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, он сообщает, что этот предмет нужно забрать. Так эффективнее в многолюдных сценах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...