MVC:—Model(数据层), View(视图层), Controller(控制层)
Model - 数据层
数据中心,位于整个框架的最底层
功能:1,存放相关的数据。2,修改数据。3,查数据,4,通过事件通知视图层改变
View - 视图层
视图层就是给玩家展示的,(ui,场景内的一些表现),位于整个框架的最顶端。
注意:视图层对model只有读取权限,而没有写入权限
功能:
1,负责管理自己的面板
2,负责数据在试图层的刷新
3,实现用户界面的相关操作
Controller - 控制层
整个框架唯一一个对Model层拥有读写权限的逻辑层
功能:
1,判断玩家操作是否符合条件
2,根据逻辑判断对model层的进行改变
3,通知view层进行刷新数据
使用MVC的目的?
1,工程结构比较清晰
2,代码的可读性更高,扩展性高
3,提高工作效率
单例:在整个程序运行过程中只有一个实例
未继承mono的类:
1,首先得保证有一个对象,定义一个私有的静态的类对象
2,创建一个静态属性或者静态方法以供外部调用,属性和方法返回的就是第一步定义的私有静态类对象,方法和属性内部必须保证类对象不能时null,null情况进行实例化
3,构造函数私有化,保证外部不能对其进行实例化,从而保证整个程序只有一个实例
继承了mono的类,继承了mono的类不能new
1,定一个私有的静态类对象,
2,创建一个静态属性或者静态方法以供外部调用,不能保证对象一定不是null,作用一是供外部调动对象,防止外部程序对其进行修改
3,在awake方法里对对象进行复制,对象 = this
注意:1,对象赋值一定要放在awake里,对象的使用最好在awake之后,保证外部使用时不为null
2,mono的类不能保证一定只有一个物体挂载,所以使用mono的单例时一定要确定整个场景中只有一个物体挂载了这个脚本时才能用单例
委托和事件
什么是委托?
一种存储方法的的类型,存储一系列具有相同签发和返回值类型的方法的地址,当调用委托的时候,是该包含的所有的方法全部被执行
使用委托什么好处?
1,方法可以当作参数进行传递
2,使用委托可以将多个方法绑定到同一个委托变量上
什么是事件?
声明一个事件就是声明了一个封装的委托。
委托和事件:委托和事件都可以在外部进行赋值,但是事件只能自己本身调用,委托外部和本身都可以调用
Int :整型,正负都有
Uint:正整数类型
String.Equals()::比较两个字符串是否相等
注意:
1.使用委托或者事件,当调用委托或事件时,需要进行判空,否者未注册委托或事件时会出现报错
2.如果视图层需要在界面中销毁,这时需要把该界面注册的委托或事件取消掉
总结:model层和view层时通过事件进行交互的,view对model层只有读的权限,没有写的权限。
当model层的数据改变时,调用事件通知相关的view更新界面。
不是一个model只对应一个view,当view需要显示model数据时,只需要view注册model的事件,当view不再需要显示model的数据时,需要取消事件。
设计一个背包程序:
1.首先设计数据层:
ItemModel:每一个物品的数据类
BagModel:背包里的所有物品
2.然后设计一个控制层
BagController:处理背包里的物品的数据
3.最后设计视图层
BagView:处理整个背包的视图
ItemView:处理背包的物品物品
ItemModel类
ID :物品的唯一标识
Name:名字
IconPath:图片地址
Index:放在哪一个格子
Atk, type…..
BagModel类
Instance:单例
List<ItemModel>:存储背包中的元素
BagController类,不需要继承mono
_Instante: 单例
Event:改变数据通知相关更新
ChangeItem(ID, Index):物品移动格子
ClearUpItem():整理的功能
BagView类
Array<BagGridView>:管理物品的view
Init():初始化
RefreshPanel():更新界面,当数据发生改变的时候
BagGridView
Image:物品的图片
ID:放在格子物品的id
SetImage(IconPath):修改图片
Drag:继承拖拽接口,实现拖拽功能
1.物品拖动。
2.判断拖动是否拖到了另一个格子上
3.如果拖到了另一个格子上,进行数据变化
4.同时bag重新放物品