Organisation de l'interface dans Unity avec UI Canvas

Unity a un bon systĂšme pour crĂ©er une interface utilisateur UI Canvas. De nombreux supports de formation y ont Ă©tĂ© Ă©crits, mais la plupart des guides ne vous indiquent que sur quels boutons appuyer et quel code Ă©crire pour le faire fonctionner. À titre d'exemples, une petite interface se compose gĂ©nĂ©ralement d'une paire de fenĂȘtres: le menu principal, les paramĂštres. Cependant, dans les jeux, il y a beaucoup plus de fenĂȘtres et quand il y en a dĂ©jĂ  au moins une douzaine, le besoin d'une sorte d'organisation se fait sentir. Dans le cadre de cet article, je souhaite expliquer comment rĂ©soudre ce problĂšme.

Vous devez d'abord sĂ©lectionner des fenĂȘtres individuelles dans votre interface. Par fenĂȘtre, je veux dire un panneau avec quelques contrĂŽles.

Exemples de fenĂȘtres






Chaque fenĂȘtre doit avoir un objet racine qui contiendra tous les contrĂŽles. Cet objet reprĂ©sentera la fenĂȘtre dans son ensemble. Par exemple, il y a un panneau sur lequel se trouvent les contrĂŽles, il est logique de rendre ces Ă©lĂ©ments enfant par rapport au panneau. Un composant est attachĂ© Ă  chaque fenĂȘtre, qui est le descendant de la classe abstraite Window.

FenĂȘtre


La fenĂȘtre est Ă©crite en supposant que les fenĂȘtres peuvent avoir des fenĂȘtres enfants, c'est-Ă -dire ces fenĂȘtres qui peuvent ĂȘtre ouvertes Ă  partir de la fenĂȘtre actuelle en mĂȘme temps en mĂȘme temps qu'une fenĂȘtre enfant peut ĂȘtre ouverte, et tout le reste doit ĂȘtre fermĂ©. À cet effet, la classe contient la propriĂ©tĂ© CurrentWindow dans laquelle le lien vers la fenĂȘtre actuellement ouverte est stockĂ©. Et il y a aussi un Ă©vĂ©nement OnOpen qui signale l'ouverture d'une fenĂȘtre. La mĂ©thode ChangeCurrentWindow () peut ĂȘtre abonnĂ©e Ă  cet Ă©vĂ©nement prĂšs des fenĂȘtres enfants, de sorte qu'Ă  tout moment une fenĂȘtre enfant soit ouverte, elle ferme la fenĂȘtre enfant ouverte et change le lien vers la fenĂȘtre ouverte actuelle, ci-dessous je vais donner un exemple d'implĂ©mentation. Également dans la classe, il existe des mĂ©thodes SelfClose () et SelfOpen (), ces mĂ©thodes sont responsables de la façon dont la fenĂȘtre s'ouvrira et se fermera. Dans la mĂ©thode Awake (), la fenĂȘtre est enregistrĂ©e dans UIManager, c'est-Ă -dire un lien vers la fenĂȘtre est ajoutĂ©.

public abstract class Window : MonoBehaviour { public bool IsOpen { get; private set; } public Window CurrentWindow { get; protected set; } = null; public delegate void OpenEventHandler(Window sender); public event OpenEventHandler OnOpen; void Awake() { UIManager.Instance.Windows.Add(this.gameObject); } public void Open() { IsOpen = true; if (OnOpen != null) OnOpen(this); SelfOpen(); } protected abstract void SelfOpen(); public void Close() { IsOpen = false; if (CurrentWindow != null) CurrentWindow.Close(); SelfClose(); } protected abstract void SelfClose(); protected void ChangeCurrentWindow(Window sender) { if (CurrentWindow != null) CurrentWindow.Close(); CurrentWindow = sender; } } 

UIManager


Ensuite, nous passons Ă  la classe UIManager, il s'agit d'une classe sigleton afin que toutes les fenĂȘtres puissent y accĂ©der si nĂ©cessaire. Comme vous pouvez le voir, il a une liste de fenĂȘtres Windows, il stocke des liens vers toutes les fenĂȘtres de la scĂšne. InitUI () est nĂ©cessaire pour initialiser quelque chose, par exemple, si vous souhaitez crĂ©er des fenĂȘtres Ă  partir de prĂ©fabriquĂ©s, vous pouvez ici faire leurs instances.
Dans la mĂ©thode Start (), vous pouvez ouvrir des fenĂȘtres qui devraient ĂȘtre ouvertes dĂšs le dĂ©but, ou vice versa, fermer les fenĂȘtres inutiles. La mĂ©thode Get () vous permet d'obtenir un lien vers une fenĂȘtre spĂ©cifique.

 using System.Collections; using System.Collections.Generic; using UnityEngine; using System; public class UIManager : MonoBehaviour { public static UIManager Instance = null; public List<GameObject> Windows; void Awake() { if (Instance == null) Instance = this; else if (Instance != this) Destroy(gameObject); InitUI(); } private void InitUI() { //to do } void Start() { foreach(var window in Windows) { var windowComponent = window.GetComponent<Window>(); if (windowComponent is StartWindow) windowComponent.Open(); else windowComponent.Close(); } } public Window Get<T> () where T : Window { foreach(var window in Windows) { var windowComponent = window.GetComponent<Window>(); if (windowComponent is T) return windowComponent; } return null; } } 

ParamĂštresWindow


À titre d'exemple, je vais vous donner mon implĂ©mentation de la fenĂȘtre des paramĂštres:

 using System.Collections; using System.Collections.Generic; using UnityEngine; public class SettingsWindow : Window { private VideoSettingsWindow videoSettingsWindow; private LanguageSettingsWindow languageSettingsWindow; private AudioSettingsWindow audioSettingsWindow; private ControlSettingsWindow controlSettingsWindow; public void Start() { videoSettingsWindow = UIManager.Instance.GetWindow<VideoSettingsWindow>(); languageSettingsWindow = UIManager.Instance.GetWindow<LanguageSettingsWindow>(); audioSettingsWindow = UIManager.Instance.GetWindow<AudioSettingsWindow>(); controlSettingsWindow = UIManager.Instance.GetWindow<ControlSettingsWindow>(); videoSettingsWindow.OnOpen += ChangeCurrentWindow; languageSettingsWindow.OnOpen += ChangeCurrentWindow; audioSettingsWindow.OnOpen += ChangeCurrentWindow; controlSettingsWindow.OnOpen += ChangeCurrentWindow; } protected override void SelfOpen() { this.gameObject.SetActive(true); } protected override void SelfClose() { this.gameObject.SetActive(false); } public void Apply() { } public void VideoSettings() { videoSettingsWindow.Open(); } public void LanguageSettings() { languageSettingsWindow.Open(); } public void AudioSettings() { audioSettingsWindow.Open(); } public void ControlSettings() { controlSettingsWindow.Open(); } } 

À partir de la fenĂȘtre des paramĂštres, je peux ouvrir 4 autres fenĂȘtres afin qu'une seule fenĂȘtre soit ouverte, je signe la mĂ©thode ChangeCurrentWindow () de la fenĂȘtre des paramĂštres aux Ă©vĂ©nements OnOpen des fenĂȘtres enfants, donc les fenĂȘtres ouvertes sont fermĂ©es lorsque d'autres s'ouvrent. Les implĂ©mentations SelfOpen () et SelfClose () activent ou dĂ©sactivent simplement la fenĂȘtre.

Ainsi, un systĂšme d'interface utilisateur facilement extensible est obtenu, il n'est pas nĂ©cessaire d'ajouter manuellement des liens vers des fenĂȘtres dans l'inspecteur ou ailleurs; pour ajouter une nouvelle fenĂȘtre, il vous suffit de crĂ©er la classe appropriĂ©e et de l'hĂ©riter de Window. Un tel systĂšme a quelques inconvĂ©nients, que plus il y aura de fenĂȘtres, plus il faudra crĂ©er de classes et le fait que la recherche d'un lien vers la fenĂȘtre se fasse en triant le tableau de liens, mais Ă  mon avis, ces lacunes sont payantes.

Lien vers le référentiel

Source: https://habr.com/ru/post/fr472770/


All Articles