(固定)
首先,让我们看看什么是MVP(模型视图演示器)。
为什么需要它? 最简单的答案是建立一个方便且可扩展的体系结构。
值得弄清楚为什么需要将交互分为三个不同的类。 首先,遵循SOLID原则进行职责分离。 其次,与服务器轻松交互以进行数据同步。
让我们仔细看一下示例的职责
PlayerView.cs-特别表示MonoBehaviour类
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; } }
那就是整个模式。
现在让我们看看为什么需要所有这些。
我们将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) } }
好了,现在在游戏开始时,我们将创建一个Player。 但是接下来呢?
实际上,这是一个幻想机制。 好吧,例如,让我们通过添加运行状况来扩展Player模型。
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
PlayerView.cs
public class PlayerView : MonoBehaviour { public void Changehealth(float health) {
因此,我们得到了一个非常方便的体系结构来创建一个单元(或任何其他对象),可以通过任何机制对其进行扩展。 需要法力值吗? 还是运动? 将浮动法力,Vector3位置添加到模型。
结论应该是什么? 请勿因简单的错误计算而干扰View数据(MonoBehaviour)。
在我们的案例中,演示者位于PlayerView和PlayerModel的上方,并监视那里是否有更改并响应更改。 同时,PlayerController也可以监视视图事件,例如碰撞或触发器。