एकता में एमवीपी या जीवन को कैसे सरल बनाया जाए

(सही)


सबसे पहले, आइए देखें कि एमवीपी (मॉडल व्यू प्रस्तुतकर्ता) क्या है।


इसकी आवश्यकता क्यों है? सबसे सरल उत्तर एक सुविधाजनक और एक्स्टेंसिबल वास्तुकला का निर्माण करना है।


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


आइए उदाहरण की जिम्मेदारियों पर करीब से नज़र डालें


PlayerView.cs - विशेष रूप से मोनोबीहैर वर्ग का प्रतिनिधित्व करता है


using UnityEngine; public class PlayerView : MonoBehaviour { } 

PlayerModel.cs - एक डेटा वर्ग का प्रतिनिधित्व करता है


 public class PlayerModel { } 

Presenter.cs - मॉडल और दृश्य के बीच एक संपर्क वर्ग का प्रतिनिधित्व करता है


 public class PlayerPresenter { private PlayerView _playerView; private PlayerModel _playerModel public PlayerController(PlayerView view, PlayerModel model) { _playerView = view; _playerModel = model; } } 

वह पूरा पैटर्न है।


अब देखते हैं कि यह सब क्यों जरूरी है।


हम अपने Prefab खिलाड़ी के लिए एक घटक के रूप में PlayerView.cs जोड़ते हैं।


शेष कक्षाएं कुछ नियंत्रण वर्ग में बनाई जाती हैं। उदाहरण के लिए, एक नियंत्रण वर्ग बनाएं।


मंच पर एक खाली वस्तु बनाएं और GameManager घटक को लटकाएं


GameManager.cs


 public class GameManager : MonoBehaviour { public GameObject _playerPrefab; private PlayerPresenter _playerController; private PlayerModel _playerModel; public void Start(){ _playerModel = new PlayerModel(); var playerObject = Instantiate(_playerPrefab, Vector3.zero,Quaternion.identity); var playerView = playerObject.GetComponent<Playerview>(); _playerPresenter = new PlayerPresenter(playerView, _playermodel) } } 

खैर, अब खेल की शुरुआत में, हम एक प्लेयर बनाएंगे। लेकिन आगे क्या है?


वास्तव में, यह एक काल्पनिक मैकेनिक है। ठीक है, उदाहरण के लिए, चलो स्वास्थ्य को जोड़कर प्लेयर मॉडल का विस्तार करें।


PlayerModel.cs


 public class PlayerModel { public event Action Death; public event Action<float> ChangedHealth; private float _maxHp = 100; private float _currentHp; public PlayerModel(){ _currentHp = maxHp; } public void SetNewHealth(float damage) { _currentHp -= damage; if(_currentHp > 0) ChangedHealth?.Invoke(_currentHp); else Death?.Invoke(); } } 

अब हमारे खिलाड़ी के पास स्वास्थ्य और परिवर्तन और मृत्यु के लिए दो कार्यक्रम हैं। यही है, मॉडल - सभी खिलाड़ी के डेटा की एकाग्रता का प्रतिनिधित्व करता है और किसी भी डेटा में बदलाव होने पर क्या करना है, यह तय करता है।


अब Playercontroller का विस्तार करें ताकि हम डेटा के साथ बातचीत कर सकें


PlayerPresenter.cs


 public class PlayerPresenter { private PlayerView _playerView; private PlayerModel _playerModel public PlayerPresenter(PlayerView view, PlayerModel model) { _playerView = view; _playerModel = model; } public void Enable() { _playerModel.Death += Death; _playerModel.ChangedHealth += ChangeHealth; } private void ChangeHealth(float health){ _playerView.Changehealth(health); } private void Death(){ _playerView.Death(); Disable(); } public void Disable() { _playerModel.Death -= Death; _playerModel.ChangedHealth -= ChangeHealth; } } 

इसलिए, आइए विस्तार करें और प्लेयर व्यू


PlayerView.cs


 public class PlayerView : MonoBehaviour { public void Changehealth(float health) { //      //    slideBar   Text } public void Death() { //     } } 

इसलिए, हमें एक इकाई (या किसी अन्य वस्तु) बनाने के लिए एक अत्यंत सुविधाजनक वास्तुकला मिली, जिसे किसी भी यांत्रिकी द्वारा विस्तारित किया जा सकता है। मन की आवश्यकता है? या आंदोलन? मॉडल में फ्लोट मन, वेक्टर 3 स्थिति जोड़ें।


निष्कर्ष क्या होना चाहिए? सरल डेटा के साथ दृश्य डेटा (MonoBehaviour) के साथ हस्तक्षेप न करें।
हमारे मामले में प्रस्तुतकर्ता PlayerView और PlayerModel के स्तर से ऊपर स्थित है और मॉनिटर करता है कि क्या कुछ वहां बदल रहा है और परिवर्तनों के प्रति प्रतिक्रिया करता है। उसी समय, प्लेयरकंट्रोलर भी दृश्य घटनाओं की निगरानी कर सकता है, जैसे टकराव या ट्रिगर।

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


All Articles