查看Unity论坛和Q& A网站中的一些答案,如何制作隐藏按钮的答案不起作用,因为删除与该按钮相关的图像使其无效。
如何在允许按钮实际工作的同时保持隐身属性?
答案 0 :(得分:15)
简短版本:
每个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的普通'创建按钮'编辑功能
如您所知,编辑器功能会自动为您添加两个组件。一个是Text
,一个是Image
...
只需删除它们
在按钮上删除上述脚本Touchable.cs
你完成了。这就是它的全部内容。
它不会'衰变"使用Unity升级。
你实际上可以"按钮化" .UI
上的 任何 ,只需删除Touchable
。
再也不会"添加一个透明的图像"做一个按钮。
Unity忘了抽象"可触摸" OO链中的概念。
因此,我们开发人员必须制作我们自己的Touchable课程"来自" Unity的课程。
这是一个经典的"回填" OO中的问题 。
当"回填"唯一的问题是:它必须完全自动维护。只有一个很好的解决方案,Touchable.cs,每个人都使用。
因此,在所有真实世界的Unity项目中,按钮看起来像这样:
ONE 您拥有Unity Button.cs
TWO 您必须添加Touchable.cs
一些团队制作编辑功能"创建更好的按钮"用Button.cs + Touchable.cs简单地制作一个游戏对象。
假设您可能有一个非常复杂的UI 面板。所以它调整大小甚至动画。
事实上,你可以放弃"按钮+触摸" on 类似的东西,它会起作用。
只需设置Button + Touchable即可展开以填充父级。这就是它的全部内容。
在此示例图像中," resume"和"退出"可能任何。 (一个动画,一个复杂的面板,包含很多部分,文本,精灵,不可见的东西,堆栈 - 任何东西。)
在所有情况下,只需在 下面放置一个按钮+可触摸的 ,即可获得一个完美无瑕的按钮。
事实上:这种方法非常简单,即使是简单的情况,您也可能会使用它。
说你的按钮是一个微不足道的形象。拥有一个图像,然后在其上放一个Button + Touchable就容易多了。 (而不是在编辑器中使用令人困惑且有问题的"按钮"功能。)
1)Unity的Button.cs
课很棒。
2)但编辑功能"制作一个按钮"是垃圾......
3)它会使#34;颠倒过来"按钮,
4)即,它将文本/图像 置于 Button.cs
5)"按钮"您应该能够 添加到 的任何内容。这正是它与Button + Touchable一起使用的方式。
6)所以 - 非常简单 -
这就是每个人如何处理Unity中的所有按钮!
历史性信用:我相信Unity论坛用户" signalZak" 是多年前第一个想到这一点的人!
答案 1 :(得分:2)
作为Fattie答案的一种可能的改进,将Touchable
的基类更改为Graphic
并覆盖protected void UpdateGeometry()
似乎可以很好地解决白色问题,从而减少了与{相关的开销{1}}。
Text
答案 2 :(得分:0)
我启动了Gimp(该免费编码器图形工具)。创建了新图像(任意大小,我选择了10像素x 10像素),并从高级(在创建对话框中)选择了它的背景应该是透明的。保存文件。将其导出为png并选择了保存背景色。将其作为精灵拖入Unity。将其放在按钮图形上。取消显示按钮的文本组件。不需要代码...只是在Gimp中不画任何东西(这是最难的部分)。
答案 3 :(得分:-1)
我的第一个解决方案是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
组件 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;
}
}
}