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

Rya*_*zzo 9 c# button transparent unity-game-engine unity3d-ui

看看Unity论坛和问答网站中的一些答案,如何制作隐形按钮的答案不起作用,因为删除与按钮相关的图像使其无效.

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

Fat*_*tie 17

这是关于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();} }
Run Code Online (Sandbox Code Playgroud)
  1. 使用Unity的普通"创建按钮"编辑器功能

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

  3. 只需删除它们

  4. 将以上脚本Touchable.cs 放在Button上

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

它无法通过Unity升级"衰减".

实际上,你可以"buttonize" 任何.UI通过降低Touchable在它的上面.

永远不要再"添加透明图像"来制作按钮.


Unity忘记在OO链中抽象出一个"可触摸"的概念.

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

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

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


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

在此输入图像描述

ONE你有Unity的Button.cs

两个你必须添加Touchable.cs

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

重要提示......

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

事实上,你可以将"Button + Touchable" 放到类似的东西上,它会起作用.

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

在此输入图像描述

在此示例图像中,"resume"和"quit"可以是任何内容.(一个动画,一个复杂的面板,包含许多部件,文本,精灵,不可见的东西,堆栈 - 任何东西.)

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

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

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

了解情况......

1)Unity的Button.cs课程太棒了.

2)但是编辑功能"make a Button"是垃圾......

3)它是一个"颠倒"按钮,

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

5)"Button-ness"是你应该能够添加到任何东西的东西.这正是它与Button + Touchable一起使用的方式.

6)所以 - 非常简单 -

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

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

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


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


小智 6

作为对 Fattie 答案的可能改进,将Touchable的基类更改为Graphic和覆盖protected void UpdateGeometry()似乎可以很好地减少与Text.

public class Touchable:Graphic
{
    protected override void UpdateGeometry() { }
}
Run Code Online (Sandbox Code Playgroud)