如何在 C# 和 Unity 中启用屏幕上拾取项目的图标?

问题描述 投票:0回答:2

我编写了代码,以便在按下“E”按钮后拾取物品,然后在屏幕上打印拾取物品的图标,但代码无法正常工作,因为当按下按钮时,所有图标同时被激活,如下图所示
我希望当我拿起一个项目时,它的图标会在屏幕上激活。

有什么建议可以解决这个问题吗?

Image

代码如下:

public GameObject screwDriverWithPlayer, cutterWithPlayer,PicUpText;
public RawImage screwDriver, cutter;
private bool active;

void Start()
{
    screwDriverWithPlayer.SetActive(false);
    cutterWithPlayer.SetActive(false);
    PicUpText.SetActive(false);
    screwDriver.enabled = false;
    cutter.enabled = false;
}

private void OnTriggerStay(Collider other)
{
    if(other.gameObject.tag == "Player")
    {
        PicUpText.SetActive(true);
        if (Input.GetKey(KeyCode.E))
        {
            gameObject.SetActive(false);
            screwDriverWithPlayer.SetActive(true);
            screwDriver.enabled = true;
           
            gameObject.SetActive(false);
            cutterWithPlayer.SetActive(true);
            cutter.enabled = true;
            PicUpText.SetActive(false);
        }
    }
}

private void OnTriggerExit(Collider other)
{
    PicUpText.SetActive(false);       
}
c# unity3d unityscript
2个回答
1
投票

你的问题的解决方案是正确理解面向对象编程的原则。因此,在第一步中,创建一个名为 Item 的脚本并将其放在具有 isTrigger Colliders 的对象上。您可以创建一个方法来拾取它们,如下所示或您想要的任何其他参数。

public class Item : MonoBehaviour
{
    public Image UI_Image;
    public void PickUp()
    {
        gameObject.SetActive(false);
        UI_Image.gameObject.SetActive(true);
        //....
    }
}

既然你有一个播放器和几十个项目,你不应该在项目上安装

OnTriggerStay
代码,这会给计算机带来额外的性能。更好的解决方案是将
OnTriggerStay
放在播放器上并从其组件执行每个项目,如下所示。

// IN THE PLAYER SCRIPT!!
private void OnTriggerStay(Collider other)
{
    if (Input.GetKeyDown(KeyCode.E)) // First Check KEY cuz of optimization
    {
        if(other.gameObject.TryGetComponent(out Item item))
        {
            item.PickUp();
        }
    }
}

别忘了包括每个项目的

UI_Image
。这种方法对于独特的物品已经足够了,但如果你想创建一个专业的库存系统,你肯定需要使用 ListScriptable object


0
投票

我找到了解决方案。代码应该如下:

public GameObject objectWithPlayer,PicUpText;
public RawImage objectRawImage;
private bool active;

void Start()
{
    objectWithPlayer.SetActive(false);
    objectRawImage.enabled = false;
    PicUpText.SetActive(false);
}

private void OnTriggerStay(Collider other)
{
    if(other.gameObject.tag == "Player")
    {
        PicUpText.SetActive(true);
        if (Input.GetKey(KeyCode.E))
        {
            gameObject.SetActive(false);
            objectWithPlayer.SetActive(false);
            objectRawImage.enabled = true;
            
            //gameObject.SetActive(false);
            //cutterWithPlayer.SetActive(true);
            //cutter.enabled = true;
            PicUpText.SetActive(false);
          
        }
    }
}

private void OnTriggerExit(Collider other)
{
    PicUpText.SetActive(false);       
}
© www.soinside.com 2019 - 2024. All rights reserved.