Come si fa a far funzionare un pulsante trasparente invisibile?

Guardando alcune risposte nei forum di Unity e nel sito di domande e risposte, le risposte su come rendere invisibile un pulsante non funzionano perché togliere l’immagine associata al pulsante non consente di farlo.

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

Questa è una di quelle cose strane su Unity …

Il 100% dei progetti del mondo reale ha bisogno di questo, ma Unity ha dimenticato di farlo.

Versione breve:

Hai bisogno di Touchable.cs in ogni progetto Unity:

 // 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. Utilizza la funzione editor di “Crea pulsante” di Unity

  2. Come sapete, la funzione editor aggiunge automaticamente due componenti . Uno è un Text e uno è Image

  3. Basta eliminarli entrambi

  4. Lascia cadere lo script di cui sopra Touchable.cs sul pulsante

Hai fatto. Questo è tutto ciò che c’è da fare.

Non può “decadere” con gli aggiornamenti Unity.

Puoi effettivamente “bottonare” qualsiasi cosa 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 class di Touchable “dalle” classi di Unity.

Questo è un classico problema di “riempimento” in OO .

Quando “rinterri” l’unico problema è questo: deve essere perfettamente auto-mantenimento. C’è solo una buona soluzione, Touchable.cs, che tutti usano.


Quindi in tutti i progetti di Unity del mondo reale un pulsante ha il seguente aspetto:

inserisci la descrizione dell'immagine qui

UNO hai Button.cs di Button.cs

DUE devi aggiungere Touchable.cs

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

Suggerimento importante …

Supponiamo che tu abbia un pannello dell’interfaccia utente molto complesso. Forse ridimensiona. O forse hai un’animazione.

La cosa sorprendente è che puoi semplicemente far cadere “Button + Touchable” in qualcosa di simile, e funzionerà.

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

inserisci la descrizione dell'immagine qui

In questo esempio, “resume” e “quit” potrebbero essere qualsiasi cosa . (Un’animazione, un pannello complicato con molte parti, testo, sprite, qualcosa di invisibile, una pila – qualsiasi cosa.)

In tutti i casi, basta rilasciare un pulsante + Touchable sotto e hai un pulsante impeccabile.

Infatti: questo approccio è così semplice che potrai realizzare 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 object toccabile. (Piuttosto che usare la funzione “Button” effettivamente confusa e problematica nell’editor.)

Capire la situazione …

1) La class Button.cs di Unity è fantastica.

2) Ma la funzione dell’editor “make a Button” è spazzatura …

3) Fa un pulsante “capovolto”,

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

5) “Button-ness” è qualcosa che dovresti aggiungere a qualsiasi cosa. Questo è esattamente il modo in cui funziona con Button + Touchable.

6) Quindi – abbastanza semplicemente –

1. Avere tutto ciò che vuoi. Testo, immagine, pannello, invisibile, animazione – qualunque cosa.

2. Pulsante di rilascio + Touchable su di esso – hai finito.

È così che tutti fanno tutti i pulsanti in Unity!


Credito storico: credo che l’utente del forum di Unity “signalZak” sia stato il primo a pensarlo molti, molti anni fa!

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

 void showButton(Button buttonToShow, bool show) { Image bImage = buttonToShow.GetComponent(); Text bText = buttonToShow.GetComponentInChildren(); //Text is a child of the Button if (bImage != null) { bImage.enabled = show; } if (bText != null) { bText.enabled = show; } } 

ma quello non ha funzionato. Se i componenti image e del text del pulsante sono entrambi disabled , l’evento di clic sul pulsante NON verrà disabled . Uno di questi deve essere enabled in modo che gli eventi click possano essere inviati.

La soluzione è impostare l’alfa di entrambi i componenti image e del text su 0 per hide e su 1 per mostrare di nuovo. Saranno nascosti ma non disabilitati e gli events click funzioneranno.

 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(); Text bText = buttonToShow.GetComponentInChildren(); //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; } } }