如何使隐形透明按钮工作?
看一下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();} }
-
使用Unity的普通“创建按钮”编辑器function
-
如您所知,编辑器function会自动为您添加两个组件 。 一个是
Text
,一个是Image
…… -
只需删除它们
-
在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”是很多年前第一个想到它的人!
我的第一个解决方案是enable
和disable
以下组件:
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; } }
但那没用。 如果按钮的image
和text
组件都被disabled
,则不会触发按钮单击事件。 必须 enabled
其中一个才能发送点击事件。
解决方案是将image
和text
组件的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; } } }