MVP in Unity oder wie man das Leben vereinfacht

(Behoben)


Lassen Sie uns zunÀchst sehen, was MVP (Model View Presenter) ist.


Warum wird es gebraucht? Die einfachste Antwort ist der Aufbau einer praktischen und erweiterbaren Architektur.


Es lohnt sich herauszufinden, warum Sie die Interaktion in drei verschiedene Klassen aufteilen mĂŒssen. Erstens die Aufgabentrennung nach den GrundsĂ€tzen von SOLID. Zweitens fĂŒr die einfache Interaktion mit Servern fĂŒr die Datensynchronisation.


Sehen wir uns die Verantwortlichkeiten des Beispiels genauer an


PlayerView.cs - reprÀsentiert insbesondere die MonoBehaviour-Klasse


using UnityEngine; public class PlayerView : MonoBehaviour { } 

PlayerModel.cs - Stellt eine Datenklasse dar


 public class PlayerModel { } 

Presenter.cs - Stellt eine KonnektivitÀtsklasse zwischen Modell und Ansicht dar


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

Das ist das ganze Muster.


Nun wollen wir sehen, warum dies alles benötigt wird.


Wir fĂŒgen unserem Prefab- Player PlayerView.cs als Komponente hinzu.


Die restlichen Klassen werden in einer Kontrollklasse erstellt. Erstellen Sie beispielsweise eine Kontrollklasse.


Erstellen Sie ein leeres Objekt auf der BĂŒhne und hĂ€ngen Sie die GameManager-Komponente auf


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

Nun, zu Beginn des Spiels werden wir einen Spieler erstellen. Aber wie geht es weiter?


TatsĂ€chlich ist dies ein Fantasiemechaniker. Lassen Sie uns zum Beispiel das Player-Modell erweitern, indem Sie die IntegritĂ€t hinzufĂŒgen.


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

Jetzt hat unser Spieler Gesundheit und zwei Ereignisse, um Gesundheit und Tod zu Ă€ndern. Das heißt, Modell - stellt die Konzentration aller Daten des Players dar und entscheidet, was zu tun ist, wenn sich Daten Ă€ndern.


Erweitern Sie nun den Playercontroller, damit wir mit den Daten interagieren können


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

Daher lassen Sie uns und PlayerView erweitern


PlayerView.cs


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

Daher haben wir eine Ă€ußerst praktische Architektur zum Erstellen einer Einheit (oder eines anderen Objekts), die von einer beliebigen Mechanik erweitert werden kann. Benötigen Sie Mana? Oder Bewegung? Addiere Float Mana, Vector3 Position zum Modell.


Was soll die Schlussfolgerung sein? BeeintrÀchtigen Sie View-Daten (MonoBehaviour) nicht durch einfache FehleinschÀtzungen.
In unserem Fall befindet sich der Presenter ĂŒber der Ebene von PlayerView und PlayerModel und ĂŒberwacht, ob sich dort etwas Ă€ndert und reagiert auf Änderungen. Gleichzeitig kann PlayerController auch Anzeigeereignisse wie Kollisionen oder Auslöser ĂŒberwachen.

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


All Articles