我编写了代码,以便在按下“E”按钮后拾取物品,然后在屏幕上打印拾取物品的图标,但代码无法正常工作,因为当按下按钮时,所有图标同时被激活,如下图所示
我希望当我拿起一个项目时,它的图标会在屏幕上激活。
有什么建议可以解决这个问题吗?
代码如下:
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);
}
你的问题的解决方案是正确理解面向对象编程的原则。因此,在第一步中,创建一个名为 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
。这种方法对于独特的物品已经足够了,但如果你想创建一个专业的库存系统,你肯定需要使用 List 和 Scriptable object。
我找到了解决方案。代码应该如下:
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);
}