Organisasi antarmuka dalam Persatuan dengan Kanvas UI

Unity memiliki sistem yang bagus untuk membuat antarmuka pengguna Canvas UI. Banyak materi pelatihan telah ditulis di atasnya, tetapi sebagian besar panduan hanya memberi tahu Anda tombol mana yang harus ditekan dan kode mana yang harus ditulis untuk membuatnya bekerja. Sebagai contoh, antarmuka kecil biasanya terdiri dari sepasang jendela: menu utama, pengaturan. Namun, dalam permainan ada lebih banyak jendela dan ketika sudah ada setidaknya selusin dari mereka, kebutuhan untuk beberapa jenis organisasi muncul. Sebagai bagian dari artikel ini, saya ingin berbicara tentang bagaimana saya menyelesaikan masalah ini.

Pertama, Anda perlu memilih masing-masing jendela di antarmuka Anda. Jendela saya maksudkan panel dengan beberapa kontrol.

Contoh Jendela






Setiap jendela harus memiliki objek root yang akan berisi semua kontrol. Objek ini akan mewakili jendela secara keseluruhan. Misalnya, ada panel di mana kontrol berada, masuk akal untuk membuat elemen-elemen ini berkenaan dengan panel. Komponen dilampirkan ke setiap jendela, yang merupakan turunan dari kelas Window abstrak.

Jendela


Jendela ditulis dengan asumsi bahwa windows dapat memiliki jendela anak, mis. jendela-jendela yang dapat dibuka dari jendela saat ini pada saat yang sama pada saat yang sama satu jendela anak dapat dibuka, dan semua sisanya harus ditutup. Untuk tujuan ini, kelas berisi properti CurrentWindow di mana tautan ke jendela yang saat ini terbuka disimpan. Dan juga ada acara OnOpen yang melaporkan pembukaan jendela. Metode ChangeCurrentWindow () dapat berlangganan acara ini di windows anak, sehingga pada suatu waktu satu jendela anak dibuka, itu menutup jendela anak terbuka dan mengubah tautan ke jendela buka saat ini, di bawah ini saya akan memberikan contoh implementasi. Juga di kelas ada metode SelfClose () dan SelfOpen (), metode ini bertanggung jawab untuk bagaimana jendela akan membuka dan menutup. Dalam metode Sedarlah (), jendela terdaftar di UIManager, yaitu tautan ke jendela ditambahkan.

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


Selanjutnya, kita beralih ke kelas UIManager, itu adalah kelas Sigleton sehingga semua jendela dapat mengaksesnya jika perlu. Seperti yang Anda lihat, ia memiliki daftar jendela Windows, ia menyimpan tautan ke semua jendela di atas panggung. InitUI () diperlukan untuk menginisialisasi sesuatu, misalnya, jika Anda ingin membuat windows dari prefab, maka di sini Anda dapat melakukan instansnya.
Dalam metode Mulai (), Anda dapat membuka jendela yang seharusnya terbuka dari awal, atau sebaliknya menutup yang tidak perlu. Metode Dapatkan () memungkinkan Anda mendapatkan tautan ke jendela tertentu.

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

Pengaturan Jendela


Sebagai contoh, saya akan memberikan implementasi saya dari jendela pengaturan:

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

Dari jendela pengaturan saya bisa membuka 4 jendela lain sehingga hanya satu jendela yang terbuka, saya berlangganan metode ChangeCurrentWindow () dari jendela pengaturan ke acara OnOpen dari jendela anak, jadi jendela yang terbuka ditutup ketika yang lain terbuka. Implementasi SelfOpen () dan SelfClose () cukup mengaktifkan atau menonaktifkan jendela.

Dengan demikian, sistem UI yang mudah diperluas diperoleh, tidak perlu secara manual menambahkan tautan ke windows di inspektur atau di tempat lain, untuk menambahkan jendela baru, Anda hanya perlu membuat kelas yang sesuai dan mewarisinya dari Window. Sistem semacam itu memiliki beberapa kekurangan, bahwa semakin banyak jendela, semakin banyak kelas yang diperlukan untuk dibuat dan fakta bahwa pencarian tautan ke jendela dilakukan dengan memilah-milah susunan tautan, tetapi menurut saya kekurangan ini terbayar.

Tautan Repositori

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


All Articles