这是按钮的好方法吗?
Is this an alright method for buttons?
我正在练习 Unity 中的按钮,我想弄清楚如何在不使用检查器中的 OnClick 的情况下为按钮分配不同的方法,所以我想到了这个。
public class UIButtons : MonoBehaviour
{
void Start()
{
var buttons = FindObjectsOfType<Button>(); //I should probably have this outside of this method
foreach (Button button in buttons)
{
button.onClick.AddListener(() => ButtonPressed(button));
}
}
void ButtonPressed(Button button)
{
switch (button.name)
{
case "MMPlayButton": //The main menu play button
Debug.Log("Play button pressed");
break;
case "PlayButton":
Debug.Log("Play button pressed");
break;
case "SettingsButton":
Debug.Log("Settings button pressed");
break;
case "QuitButton":
Debug.Log("Quit button pressed");
break;
default:
Debug.LogWarning("Button doesn't have a case: " + button.name);
//could do some kind of pop up message saying the button pressed isn't available or something
break;
}
}
}
我知道这行得通,但是,我认为这是一种糟糕的做事方式,因为它使用了名称,所以如果我要更改名称或输入错误,它就会中断,或者我做的一个问题遇到的是如果按钮有相同的名字,如果我添加更多的按钮我必须添加更多的案例然后它可能会变成一个巨大的混乱。
虽然我可能是错的,也许这是个好主意,但我对此表示怀疑,因此寻求帮助。
我知道这不是一个好的答案,但如果我是你,我会为不同的按钮制作不同的文件。比如SettingButton.cs、PlayButton.cs等等
这种方法不会给您的代码增加大量负担,但随着按钮功能的增加,这种方法将极大地帮助您保持代码的组织性。
您可以使用继承来简化它。为所有要使用的按钮创建一个基础 class,即。 UIButtonBase
具有 OnButtonPressed
虚方法。然后创建继承此基础 class 并覆盖 OnButtonPressed
方法的特定按钮。
基础Class
public class UIButtonBase: MonoBehaviour
{
protected virtual void Awake()
{
var button = GetComponent<Button>();
if (button)
{
button.onClick.AddListener(() => OnButtonPressed());
}
else
{
Debug.Log(name + " does not have a Button component!");
}
}
protected virtual void OnButtonPressed()
{
Debug.Log("UIButtonBase::OnButtonPressed()");
}
}
一个按钮的具体实现
public class SettingsButton : UIButtonBase
{
protected override void OnButtonPressed()
{
Debug.Log("SettingsButton::OnButtonPressed()");
// If you want the base functionality as well, add..
//
base.OnButtonPressed();
}
}
对于设置,创建一个按钮并将此脚本添加到其中。您可能需要将 Awake
(UIButtonBase) 中的 GetComponent
更改为 GetComponentInParent
或 GetComponentInChildren
,具体取决于您的游戏对象层次结构。您还可以在 UIButtonBase 脚本中公开 Button 组件并使用该引用。
我正在练习 Unity 中的按钮,我想弄清楚如何在不使用检查器中的 OnClick 的情况下为按钮分配不同的方法,所以我想到了这个。
public class UIButtons : MonoBehaviour
{
void Start()
{
var buttons = FindObjectsOfType<Button>(); //I should probably have this outside of this method
foreach (Button button in buttons)
{
button.onClick.AddListener(() => ButtonPressed(button));
}
}
void ButtonPressed(Button button)
{
switch (button.name)
{
case "MMPlayButton": //The main menu play button
Debug.Log("Play button pressed");
break;
case "PlayButton":
Debug.Log("Play button pressed");
break;
case "SettingsButton":
Debug.Log("Settings button pressed");
break;
case "QuitButton":
Debug.Log("Quit button pressed");
break;
default:
Debug.LogWarning("Button doesn't have a case: " + button.name);
//could do some kind of pop up message saying the button pressed isn't available or something
break;
}
}
}
我知道这行得通,但是,我认为这是一种糟糕的做事方式,因为它使用了名称,所以如果我要更改名称或输入错误,它就会中断,或者我做的一个问题遇到的是如果按钮有相同的名字,如果我添加更多的按钮我必须添加更多的案例然后它可能会变成一个巨大的混乱。
虽然我可能是错的,也许这是个好主意,但我对此表示怀疑,因此寻求帮助。
我知道这不是一个好的答案,但如果我是你,我会为不同的按钮制作不同的文件。比如SettingButton.cs、PlayButton.cs等等
这种方法不会给您的代码增加大量负担,但随着按钮功能的增加,这种方法将极大地帮助您保持代码的组织性。
您可以使用继承来简化它。为所有要使用的按钮创建一个基础 class,即。 UIButtonBase
具有 OnButtonPressed
虚方法。然后创建继承此基础 class 并覆盖 OnButtonPressed
方法的特定按钮。
基础Class
public class UIButtonBase: MonoBehaviour
{
protected virtual void Awake()
{
var button = GetComponent<Button>();
if (button)
{
button.onClick.AddListener(() => OnButtonPressed());
}
else
{
Debug.Log(name + " does not have a Button component!");
}
}
protected virtual void OnButtonPressed()
{
Debug.Log("UIButtonBase::OnButtonPressed()");
}
}
一个按钮的具体实现
public class SettingsButton : UIButtonBase
{
protected override void OnButtonPressed()
{
Debug.Log("SettingsButton::OnButtonPressed()");
// If you want the base functionality as well, add..
//
base.OnButtonPressed();
}
}
对于设置,创建一个按钮并将此脚本添加到其中。您可能需要将 Awake
(UIButtonBase) 中的 GetComponent
更改为 GetComponentInParent
或 GetComponentInChildren
,具体取决于您的游戏对象层次结构。您还可以在 UIButtonBase 脚本中公开 Button 组件并使用该引用。