खोज…


मॉडल व्यू कंट्रोलर (MVC) डिज़ाइन पैटर्न

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

एक MVC डिज़ाइन में तीन मुख्य भाग होते हैं: मॉडल, दृश्य और नियंत्रक।


मॉडल: मॉडल एक ऐसा वर्ग है जो आपकी वस्तु के डेटा भाग का प्रतिनिधित्व करता है। यह एक खिलाड़ी, सूची या संपूर्ण स्तर हो सकता है। यदि सही ढंग से प्रोग्राम किया गया है, तो आपको इस स्क्रिप्ट को लेने और एकता के बाहर इसका उपयोग करने में सक्षम होना चाहिए।

मॉडल के बारे में कुछ बातें नोट करें:

  • यह Monobehaviour से विरासत में नहीं मिलना चाहिए
  • इसमें पोर्टेबिलिटी के लिए एकता विशिष्ट कोड नहीं होना चाहिए
  • चूंकि हम यूनिटी एपीआई कॉल से बच रहे हैं, इससे मॉडल क्लास में निहित कन्वर्टर्स जैसी चीजें बाधित हो सकती हैं (वर्कअराउंड की आवश्यकता होती है)

Player.cs

using System;

public class Player
{
    public delegate void PositionEvent(Vector3 position);
    public event PositionEvent OnPositionChanged;

    public Vector3 position 
    {
        get 
        {
            return _position;
        }
        set 
        {
            if (_position != value) {
                _position = value;
                if (OnPositionChanged != null) {
                    OnPositionChanged(value);
                }
            }
        }
    }
    private Vector3 _position;
}

Vector3.cs

हमारे डेटा मॉडल के साथ उपयोग करने के लिए एक कस्टम वेक्टर 3 वर्ग।

using System;

public class Vector3
{
    public float x;
    public float y;
    public float z;

    public Vector3(float x, float y, float z)
    {
        this.x = x;
        this.y = y;
        this.z = z;
    }
}

दृश्य: दृश्य मॉडल से बंधे हुए देखने वाले हिस्से का प्रतिनिधित्व करने वाला एक वर्ग है। यह मोनोबेहौर से प्राप्त करने के लिए एक उपयुक्त वर्ग है। इसमें ऐसा कोड होना चाहिए जो सीधे OnCollisinEnter , Start , Update , आदि सहित विशिष्ट विशिष्ट API के साथ सहभागिता करता है ...

  • आमतौर पर मोनोबेवोर से विरासत में मिला है
  • एकता विशिष्ट कोड शामिल हैं

PlayerView.cs

using UnityEngine;

public class PlayerView : Monobehaviour
{
    public void SetPosition(Vector3 position)
    {
        transform.position = position;
    }
}

नियंत्रक: नियंत्रक एक वर्ग है जो मॉडल और दृश्य दोनों को एक साथ बांधता है। कंट्रोलर मॉडल और व्यू दोनों को सिंक में रखते हैं और साथ ही ड्राइव इंटरैक्शन भी करते हैं। नियंत्रक या तो साथी से घटनाओं के लिए सुन सकता है और तदनुसार अपडेट कर सकता है।

  • मॉडल और दृश्य दोनों को समन्‍वयित स्थिति से बांधता है
  • भागीदारों के बीच बातचीत चला सकते हैं
  • नियंत्रक पोर्टेबल हो सकते हैं या नहीं भी हो सकते हैं (आपको यहां एकता कोड का उपयोग करना पड़ सकता है)
  • यदि आप अपने नियंत्रक को पोर्टेबल नहीं बनाने का निर्णय लेते हैं, तो इसे संपादक निरीक्षण के साथ मदद करने के लिए एक मोनोबेहवियर बनाने पर विचार करें

PlayerController.cs

using System;

public class PlayerController
{
    public Player model { get; private set; }
    public PlayerView view { get; private set; }

    public PlayerController(Player model, PlayerView view)
    {
        this.model = model;
        this.view = view;

        this.model.OnPositionChanged += OnPositionChanged;
    }

    private void OnPositionChanged(Vector3 position)
    {
        // Sync
        Vector3 pos = this.model.position;

        // Unity call required here! (we lost portability)
        this.view.SetPosition(new UnityEngine.Vector3(pos.x, pos.y, pos.z));
    }
    
    // Calling this will fire the OnPositionChanged event 
    private void SetPosition(Vector3 position)
    {
        this.model.position = position;
    }
}

अंतिम उपयोग

अब जब हमारे पास सभी मुख्य टुकड़े हैं, तो हम एक कारखाना बना सकते हैं जो सभी तीन भागों को उत्पन्न करेगा।

PlayerFactory.cs

using System;

public class PlayerFactory
{
    public PlayerController controller { get; private set; }
    public Player model { get; private set; }
    public PlayerView view { get; private set; }

    public void Load()
    {
        // Put the Player prefab inside the 'Resources' folder
        // Make sure it has the 'PlayerView' Component attached
        GameObject prefab = Resources.Load<GameObject>("Player");
        GameObject instance = GameObject.Instantiate<GameObject>(prefab);
        this.model = new Player();
        this.view = instance.GetComponent<PlayerView>();
        this.controller = new PlayerController(model, view);
    }
}

और अंत में हम एक प्रबंधक से कारखाने को कॉल कर सकते हैं ...

Manager.cs

using UnityEngine;

public class Manager : Monobehaviour
{
    [ContextMenu("Load Player")]
    private void LoadPlayer()
    {
        new PlayerFactory().Load();
    }
}

दृश्य में एक खाली गेमऑबजेक्ट में प्रबंधक स्क्रिप्ट संलग्न करें, घटक पर राइट क्लिक करें और "लोड प्लेयर" चुनें।

अधिक जटिल तर्क के लिए आप अमूर्त आधार वर्गों और एक बेहतर वास्तुकला के लिए इंटरफेस के साथ विरासत का परिचय कर सकते हैं।



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow