【问题标题】:I have individual scripts on my prefabs, all doing the same thing when I want them to reference different objects我的预制件上有单独的脚本,当我希望它们引用不同的对象时,它们都在做同样的事情
【发布时间】:2020-10-02 15:03:59
【问题描述】:

在我的游戏中,我有一个简单的立方体预制件。在这个立方体上,我有一个名为“Lore”的脚本。还有一个盒子对撞机,它是立方体大小的 3 倍,我将其制成触发器并给出标签“Lore”。 就这些。 在我的立方体预制件下面(小时候),我创建了一个名为“消息”的画布。 所以每个立方体预制件都有一个对撞机,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”,所以我知道我的触发器正在工作。我还在 ClickEToPickUpLetter() 函数中添加了一个 Debug.Log。所以我知道当用户单击“e”时也会调用该函数。我的问题是正在打开的 GameObject(在我的情况下是 loreMessage,就像在我的 Canvas 中一样)每次都是同一个画布。

我将此预设放置在地图的多个部分上。每个对象都有一个具有相同对撞机的传说脚本。唯一的区别是在每个对象上我都引用了不同的画布,因此当用户单击“e”时,会打开一个新画布,显示一个新图像。 为什么每次调用脚本时都会引用同一个画布,即使每个单独的脚本都引用了不同的画布/游戏对象。这是因为它是预制件吗?我想要完成的只是走到一个触发器。在这种情况下,“Lore”能够在其上按“e”。当用户按下按钮时,一个新的画布正在打开。每次他们进入一个新的对撞机。但它似乎没有打开我在检查器中引用的游戏对象。相反,它每次都会打开我最初创建的第一个画布。非常感谢任何答案。

【问题讨论】:

    标签: visual-studio gameobject


    【解决方案1】:

    我明白了!!!我的问题是我的预制件上的脚本无法正常工作,因为我什么时候会调用我的脚本。

    FindObjectOfType<Lore>().ClickEToPickUpLetter();
    

    它只是调用它找到的该脚本的第一个实例。

    我需要访问单个对象的脚本。在这种情况下,我这样做了,

    if (other.tag == "Lore")
        {
            Debug.LogError("Inside Letter Box");
            //FindObjectOfType<Lore>().ClickEToPickUpLetter();
    other.gameObject.GetComponent<Lore>().ClickEToPickUpLetter();
         }
    

    }

    通过这种方式,它可以使用 FindObjectOfType 而不是找到第一个 Lore 脚本。通过将脚本作为组件抓取,我可以在碰撞的东西上找到 Lore 脚本,例如 gameObject.GetComponent();

    我了解到,只要我调用我首先访问的对象,我就可以在任何情况下执行此操作。仅仅在检查器内部引用它是不够的。

    【讨论】:

      猜你喜欢
      • 2022-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多