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

时间:2016-04-27 11:43:18

标签: c# button unity3d transparent unity3d-ui

查看Unity论坛和Q& A网站中的一些答案,如何制作隐藏按钮的答案不起作用,因为删除与该按钮相关的图像使其无效。

如何在允许按钮实际工作的同时保持隐身属性?

4 个答案:

答案 0 :(得分:15)

这是关于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的普通'创建按钮'编辑功能

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

  3. 只需删除它们

  4. 在按钮上删除上述脚本Touchable.cs

  5. 你完成了。这就是它的全部内容。

    它不会'衰变"使用Unity升级。

    你实际上可以"按钮化" .UI上的 任何 ,只需删除Touchable

    再也不会"添加一个透明的图像"做一个按钮。

    Unity忘了抽象"可触摸" OO链中的概念。

    因此,我们开发人员必须制作我们自己的Touchable课程"来自" Unity的课程。

    这是一个经典的"回填" OO中的问题

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

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

    enter image description here

    ONE 您拥有Unity Button.cs

    TWO 您必须添加Touchable.cs

    一些团队制作编辑功能"创建更好的按钮"用Button.cs + Touchable.cs简单地制作一个游戏对象。

    重要提示......

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

    事实上,你可以放弃"按钮+触摸" on 类似的东西,它会起作用。

    只需设置Button + Touchable即可展开以填充父级。这就是它的全部内容。

    enter image description here

    在此示例图像中," resume"和"退出"可能任何。 (一个动画,一个复杂的面板,包含很多部分,文本,精灵,不可见的东西,堆栈 - 任何东西。)

    在所有情况下,只需在 下面放置一个按钮+可触摸的 ,即可获得一个完美无瑕的按钮。

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

    说你的按钮是一个微不足道的形象。拥有一个图像,然后在其上放一个Button + Touchable就容易多了。 (而不是在编辑器中使用令人困惑且有问题的"按钮"功能。)

    了解情况......

    1)Unity的Button.cs课很棒。

    2)编辑功能"制作一个按钮"是垃圾......

    3)它会使#34;颠倒过来"按钮,

    4)即,它将文本/图像 置于 Button.cs

    5)"按钮"您应该能够 添加到 的任何内容。这正是它与Button + Touchable一起使用的方式。

    6)所以 - 非常简单 -

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

    2。放下按钮+可触摸它 - 你已经完成了。

    这就是每个人如何处理Unity中的所有按钮!

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

答案 1 :(得分:2)

作为Fattie答案的一种可能的改进,将Touchable的基类更改为Graphic并覆盖protected void UpdateGeometry()似乎可以很好地解决白色问题,从而减少了与{相关的开销{1}}。

Text

答案 2 :(得分:0)

我启动了Gimp(该免费编码器图形工具)。创建了新图像(任意大小,我选择了10像素x 10像素),并从高级(在创建对话框中)选择了它的背景应该是透明的。保存文件。将其导出为png并选择了保存背景色。将其作为精灵拖入Unity。将其放在按钮图形上。取消显示按钮的文本组件。不需要代码...只是在Gimp中不画任何东西(这是最难的部分)。

答案 3 :(得分:-1)

我的第一个解决方案是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组件 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;

        }
    }
}