यूआई कैनवस के साथ एकता में इंटरफ़ेस संगठन

यूआई कैनवस यूजर इंटरफेस बनाने के लिए एकता में एक अच्छा सिस्टम है। इस पर बहुत सारी प्रशिक्षण सामग्री लिखी गई है, लेकिन अधिकांश मार्गदर्शिकाएँ केवल आपको बताती हैं कि इसे काम करने के लिए कौन से बटन दबाने हैं और किस कोड को लिखना है। उदाहरण के लिए, एक छोटे इंटरफ़ेस में आमतौर पर खिड़कियों की एक जोड़ी होती है: मुख्य मेनू, सेटिंग्स। हालांकि, खेलों में बहुत अधिक खिड़कियां हैं और जब उनमें से कम से कम एक दर्जन पहले से ही हैं, तो किसी प्रकार के संगठन की आवश्यकता उत्पन्न होती है। इस लेख के भाग के रूप में, मैं इस समस्या के समाधान के बारे में बात करना चाहता हूं।

सबसे पहले आपको अपने इंटरफ़ेस में व्यक्तिगत विंडो का चयन करना होगा। खिड़की से मेरा मतलब है कुछ नियंत्रणों वाला एक पैनल।

विंडो उदाहरण






प्रत्येक विंडो में एक रूट ऑब्जेक्ट होना चाहिए जिसमें सभी नियंत्रण होंगे। यह ऑब्जेक्ट विंडो को संपूर्ण रूप में दर्शाएगा। उदाहरण के लिए, एक पैनल है जिस पर नियंत्रण स्थित हैं, इन तत्वों को पैनल का बच्चा बनाना तर्कसंगत है। प्रत्येक विंडो से एक घटक जुड़ा हुआ है, जो कि अमूर्त विंडो क्लास का वंशज है।

खिड़की


विंडो इस धारणा पर लिखी गई है कि खिड़कियों में बच्चे की खिड़कियां हो सकती हैं, अर्थात्। वे विंडो जिन्हें एक ही समय में एक ही समय में एक विंडो से खोला जा सकता है, एक बच्चे की खिड़की खोली जा सकती है और बाकी सभी को बंद कर दिया जाना चाहिए। इस उद्देश्य के लिए, क्लास में करंटविंडो प्रॉपर्टी होती है जिसमें वर्तमान में खुली हुई विंडो का लिंक संग्रहीत होता है। और एक ओनोपेन घटना भी है जो एक खिड़की के उद्घाटन की रिपोर्ट करती है। चेंजक्रेक्टविंडो () विधि को चाइल्ड विंडो में इस ईवेंट के लिए सब्सक्राइब किया जा सकता है, ताकि किसी भी समय एक चाइल्ड विंडो खुल जाए, यह ओपन चाइल्ड विंडो को बंद कर देता है और लिंक को वर्तमान ओपन विंडो में बदल देता है, नीचे मैं एक उदाहरण कार्यान्वयन दूंगा। साथ ही कक्षा में सेल्फक्लोज़ () और सेल्फऑन () तरीके हैं, ये तरीके इस बात के लिए ज़िम्मेदार हैं कि खिड़की कैसे खुलेगी और बंद होगी। जाग () विधि में, विंडो UIManager में पंजीकृत है, अर्थात। विंडो के लिए एक लिंक जोड़ा जाता है।

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


इसके बाद, हम UIManager वर्ग की ओर बढ़ते हैं, यह एक सिग्लैटन वर्ग है ताकि यदि आवश्यक हो तो सभी खिड़कियां इसे एक्सेस कर सकें। जैसा कि आप देख सकते हैं, इसमें विंडोज खिड़कियों की एक सूची है, यह मंच पर सभी खिड़कियों के लिंक संग्रहीत करता है। कुछ को इनिशियलाइज़ करने के लिए InitUI () की आवश्यकता होती है, उदाहरण के लिए, यदि आप प्रीफ़ैब्स से विंडो बनाना चाहते हैं, तो यहाँ आप उनके इंस्टेंसेस कर सकते हैं।
प्रारंभ () विधि में, आप ऐसी खिड़कियां खोल सकते हैं जो बहुत शुरुआत से खुली होनी चाहिए, या इसके विपरीत अनावश्यक को बंद करें। गेट () विधि आपको एक विशिष्ट विंडो का लिंक प्राप्त करने की अनुमति देती है।

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

SettingsWindow


एक उदाहरण के रूप में, मैं सेटिंग्स विंडो का अपना कार्यान्वयन दूंगा:

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

सेटिंग्स विंडो से मैं 4 अन्य विंडो खोल सकता हूं, ताकि केवल एक विंडो खुली हो, मैं चाइल्ड विंडो के ऑनऑन इवेंट्स में सेटिंग्स विंडो के ChangeCurrentWindow () मेथड को सब्सक्राइब करता हूं, इसलिए अन्य के खुलने पर विंडो बंद हो जाती है। SelfOpen () और SelfClose () कार्यान्वयन बस विंडो को सक्रिय या निष्क्रिय करते हैं।

इस प्रकार, एक आसानी से एक्स्टेंसिबल यूआई सिस्टम प्राप्त किया जाता है, इंस्पेक्टर या अन्य जगहों पर खिड़कियों को मैन्युअल रूप से लिंक करने की आवश्यकता नहीं है, एक नई विंडो जोड़ने के लिए, आपको बस उपयुक्त वर्ग बनाने और विंडो से इनहेरिट करने की आवश्यकता है। इस तरह की प्रणाली में कुछ मीनू होते हैं, और अधिक खिड़कियां, अधिक कक्षाएं बनाने के लिए आवश्यक होगा और यह तथ्य है कि खिड़की के लिंक की खोज लिंक की सरणी के माध्यम से छंटनी द्वारा की जाती है, लेकिन मेरी राय में ये कमियां फायदे के साथ भुगतान करती हैं।

रिपोजिटरी लिंक

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


All Articles