如何使不可见的透明按钮起作用?
How to make an invisible transparent button work?
查看Unity论坛和问答网站上的一些答案,关于如何制作不可见按钮的答案不起作用,因为去掉按钮附属的图像使其不起作用。
如何解决这个问题并保持不可见 属性,同时允许按钮实际工作?
我的第一个解决方案是 enable
和 disable
如下组件:
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;
}
}
但这没有用。如果按钮的 image
和 text
组件都是 both disabled
,按钮单击事件将 NOT 触发.其中之一 必须 是 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<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();} }
使用Unity的普通'Create Button'编辑器功能
如您所知,编辑器功能自动为您添加两个组件。一个是 Text
,一个是 Image
...
两个都删掉
将上面的脚本 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() { }
}
查看Unity论坛和问答网站上的一些答案,关于如何制作不可见按钮的答案不起作用,因为去掉按钮附属的图像使其不起作用。
如何解决这个问题并保持不可见 属性,同时允许按钮实际工作?
我的第一个解决方案是 enable
和 disable
如下组件:
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;
}
}
但这没有用。如果按钮的 image
和 text
组件都是 both disabled
,按钮单击事件将 NOT 触发.其中之一 必须 是 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<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();} }
使用Unity的普通'Create Button'编辑器功能
如您所知,编辑器功能自动为您添加两个组件。一个是
Text
,一个是Image
...两个都删掉
将上面的脚本
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() { }
}