问题描述
在我的游戏中,我有一个简单的立方体预制件。在这个立方体上,我有一个名为“ Lore”的脚本。还有一个盒式对撞机,它是我制作触发器的立方体的3倍,并赋予了标签“ Lore”。 就这些。 在我的立方体预制件下面(作为儿童),我创建了一个名为“消息”的画布。 因此,每个Cube预制件都有一个对撞机,Lore脚本。还有一个名为Message的画布。
在PlayerMovement脚本中,我创建了一个OnTriggerStay(),以便当我进入“ Lore”触发器时,它将调用另一个函数。像这样:
private void OnTriggerStay(Collider other)
{
if (other.tag == "Lore")
{
Debug.LogError("Inside Letter Box");
FindObjectOfType<Lore>().ClickEToPickUpLetter();
}
}
因此,我进入“ Lore”触发器的时间就是调用FindObjectOfType()。ClickEToPickUpLetter();。结束了。
它正在调用的函数看起来像这样。
public GameObject loreMessage;
public void ClickEToPickUpLetter()
{
if (Input.GetKeyDown("e"))
{
loreMessage.SetActive(true);
}
}
在这种情况下。当我处于触发器中时,如果用户单击“ e”,我的GameObject loreMessage将被设置为活动状态。 在检查员中,我引用了我制作的CANVAS作为loreMessage。这样,每次用户单击“ e”时,我的“消息画布”都将设置为活动状态。 这是我的问题。当我走进触发器“ Lore”时,我有一个Debug.Log,上面写着“ Inside Letter Box”,所以我知道触发器正在工作。我还将Debug.Log放入了ClickEToPickUpLetter()函数。所以我知道当用户单击“ e”时也会调用该函数。我的问题是,每次打开的GameObject(在我的情况下为loreMessage,就像在Canvas中一样)都是同一画布。
我将此prefb放置在地图的多个部分上。每个对象都有一个具有相同对撞器的知识脚本。唯一的区别是,在每个对象上我都引用了一个不同的画布,因此,当用户单击“ e”时,将打开一个新的画布,以放置一个新图像。 为什么每次调用脚本时都引用同一画布,即使每个单独的脚本都引用了不同的canvas / GameObject。这是因为它是预制件吗?我要做的只是简单地触发。在这种情况下,“ Lore”可以按其上方的“ e”。当用户按下按钮时,新的画布将被打开。每次他们进入新的对撞机时。但这似乎并没有打开我在检查器中引用的游戏对象。相反,它将打开我最初每次创建的第一个画布。谢谢所有答案。
解决方法
我知道了!!!我的问题是我在预制板上的脚本无法正常工作,因为我什么时候可以调用脚本。
FindObjectOfType<Lore>().ClickEToPickUpLetter();
它只是调用此脚本找到的第一个实例。
相反,我需要访问单个对象的脚本。在这种情况下,我这样做了,
if (other.tag == "Lore")
{
Debug.LogError("Inside Letter Box");
//FindObjectOfType<Lore>().ClickEToPickUpLetter();
other.gameObject.GetComponent<Lore>().ClickEToPickUpLetter();
}
}
这样,可以使用FindObjectOfType查找第一个Lore脚本,而不用查找它。通过将脚本作为组件,例如gameObject.GetComponent();
,可以找到与之碰撞的东西的Lore脚本。我了解到,只要我首先调用该对象,就可以在任何情况下执行此操作。仅在检查器内部引用它是不够的。