如何使不可见的透明按钮起作用?

How to make an invisible transparent button work?

查看Unity论坛和问答网站上的一些答案,关于如何制作不可见按钮的答案不起作用,因为去掉按钮附属的图像使其不起作用。

如何解决这个问题并保持不可见 属性,同时允许按钮实际工作?

我的第一个解决方案是 enabledisable 如下组件:

void showButton(Button buttonToShow, bool show)
{
    Image bImage = buttonToShow.GetComponent<Image>();
    Text bText = buttonToShow.GetComponentInChildren<Text>(); //Text is a child of the Button

    if (bImage != null)
    {
        bImage.enabled = show;
    }

    if (bText != null)
    {
        bText.enabled = show;
    }
}

但这没有用。如果按钮的 imagetext 组件都是 both disabled,按钮单击事件将 NOT 触发.其中之一 必须 enabled 才能发送点击事件。

解决方案是将 imagetext 组件的 alpha 设置为 0 以隐藏,设置为 1 以再次显示。它们将被隐藏但不会 禁用 并单击 events 将起作用。

public Button button;

void Start()
{
    //Show Button
    showButton(button, true);

    //Hide Button
    //showButton(button, false);
}

void showButton(Button buttonToShow, bool show)
{
    Image bImage = buttonToShow.GetComponent<Image>();
    Text bText = buttonToShow.GetComponentInChildren<Text>(); //Text is a child of the Button

    if (bImage != null)
    {
        Color tempColor = bImage.color;

        if (show)
        {
            tempColor.a = 1f; //Show 
            bImage.color = tempColor;
        }
        else
        {
            tempColor.a = 0f; //Hide 
            bImage.color = tempColor;

        }
    }

    if (bText != null)
    {
        Color tempColor = bText.color;

        if (show)
        {
            tempColor.a = 1f; //Show 
            bText.color = tempColor;
        }
        else
        {
            tempColor.a = 0f; //Hide 
            bText.color = tempColor;

        }
    }
}

这是关于 Unity 的那些奇怪的事情之一...

100% 的 real-world 项目需要这个,但 Unity 忘记了。

简短版本:

每个Unity项目都需要Touchable.cs

// file Touchable.cs
// Correctly backfills the missing Touchable concept in Unity.UI's OO chain.

using UnityEngine;
using UnityEngine.UI;
#if UNITY_EDITOR
using UnityEditor;
[CustomEditor(typeof(Touchable))]
public class Touchable_Editor : Editor
     { public override void OnInspectorGUI(){} }
#endif
public class Touchable:Text
     { protected override void Awake() { base.Awake();} }
  1. 使用Unity的普通'Create Button'编辑器功能

  2. 如您所知,编辑器功能自动为您添加两个组件。一个是 Text,一个是 Image...

  3. 两个都删掉

  4. 将上面的脚本 Touchable.cs 拖放到按钮上

大功告成。仅此而已。

它不能 "decay" Unity 升级。

实际上,您可以 "buttonize" .UI 中的任何内容 ,方法是将 Touchable 放在它。

再也不会"add a transparent Image"制作按钮了。


Unity 忘记在 OO 链中抽象出一个 "touchable" 概念。

因此,我们开发人员必须制作自己的 Touchable class "from" Unity 的 classes。

这是 OO 中的一个 classic "backfilling" 问题。

当 "backfilling" 时,唯一的问题是:它必须完美 auto-maintaining。只有一个很好的解决方案,Touchable.cs,每个人都在使用。


所以在所有 real-world Unity 项目中,按钮看起来像这样:

ONE 你有 Unity 的 Button.cs

两个你必须添加Touchable.cs

一些团队制作了一个编辑器功能 "Create Better Button",它只是制作一个游戏对象,Button.cs + Touchable.cs.

重要提示...

假设您可能有一个非常复杂的 UI 面板 。所以它会调整大小甚至有动画。

事实上,您可以将 "Button+Touchable" 放到 任何类似的东西上,它会起作用。

只需设置Button+Touchable 即可展开填充父级。仅此而已。

在此示例图像中,"resume" 和 "quit" 可以是 任何值 。 (动画、包含许多部分的复杂面板、文本、精灵、不可见的东西、堆栈 - 任何东西。)

在所有情况下,只需在下方放置一个 Button+Touchable ,您就会得到一个完美的按钮。

事实上:这种方法非常简单,即使是简单的情况,您也可能会用到它。

假设您的按钮是一个微不足道的图像。只拥有一个图像,然后在其上放置一个 Button+Touchable 会容易得多。 (而不是在编辑器中使用令人困惑和有问题的 "Button" 函数。)

了解情况...

1) Unity 的 Button.cs class 太棒了。

2) 但是编辑器函数"make a Button"是垃圾...

3) 它制作了一个 "upside down" 按钮,

4) 即,它将 text/image 置于 Button.cs

之下

5) "Button-ness" 是您应该能够 添加到 的东西。这正是它与 Button+Touchable 配合使用的方式。

6) 所以 - 很简单 -

1。有你想要的任何东西。文本、图像、面板、不可见、动画 - 随便什么。

2。在其上放置 Button+Touchable - 大功告成。

这就是每个人在 Unity 中做所有按钮的方式!


历史功劳: 我相信 Unity 论坛用户 "signalZak" 是很多很多年前第一个想到这一点的人!

我启动了 Gimp(免费的编码图形工具)。创建新图像(任何尺寸,我选择 10 pix x 10 pix),从高级(在创建对话框中)中选择它的背景应该是透明的。保存文件。将其导出为 png 并选择保存背景颜色。将它作为精灵拖到 Unity 中。把它放到按钮图形上。禁用按钮的文本组件。不需要代码...只是不要在 Gimp 中绘制任何东西(这是最难的部分)。

作为对 Fattie 答案的可能改进,将 Touchable 的基础 class 更改为 Graphic 并覆盖 protected void UpdateGeometry() 似乎可以很好地减少(无可否认次要)与 Text.

相关的开销
public class Touchable:Graphic
{
    protected override void UpdateGeometry() { }
}