(Tetap)
Pertama, mari kita lihat apa itu MVP (Model View Presenter).
Mengapa itu dibutuhkan? Jawaban paling sederhana adalah membangun arsitektur yang nyaman dan dapat diperluas.
Anda perlu mencari tahu mengapa Anda perlu membagi interaksi menjadi tiga kelas yang berbeda. Pertama, pemisahan tugas, mengikuti prinsip-prinsip SOLID. Kedua, untuk interaksi yang mudah dengan server untuk sinkronisasi data.
Mari kita lihat lebih dekat tanggung jawab dari contoh ini
PlayerView.cs - mewakili khususnya kelas MonoBehaviour
using UnityEngine; public class PlayerView : MonoBehaviour { }
PlayerModel.cs - Merupakan kelas data
public class PlayerModel { }
Presenter.cs - mewakili kelas konektivitas antara model dan tampilan
public class PlayerPresenter { private PlayerView _playerView; private PlayerModel _playerModel public PlayerController(PlayerView view, PlayerModel model) { _playerView = view; _playerModel = model; } }
Itulah keseluruhan pola.
Sekarang mari kita lihat mengapa semua ini diperlukan.
Kami menambahkan PlayerView.cs sebagai komponen ke pemutar Prefab kami.
Kelas yang tersisa dibuat di beberapa kelas kontrol. Misalnya, buat kelas kontrol.
Buat objek kosong di atas panggung dan gantung komponen 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) } }
Nah, sekarang di awal permainan, kita akan membuat Player. Tapi selanjutnya apa?
Sebenarnya, ini adalah mekanik fantasi. Sebagai contoh, mari kita perluas model Player dengan menambahkan kesehatan.
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(); } }
Sekarang pemain kami memiliki Kesehatan dan dua peristiwa untuk mengubah kesehatan dan kematian. Yaitu, Model - mewakili konsentrasi semua data pemain dan memutuskan apa yang harus dilakukan ketika ada data yang berubah.
Sekarang perluas Playercontroller agar kita dapat berinteraksi dengan data
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; } }
Karena itu, mari kita perluas dan PlayerView
PlayerView.cs
public class PlayerView : MonoBehaviour { public void Changehealth(float health) {
Oleh karena itu, kami mendapatkan arsitektur yang sangat nyaman untuk membuat unit (atau objek lain), yang dapat diperluas oleh mekanik mana pun. Butuh mana? Atau gerakan? Tambahkan float mana, posisi Vector3 ke model.
Apa kesimpulannya? Jangan mengganggu tampilan data (MonoBehaviour) dengan salah perhitungan sederhana.
Presenter dalam kasus kami terletak di atas level PlayerView dan PlayerModel dan memantau apakah ada sesuatu yang berubah di sana dan merespons perubahan. Pada saat yang sama, PlayerController juga dapat memonitor acara tampilan, seperti tabrakan atau pemicu.