如何使隐形透明按钮工作?

看一下Unity论坛和Q&A网站上的一些答案,如何制作一个隐形按钮的答案不起作用,因为拿走与该按钮相关的图像使其无效。

你如何绕过这个并保持隐形属性,同时让按钮实际工作?

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

100%的实际项目需要这个,但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的普通“创建按钮”编辑器function

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

  3. 只需删除它们

  4. 在Button上删除上面的脚本Touchable.cs

你完成了。 这里的所有都是它的。

它无法通过Unity升级“衰减”。

你可以通过将Touchable放在它上面来实际“按钮化” .UI任何内容。

永远不要再“添加透明图像”来制作按钮。


Unity忘记在OO链中抽象出一个“可触摸”的概念。

因此,我们的开发人员必须“从”Unity的类中创建自己的Touchable类。

这是OO中经典的“回填”问题

当“回填”唯一的问题是:它必须完全自动维护。 只有一个很好的解决方案,Touchable.cs,每个人都使用。


所以在所有真实的Unity项目中,按钮看起来像这样:

在此处输入图像描述

ONE你有Unity的Button.cs

两个你必须添加Touchable.cs

一些团队使用Button.cs + Touchable.cs创建一个编辑器function“Create Better Button”,它只是制作一个游戏对象。

重要提示……

假设您可能有一个非常复杂的UI面板。 也许它resize。 或许你有一个动画。

令人惊奇的是,你可以将“Button + Touchable” 放到类似的东西上,它会起作用。

只需设置Button + Touchable即可展开以填充父级。 这里的所有都是它的。

在此处输入图像描述

在此示例图像中,“resume”和“quit”可以是任何内容 。 (一个动画,一个复杂的面板,有许多部件,文本,精灵,一些不可见,一堆 – 任何东西。)

在所有情况下,只需在下面放一个Button + Touchable,你就拥有一个完美无瑕的按钮。

事实上:这种方法非常简单,即使使用这种方法,您也可以使用最简单的按钮。

说你的按钮是一个简单的图像。 只需要一个图像,然后在其上放一个Button + Touchable就容易得多。 (而不是在编辑器中使用实际上令人困惑且有问题的“按钮”function。)

了解情况……

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

2) 编辑function“制作一个按钮”是垃圾……

3)它是一个“颠倒”按钮,

4)即,它将文本/图像放在 Button.cs下

5)“按钮”是你应该添加到任何东西的东西。 这正是它与Button + Touchable一起使用的方式。

6)所以 – 非常简单 –

1.有你想要的任何东西。 文本,图像,面板,隐形,动画 – 无论如何。

2.按下按钮+可触摸 – 你已经完成了。

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


历史性的信誉:我相信Unity论坛用户“signalZak”是很多年前第一个想到它的人!

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

 void showButton(Button buttonToShow, bool show) { Image bImage = buttonToShow.GetComponent(); Text bText = buttonToShow.GetComponentInChildren(); //Text is a child of the Button if (bImage != null) { bImage.enabled = show; } if (bText != null) { bText.enabled = show; } } 

但那没用。 如果按钮的imagetext组件都被disabled ,则不会触发按钮单击事件。 必须 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(); Text bText = buttonToShow.GetComponentInChildren(); //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; } } }