Unity MVC实现背包系统(1)

Source

本章节带领大家使用mvc来实现一个背包系统。

那么先给大家科普一下mvc这个概念,m指的是Model(模型数据层),v指的是View(视图层),c指的是controller(逻辑层)。将一个功能分解成三部分,m层负责数据处理,v层则负责显示,而c负责功能逻辑。

先给大家看一下背包系统的伪代码。


public class BagData : MonoBehaviour
{
    
      
    BagCtrl ctrl;
    Dictionary<ulong, Item> items;  //存储背包中所有物品
    public Item[] GetItems()
    {
    
      
        //返回背包中所有物品
    }

    public void AddItem()
    {
    
      
        //增加物品
    }

    public void DelItem()
    {
    
      
        //删除物品
    }

    public void UpdateItem()
    {
    
      
        //更新物品
    }

    // Start is called before the first frame update
    void Start()
    {
    
      
        items = new Dictionary<ulong, Item>();
    }

    // Update is called once per frame
    void Update()
    {
    
      
        
    }
}

这个是我们的数据层,向外提供增删查改的相关方法,此处的增删查改并不是固定的,根据游戏的相关需求给外面提供处理数据的方法。所以这里只负责处理数据。

public class BagCtrl : MonoBehaviour
{
    
      
    BagView view;
    BagData data;

    public Item[] GetItems()
    {
    
      
        return data.GetItems();
    }

    public void AddItem()
    {
    
      
        data.AddItem();
    }

    public void DelItem()
    {
    
      
        data.DelItem();
    }

    public void UpdateItem()
    {
    
      
        data.UpdateItem();
    }

    // Start is called before the first frame update
    void Start()
    {
    
      
        
    }

    // Update is called once per frame
    void Update()
    {
    
      
        
    }
}

此处是逻辑层,我们现在创建一些方法提供给view层调用,因为view并无法直接调用数据层,ctrl逻辑层相当于视图层和数据层的中介,所以view层与数据层的调用都要通过ctrl来进行交互。

public class BagView : MonoBehaviour
{
    
      

    BagCtrl ctrl;
    // Start is called before the first frame update
    void Start()
    {
    
      
        Item[] items = ctrl.GetItems();
        //根据从逻辑层拿到的物品信息来显示到ui上
    }

    // Update is called once per frame
    void Update()
    {
    
      
        
    }
}

那么这样,视图层就拿到了背包中所有的物品信息,然后可以展示在UI上了,那么我们还需要根据玩家的输入,比如说使用物品,或者丢弃物品等等操作去处理数据。


public class BagView : MonoBehaviour
{
    
      

    BagCtrl ctrl;
    Button btn_use;
    Button btn_discard;

    // Start is called before the first frame update
    void Start()
    {
    
      
        Item[] items = ctrl.GetItems();
        //根据从逻辑层拿到的物品信息来显示到ui上
        btn_use.onClick.AddListener(() =>
        {
    
      
            ctrl.UseItem();
        });
        btn_discard.onClick.AddListener(() =>
        {
    
      
            ctrl.Discard();
        });
    }

    // Update is called once per frame
    void Update()
    {
    
      
        
    }
}

所以我们应该在视图层添加一些比如使用按钮,添加按钮,当玩家点击使用按钮,调用逻辑层的使用物品方法,当玩家点击丢弃,则调用丢弃物品方法,而使用物品和丢弃物品这些具体的逻辑则交给逻辑层去处理。

public class BagCtrl : MonoBehaviour
{
    
      
    BagView view;
    BagData data;

    public Item[] GetItems()
    {
    
      
        return data.GetItems();
    }

    public void AddItem()
    {
    
      
        data.AddItem();
    }

    public void DelItem()
    {
    
      
        data.DelItem();
    }

    public void UpdateItem()
    {
    
      
        data.UpdateItem();
    }

    public void UseItem()
    {
    
      
        //使用物品使用效果

        //删除该物品或减少该物品数量
        data.DelItem();
    }

    public void Discard()
    {
    
      
        //删除该物品或减少该物品数量
        data.DelItem();
    }

    // Start is called before the first frame update
    void Start()
    {
    
      
        
    }

    // Update is called once per frame
    void Update()
    {
    
      
        
    }
}

使用物品实际上就是对数据层进行删除操作并执行物品具体效果啦,那么这个就是mvc 的背包伪代码,每个脚本都负责自己所负责的事情,这样逻辑就很清晰了。

最后要给大家解释的一点就是,mvc他并不是什么固定的代码架构,而是一种思想,我常常听见有人说游戏开发中其实并不适合使用mvc,适不适合这个见仁见智,像我们的网络游戏,客户端就是处理显示上的东西,而服务端就是处理逻辑和数据的,客户端就是根据服务端所传递过来的数据进行显示,并将玩家的操作反馈给服务端然后进行数据和逻辑的处理,这本质上就是一种mvc的思想。

我们这里是每层一个脚本,但是这并不是固定的,本质上只是要分离视图和数据和逻辑层,至于如何分离这个视情况而定。

引擎猫QQ交流群:690504410

图片

                         长按关注公众号,获取更多内容