2016-04-27 17 views
6

Guardando alcune delle risposte nei forum Unity e nel Q & Un sito, le risposte su come rendere invisibile un pulsante non funzionano perché togliere l'immagine associata al pulsante lo rende non funzionante.Come far funzionare un pulsante trasparente invisibile?

Come aggirare questo e mantenere la proprietà invisibile pur consentendo al pulsante di funzionare effettivamente?

+0

Basta rimuovere il testo secondario e modificare l'alfa dell'immagine su 0. –

+0

Perché no? Ci saranno problemi? –

+1

In breve, ** Unity ha dimenticato o ha scelto di non **, ha un concetto "tangibile" nella catena OO per cose come le immagini che sono, beh, "tangibili". In sostanza, questo significa che noi sviluppatori dobbiamo (in un modo o nell'altro) creare la nostra classe 'Touchable' per Unity - che è una classica situazione di" backfilling "OO. Quando "riattaccare" il problema generale è che deve essere perfettamente auto-manutentivo e fortunatamente sembra esserci una buona soluzione. – Fattie

risposta

12

Questa è una di quelle strane cose a proposito dell'Unità ...

100% dei progetti del mondo reale bisogno di questo, ma l'Unità dimenticato di farlo.

Versione corta:

È necessario Touchable.cs in ogni progetto Unity: ordinaria 'Crea pulsante' funzione di redattore

// 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. Usa di Unity

  2. Come sai, la funzione editor aggiunge due comp onents per te automaticamente. Uno è un Text ed uno è un Image ...

  3. sufficiente eliminare entrambi

  4. Drop the script precedente Touchable.cssul pulsante

Si è fatto. Questo è tutto ciò che c'è da fare.

Non può "decadere" con gli aggiornamenti Unity.

Si può effettivamente "Buttonize" nulla in .UI facendo cadere Touchable su di esso.

Mai più "aggiungi un'immagine trasparente" per creare un pulsante.


Unity ha dimenticato di astrarre un concetto "tangibile" nella catena OO.

Quindi, noi sviluppatori dobbiamo rendere la nostra classe Touchable "dalle" classi di Unity.

Questo è un classico problema "riempimento" in OO.

Quando "riempimento" l'unico problema è che deve essere perfettamente automatico. C'è solo una buona soluzione, Touchable.cs, che tutti usano.


Quindi, in tutto mondo reale unità proietta un pulsante simile a questo:

enter image description here

ONE Hai Unità di Button.cs

DUE si deve aggiungere Touchable.cs

Alcuni team creano una funzione di editor "Crea pulsante migliore" che rende semplicemente un oggetto di gioco, con Button.cs + Touchable.cs.

punta importante ...

Diciamo che può avere un pannello di interfaccia utente molto complessa. Forse ridimensiona. O forse hai un'animazione.

La cosa sorprendente è che puoi semplicemente rilasciare "Button + Touchable" su qualcosa di simile, e funzionerà.

Basta impostare il pulsante + Touchable in modo da espandersi per riempire il genitore. Questo è tutto ciò che c'è da fare.

enter image description here

In questa immagine esempio, "curriculum" e "uscire" potrebbe essere qualsiasi cosa . (Un'animazione, un pannello complicato con molte parti, il testo, sprite, somethign invisibile, una pila -. Nulla)

In tutti i casi, basta semplicemente inserire un pulsante + Touchable sotto e si dispone di un pulsante impeccabile.

In effetti: questo approccio è così semplice da rendere anche i pulsanti più semplici utilizzando questo approccio.

Supponiamo che il tuo pulsante sia un'immagine banale. È molto più semplice avere solo un'immagine, quindi rilasciare un pulsante + un oggetto toccabile. (Invece di utilizzare la funzione in realtà confusa e problematica "Button" nell'editor.)

Comprendere la situazione ...

1) la classe di unità Button.cs è fantastico.

2) Ma la funzione editor di "fare un Button" è spazzatura ...

3) Si fa un pulsante "a testa in giù",

4) cioè, mette un testo/immagine sotto Button.cs

5) "Button-ness" è qualcosa si dovrebbe aggiungere alla nulla. Questo è esattamente il modo in cui funziona con Button + Touchable.

6) Così - molto semplicemente -

1. Avere tutto quello che vuoi. Testo, immagine, pannello, invisibile, animazione - qualunque cosa.

2. Pulsante di rilascio + Touchable su di esso - il gioco è fatto.

Ecco come tutti fanno tutti i pulsanti in Unity!


credito storico: credo Unità utente del forum "signalZak" è stato il primo a pensare questo fuori molti, molti anni fa!

0

La mia prima soluzione era quella di enable e disable i componenti come di seguito:

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

ma che non ha funzionato. Se i componenti del pulsante image e text sono entrambidisabled, l'evento clic sul pulsante sarà NON incendio. Uno di questi DEVE essere enabled in grado di inviare eventi di clic.

La soluzione è impostare l'alfa di entrambi i componenti image e text su 0 per nascondere e su 1 per visualizzare di nuovo. Saranno nascosti ma non disattivato e fare clic su events funzionerà.

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; 

     } 
    } 
} 
Problemi correlati