2016-04-27 8 views
6

Wenn Sie sich die Antworten in den Unity-Foren und in der Q & A-Site ansehen, funktionieren die Antworten zum Erstellen einer unsichtbaren Schaltfläche nicht, weil das Bild, das mit der Schaltfläche verknüpft ist, nicht funktioniert.Wie funktioniert eine unsichtbare transparente Schaltfläche?

Wie umgehen Sie das und behalten die unsichtbare Eigenschaft, während die Schaltfläche tatsächlich funktionieren?

+0

Entfernen Sie einfach untergeordneten Text und ändern Sie Bild alpha auf 0. –

+0

Warum nicht? Wird es ein Problem geben? –

+1

Kurz gesagt, vergessen ** Einheit auf, oder wählen Sie nicht zu **, ein „anfassbar“ -Konzept in der OO-Kette für Dinge wie Bilder haben, die, nun ja, „anfassbar“ sind. Dies bedeutet im Wesentlichen, dass Entwickler (auf die eine oder andere Weise) unsere eigene "Touchable" -Klasse für Unity erstellen müssen - eine klassische "Backfilling" -OA-Situation. Bei der "Verfüllung" ist das Gesamtproblem, dass es perfekt automatisch gewartet werden muss und glücklicherweise scheint es eine gute Lösung zu geben. – Fattie

Antwort

12

Dies ist einer jener seltsamen Dinge über Unity ...

100% der realen Projekten benötigen diese, sondern die Einheit vergessen, es zu tun.

Kurzversion:

Sie benötigen Touchable.cs in jeder Einheit Projekt:

// 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. Verwenden Unity normalen 'Create Button' Editor-Funktion

  2. Wie Sie wissen, die Editor-Funktion fügt zwei Comp für Sie automatisch. Eines ist ein Text und man ist ein Image ...

  3. einfach löschen sie beide

  4. Drop das obige Skript Touchable.csauf den Button

Sie fertig sind. Das ist alles dazu.

Es kann nicht mit Unity-Upgrades "verfallen".

können Sie tatsächlich "buttonize" etwas in .UI von Touchable oben drauf fallen.

Nie wieder ein transparentes Bild hinzufügen, um eine Schaltfläche zu erstellen.


Einheit vergessen, ein "berührbares" Konzept in der OO-Kette zu abstrahieren.

Also müssen wir Entwickler unsere eigene Touchable-Klasse "aus" Unity-Klassen machen.

Dies ist ein klassisches "Verfüllungs" -Problem in OO.

Beim "Verfüllen" ist das einzige Problem: Es muss perfekt automatisch gewartet werden. Es gibt nur eine gute Lösung, Touchable.cs, die jeder benutzt.


So in allen realen Einheit eine Schaltfläche Projekte sieht wie folgt aus:

enter image description here

ONE Sie haben Unity Button.cs

ZWEI Sie hinzufügen müssen Touchable.cs

Einige Teams machen eine Editor-Funktion "Create Better Button", die mit Button.cs + Touchable.cs einfach ein Spielobjekt macht.

Wichtiger Tipp ...

Sagen Sie bitte einen sehr komplexen UI-Panel haben. Vielleicht ändert sich die Größe. Oder vielleicht hast du eine Animation.

Die erstaunliche Sache ist, können Sie einfach "Button + Touchable" auf alles dergleichen, und es funktioniert.

Setzen Sie einfach die Schaltfläche + Touchable, um zu erweitern, um die Eltern zu füllen. Das ist alles dazu.

enter image description here

In diesem Beispiel Bild "Lebenslauf" und "Beenden" etwas sein könnte. (Eine Animation, eine komplizierte Panel mit vielen Teilen, Text, Sprites, somethign unsichtbar, ein Stapel -. Etwas)

In allen Fällen fallen nur einen Button + Berührbar unter und Sie haben eine einwandfreie Taste.

In der Tat: Dieser Ansatz ist so einfach, dass Sie mit diesem Ansatz auch die einfachsten Tasten machen.

Sagen Sie, Ihre Schaltfläche ist ein triviales Bild. Es ist viel einfacher, nur ein Bild zu haben und dann einen Button + Touchable darauf zu legen. (Anstatt verwenden, um die tatsächlich verwirrend und problematisch "Button" Funktion im Editor.)

die Situation zu verstehen ...

1) Unity Button.cs Klasse ist fantastisch.

2) Aber die Editor-Funktion "einen Button macht" ist Müll ...

3) Es hat eine macht "upside down" -Taste,

4), dh, es setzt einen Text/Bild unter Button.cs

5) "Button-ness" ist etwas, das Sie sollten haupt etwas hinzuzufügen. Genau so funktioniert es mit Button + Touchable. So

6) - ganz einfach -

1. alles Haben Sie wollen. Text, Bild, Panel, unsichtbar, Animation - was auch immer.

2. Drop-Taste + anfassbar - Sie sind fertig.

So macht jeder alle Knöpfe in Unity!


Historische Kredit: glaube ich Unity Forum Benutzer "signalZak" der erste war vor vielen, vielen Jahren auszudenken!

0

Meine erste Lösung war zu enable und disable die Komponenten wie unten:

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; 
    } 
} 

aber das hat nicht funktioniert. Wenn die image und text Komponenten der Taste disabled sind, wird das Button-Klick-Ereignis NICHT ausgelöst. Einer von ihnen MUSSenabled in der Lage für Click-Ereignisse gesendet werden.

Die Lösung besteht darin, das Alpha der beiden image und text Komponenten auf 0 zu verstecken und auf 1 zu zeigen. Sie werden ausgeblendet, aber nicht deaktiviert und klicken Sie auf events wird funktionieren.

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; 

     } 
    } 
} 
Verwandte Themen