效果预览
项目分享
https://github.com/Claymoreno1/MVC_UGUI
顺便分享一个网站爱给网,里面大多数资源都可以免费下载
什么是MVC
MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。
说白了就是把模型、视图、控制分开,得到较高的可维护性和可复用性
如何应用到Unity当中
https://blog.csdn.net/yupu56/article/details/53728489
这位博主提到
”底部的控制、逻辑用什么实现好呢?方式很多,至少MVC框架模式是一个选择。而在使用MVC时,我个人认为模块内小规模使用MVC更合理,模块内的数据、控制、界面关系比较紧密,模块之间提供合理的接口进行跳转即可(不排除模块间消息沟通)。“
游戏是一个复杂的系统,局部MVC使用是非常好的选择,比如UI、AI、主角状态机,可能有时应用起来会走样,但是无论是MVC还是其他框架,目的都是分离代码逻辑,提高可维护性,目的达到即可。
项目分析
项目结构
- ItemModel 属于Model层,定义了技能的结构,存储技能
- ItemView 属于View层,控制技能面板的显示效果
- MoveWithMouse 属于View层,拖拽时让图标随着鼠标移动
- ItemControl 属于Controller层,实现了技能的交换
- DragEvent 属于Controller层,触发拖拽操作,调用ItemControl
以上是技能界面涉及到的所有脚本及其功能
- AbilityView 属于View层,主界面技能栏的显示效果
- OpenCloseBox 属于控制层,打开关闭技能界面以及刷新主界面的技能栏(但并没有对数据进行更改,只是用来控制显示层)
这两个脚本是用来显示刷新主界面技能栏与打开关闭技能界面用的(数据来自于ItemModel,MVC的优点已经有些许体现)
核心思路
给每一个格子一个ID,用来判断技能交换
交换核心函数
public static void SwapItem(int gridID)
{
ItemModel.Item temp = pickedItem;
if (gridID >= ItemView.row * ItemView.col)
{
pickedItem = ItemModel.ability[gridID - ItemView.row * ItemView.col];
ItemModel.ability[gridID - ItemView.row * ItemView.col] = temp;
}
else
{
pickedItem = ItemModel.items[gridID];
ItemModel.items[gridID] = temp;
}
GameObject.Find("Bag").GetComponent<ItemView>().ShowItems();
}
通过接口IBeginDragHandler,IDragHandler,IEndDragHandler,添加拖拽函数
在拖拽开始,拖拽中,拖拽结束时调用三次SwapItem
- 第一次时,把物品放在pickedItem中,把原所在格子置为空
- 第二次,交换目标格子与pickedItem的物品
- 第三次,交换物品原所在格子与pickedItem中的物品(三次交换完成后,pickedItem仍然为null,完成了两个格子中技能的交换)
注意点
在拖拽时,被拖拽的物体跟随鼠标移动,被遮挡的对象就接受不到事件了(无法激活Drag相关的三个事件),所以我们需要添加UI事件穿透
引用雨凇MOMO大佬的帖子 http://www.xuanyusong.com/archives/3480
using UnityEngine;
using System.Collections;
public class UIFocus : MonoBehaviour ,ICanvasRaycastFilter
{
public bool IsFocus= false;
public bool IsRaycastLocationValid (Vector2 sp, Camera eventCamera)
{
return IsFocus;
}
}
代码部分
这里只有技能界面涉及到的脚本,完整项目在文章开头提供了下载
- Model层
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ItemModel : MonoBehaviour
{
public class Item
{
public string name;
public Sprite img;
public Item(string name,Sprite img)
{
this.name = name;
this.img = img;
}
}
public static List<Item> items;
public static List<Item> ability;
public int size;//物品总数量,实际应在数据库中检索
Sprite[] sprites;