首页 > 解决方案 > 有没有办法在不先获取脚本的情况下获取和更改公共变量?

问题描述

我制作了一个按钮,可以激活其他对象。它是一个物理按钮,在这种情况下,通过玩家 GameObject 触摸它来激活它。它使用此脚本来激活其他对象:

    public GameObject[] ThingsToActivate = { };

    void Update()
    {
        if (activated)
        {
            foreach (var Object in ThingsToActivate)
            {
                Object.GetComponent<foo>().Active = true;
            }
        }
    }

很好用,但这意味着您放入ThingsToActivate数组中的所有内容都必须有一个名为foo. 我想将此按钮放在资产商店中,但我希望它非常易于使用。我想这样做,以便您可以将脚本命名为您想要的任何名称,只要它具有public bool Active变量即可。

有什么简单的方法可以做到这一点,比如专门为该变量搜索所有脚本,或者某种解决方法?

标签: c#unity3d

解决方案


要获取所有组件而不考虑类型,请使用GetComponents<Component>().

要检查组件是否具有名为“Active”的属性,请使用GetType().GetProperty("Active"). 如果它返回一个 PropertyInfo 实例,您可以使用它的SetValue方法来设置它。

if (activated)
{
    foreach (GameObject object in ThingsToActivate)
    {
        foreach (Component component in object.GetComponents<Component>())
        {
            var prop = component.GetType().GetProperty("Active");
            if (prop != null) prop.SetValue(component, true);
        }
    }
}

推荐阅读