GetKeydown发送多个输出

发布于 2025-01-21 06:41:25 字数 2740 浏览 0 评论 0原文

具体而言,它发送的输出与其中有代码的对象一样多,即使我在不​​查看任何东西时按E按E,也可以与它们进行交互。我想建立一个库存系统,但这会导致所有与此代码进行交互的对象。如果可以提供帮助,我包括我在此系统中使用的所有脚本。我真的不知道我做错了什么,

交互式代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Events;
using System;

public class Interactable : MonoBehaviour
{
public LayerMask interactableLayerMask;

//ITEM VARIABLE
public Item item;

//PICK UP RADIUS
public float radius = 4f;

public void Interact()
{
    Debug.Log("Interacted with " + transform.name);
    PickUp();
}

//PICK UP INTERACTION
void PickUp()
{
    Debug.Log("Picking up " + item.name);
    bool wasPickedUp = Inventory.instance.Add(item);

    if (wasPickedUp)
        Destroy(gameObject);
}


//INTERACTION
void Update()
{
    if (Input.GetKeyDown(KeyCode.E))
    {
        Debug.Log("Added item -----------------------------------------");
        RaycastHit hit;

        if (Physics.Raycast(Camera.main.transform.position, Camera.main.transform.forward, out hit, radius))
        {
            Interactable interactable = hit.collider.GetComponent<Interactable>();
            if (interactable != null)
            {
                Interact();
            }
        } else
        {
            Debug.Log("Nothing");
        }
    }
}
}

库存代码:

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

public class Inventory : MonoBehaviour
{
#region Singleton

public static Inventory instance;

void Awake()
{
    if (instance != null)
    {
        Debug.LogWarning("More than one instance of Inventory found!");
        return;
    }
    instance = this;
}
#endregion

public delegate void OnItemChanged();
public OnItemChanged onItemChangedCallback;
    

public int space = 20;

public List<Item> items = new List<Item>();

public bool Add (Item item)
{
    if (!item.isDefaultItem)
    {
        if (items.Count >= space)
        {
            Debug.Log("Note enough space in inventory");
            return false;
        }
        else
        {
            items.Add(item);

            if (onItemChangedCallback != null)
                onItemChangedCallback.Invoke();
        }
    }
    return true;
}

public void Remove(Item item)
{
    items.Remove(item);

    if (onItemChangedCallback != null)
        onItemChangedCallback.Invoke();
}

}

项目代码:

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

[CreateAssetMenu(fileName = "New Item", menuName = "Inventory/Item")]

public class Item : ScriptableObject
{
    new public string name = "New Item";
    public Sprite icon = null;
    public bool isDefaultItem = false;
}

specifically it sends as many outputs as there are objects with the code in them that allows them to be interacted with, even if I press E when not looking at anything. I wanted to make an inventory system, but this causes all objects that have this code to be interacted with. I included all the scripts that im using for this system if that can help. I genuinely don't know what I did wrong

the interactor code:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Events;
using System;

public class Interactable : MonoBehaviour
{
public LayerMask interactableLayerMask;

//ITEM VARIABLE
public Item item;

//PICK UP RADIUS
public float radius = 4f;

public void Interact()
{
    Debug.Log("Interacted with " + transform.name);
    PickUp();
}

//PICK UP INTERACTION
void PickUp()
{
    Debug.Log("Picking up " + item.name);
    bool wasPickedUp = Inventory.instance.Add(item);

    if (wasPickedUp)
        Destroy(gameObject);
}


//INTERACTION
void Update()
{
    if (Input.GetKeyDown(KeyCode.E))
    {
        Debug.Log("Added item -----------------------------------------");
        RaycastHit hit;

        if (Physics.Raycast(Camera.main.transform.position, Camera.main.transform.forward, out hit, radius))
        {
            Interactable interactable = hit.collider.GetComponent<Interactable>();
            if (interactable != null)
            {
                Interact();
            }
        } else
        {
            Debug.Log("Nothing");
        }
    }
}
}

the Inventory code:

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

public class Inventory : MonoBehaviour
{
#region Singleton

public static Inventory instance;

void Awake()
{
    if (instance != null)
    {
        Debug.LogWarning("More than one instance of Inventory found!");
        return;
    }
    instance = this;
}
#endregion

public delegate void OnItemChanged();
public OnItemChanged onItemChangedCallback;
    

public int space = 20;

public List<Item> items = new List<Item>();

public bool Add (Item item)
{
    if (!item.isDefaultItem)
    {
        if (items.Count >= space)
        {
            Debug.Log("Note enough space in inventory");
            return false;
        }
        else
        {
            items.Add(item);

            if (onItemChangedCallback != null)
                onItemChangedCallback.Invoke();
        }
    }
    return true;
}

public void Remove(Item item)
{
    items.Remove(item);

    if (onItemChangedCallback != null)
        onItemChangedCallback.Invoke();
}

}

Item code:

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

[CreateAssetMenu(fileName = "New Item", menuName = "Inventory/Item")]

public class Item : ScriptableObject
{
    new public string name = "New Item";
    public Sprite icon = null;
    public bool isDefaultItem = false;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

吻泪 2025-01-28 06:41:25

据我了解,您的代码进入了场景中每个对象的input.getKeydown(keyocode.e),但它不会将其添加到库存中。

那是因为您在可互换类中使用Update函数,即您的对象。取而代之的是,尝试将完全相同的代码块移入库存类中。确保将互动方法公开,以便您调用。

To my understanding, your code goes into the Input.GetKeyDown(KeyCode.E) for every object in the scene, but it does not add it to the inventory.

That is because you use the Update function in the Interactable class, which are your objects. Instead, try moving the exact same block of code into your Inventory class. Make sure you make your Interact method public, so you can call it.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文