一种避免使用新的Unity UI对超级特定功能进行编码的方法



我需要重做使用旧UI创建的UI。

我无法更改程序的体系结构。这个程序使用了很多静态变量,我的UI需要访问和编辑它们(我知道静态变量很糟糕,但不能像我说的那样修改整个架构)。

目前我正在做这样的事情:

public void SetBool()
{
UIData.SomeBool = SomeToggle.isOn ;
}
public void SetAnotherBool()
{
UIData.SomeOtherBool = SomeOtherToggle.isOn ;
}

因此,我为每个要编辑的静态变量都有一个与特定切换相关的函数,这很难看。我如何创建一个通用函数来编辑布尔使用切换和滑块来编辑浮动值。

我想到了这样的东西:

public void SetBool(bool boolToSet)
{
boolToSet = gameObject.GetComponent<Toggle>.isOn;
}

然后将监听器添加到事件OnValueChanged的切换中,并将我想要更改的bool作为参数添加到该函数中。但我听说调用GetComponent对性能不利。

我想知道你是否有更好的主意。也许我错过了一些重要的东西——我对团结和c#还很陌生。

感谢

抱歉我英语不好。

GetComponent的性能并没有那么糟糕,因为它只是在GameObject上搜索列表。在没有缓存的情况下,在许多地方对每一帧都调用它是不可取的。对于用户启动的UI操作,它基本上不会对性能产生影响。另一方面,FindObjectOfType搜索整个层次结构的速度非常慢,如果要搜索的层次结构的分支很大,则GetComponentsInChildren可能会很慢。

不过,在Awake()中缓存自己的组件引用是一种很好的做法。我在Awake中进行内部状态配置,在Start中进行任何外部连接和依赖关系,以确保在与外部世界对话之前正确初始化对象。

如果您想传入Value类型并更改需要通过引用传递的值:

private Toggle toggle;
public void Awake() {
toggle = GetComponent<Toggle>();
}
public void SetBool(ref bool boolToSet) {
if (toggle != null) {
boolToSet = gameObject.GetComponent<Toggle>.isOn;
}
}

然后从任何地方调用SetBool:

SetBool(ref myBoolField);

如果可以保证Toggle组件存在,则可以从SetBool中删除null检查。RequireComponent可以帮助实现这一点,但它只会阻止您在检查器中分配某些内容。。。如果代码发生了变化,或者您通过脚本进行构建,我认为它不会有任何作用。

最新更新