【Unity】基于MVC模式的背包系统 UGUI实现
前言
本文基于MVC模式,用UGUI初步实现了背包系统。
Control层包括了点击和拖拽两种逻辑。
博文首发:http://blog.csdn.net/duzixi
下载地址:https://github.com/duzixi/InventorySystem
一、project准备(详见project文件)
场景中Canvas上的对象:
- Bag:用于显示背包内容
- PickedItem:用于显示拾取道具的图片
资源中的预设体:
- Item:生成背包的格子
二、源码
Model 层
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using System.Collections.Generic;
/// <summary>
/// 脚本功能:MVC模式——Model层。定义物品结构,保存物品数据
/// 加入对象:Bag 背包(Canvas下的空对象)
/// 版权声明:Copyright (c) 2015 duzixi.com All Rights Reserved
/// 创建日期:2015.5.8
/// 知识要点:
/// 1. MVC
/// 2. 自己定义类
/// 3. 类的嵌套
/// </summary>
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 int size = 16;
Sprite[] sprites; void Awake() // 数据初始化
{
items = new List<Item>(); // 初始化List<Item>
sprites = new Sprite[size]; // 依据行列值初始化物品列表
for (int i = 0; i < BagView.row; i++) {
for (int j = 0; j < BagView.col; j++) {
items.Add(new Item("", null));
}
} // 【注意】实际开发中下面部分应由数据库取代
for (int i = 0; i < size; i++) {
string name = i < 9 ? "0" + (i + 1) : "" + (i + 1);
sprites[i] = Resources.Load(name, typeof(Sprite)) as Sprite;
items[i] = new Item(" ", sprites[i]);
}
}
}
View 层
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
/// <summary>
/// 脚本功能:MVC模式 —— View视图,控制背包的显示方式
/// 加入对象:Bag 背包 (Canvas下的空对象)
/// 版权声明:Copyright (c) 2015 duzixi.com All Rights Reserved
/// 创建时间:2015.05.08
/// 改动记录:2015.05.18 加入编号
/// 改动记录:2015.07.03 封装显示物品行子方法
/// 知识要点:
/// 1. MVC
/// 2. UGUI
/// </summary>
public class BagView : MonoBehaviour {
// 背包规格
public static int row = 4; // 行
public static int col = 5; // 列 // 背包格子
public GameObject grid;
float width; // 格子宽度
float height; // 格子高度 // 依据格子预设体获取宽和高
void Awake() {
width = grid.GetComponent<RectTransform>().rect.width;
height = grid.GetComponent<RectTransform>().rect.height;
} // 初始状态:平铺格子。创建背包
void Start () {
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
// 计算ID值(物品列表下标)
int id = j + i * col; // 实例化格子预设,按宽高布局
GameObject itemGrid = Instantiate(grid, transform.position + new Vector3(j * width, -i * height, 0), Quaternion.identity) as GameObject;
// 将实例化的格子对象设置为背包的子对象
itemGrid.transform.SetParent(transform); // 调用自己定义方法:显示某个id的格子内容
ShowItem(itemGrid.transform, id); // 给格子 PickUpDrop 组件编号。拾取放下时用
itemGrid.GetComponent<PickUpDrop>().gridID = id;
}
}
} // 又一次刷新背包显示(物品位置发生变化时)
public void ShowItems() {
for (int i = 0; i < row * col; i++) {
Transform itemGrid = transform.GetChild(i);
ShowItem(itemGrid, i);
}
} // 显示物品行子
private void ShowItem(Transform itemGrid, int id) {
// 显示物品名称
Text txtUGUI = itemGrid.GetComponentInChildren<Text>();
txtUGUI.text = ItemModel.items[id].name; // 获取物品Icon的Image组件
Image imageUGUI = itemGrid.GetChild(0).GetComponent<Image>(); // 假设有物品。就显示图片
if (ItemModel.items[id].img != null) {
imageUGUI.color = Color.white;
} else { // 否则不显示
imageUGUI.color = Color.clear;
}
imageUGUI.sprite = ItemModel.items[id].img;
}
}
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
/// <summary>
/// 脚本功能:让拾取的背包物品随鼠标移动
/// 加入对象:PickedItem 拾取的物品
/// 版权声明:Copyright (c) 2015 duzixi.com All Rights Reserved
/// 创建日期:2015.05.18
/// 改动记录:2015.07.03 加入射线忽略
/// 知识要点:
/// 1. UGUI RectTransform、锚点、中心点
/// 2. 忽略射线接口 ICanvasRaycastFilter
/// </summary> public class MoveWithMouse : MonoBehaviour, ICanvasRaycastFilter {
RectTransform rect; // 获取UGUI定位组件 Image icon; // 显示当前拾取物品的图标 void Awake() {
rect = GetComponent<RectTransform>();
// 【注意】图标对象是第0个子对象
icon = transform.GetChild(0).GetComponent<Image>();
} void Update () {
// 用鼠标位置给图标图片定位
rect.anchoredPosition3D = Input.mousePosition;
// 依据是否有图片确定透明度
if (PickUpDrop.pickedItem.img != null) {
icon.color = Color.white;
} else {
icon.color = Color.clear;
}
icon.sprite = PickUpDrop.pickedItem.img;
} // 忽略鼠标图标上的射线
public bool IsRaycastLocationValid (Vector2 sp, Camera eventCamera) {
return false;
}
}
Control 层
using UnityEngine;
using UnityEngine.EventSystems;
using System.Collections;
/// <summary>
/// 脚本功能:MVC模式 —— Control控制,背包内物品摆放
/// 加入对象:Item 物品行子预设体
/// 版权声明:Copyright (c) 2015 duzixi.com All Rights Reserved
/// 创建日期:2015.05.18 duzixi.com
/// 改动记录:2015.07.03 加入射线忽略
/// 知识要点:
/// 1. UGUI、MVC设计模式
/// </summary>
public class PickUpDrop : MonoBehaviour, IDropHandler {
public int gridID; public static ItemModel.Item pickedItem; // 当前拾取的物品 void Start () {
// 初始化当前拾取物品为空
pickedItem = new ItemModel.Item("", null);
} // 背包核心逻辑:交换
public static void SwapItem(int gridID)
{
// 交换背包中的物品和拾取物品
ItemModel.Item temp = pickedItem;
pickedItem = ItemModel.items[gridID];
ItemModel.items[gridID] = temp; // 刷新背包显示
GameObject.Find("Bag").GetComponent<BagView>().ShowItems();
} // 当物品button被点下时(点击触发模式)
public void Drop() {
SwapItem(gridID);
} // 当物品放在格子中时(拖拽触发模式)
public void OnDrop (PointerEventData eventData) {
SwapItem(gridID);
} }
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using System.Collections;
/// <summary>
/// 脚本功能:MVC模式 —— Control控制。操作逻辑。拖拽事件处理
/// 加入对象:Bag 背包 (Canvas下的空对象)
/// 版权声明:Copyright (c) 2015 duzixi.com All Rights Reserved
/// 创建时间:2015.07.03
/// 知识要点:
/// 1. UnityEngine.EventSystem
/// 2. IBeginDragHandlder, IDragHandler, IEndDragHander
/// </summary>
public class DragEvent : MonoBehaviour,IBeginDragHandler,IDragHandler,IEndDragHandler { int gridID = 0; // 格子编号 void Start() {
gridID = GetComponentInParent<PickUpDrop>().gridID; // 获取格子编号
} // 開始拖拽
public void OnBeginDrag (PointerEventData eventData) {
// 调用交换方法
PickUpDrop.SwapItem(gridID);
} // 拖拽中
public void OnDrag (PointerEventData eventData) {
// 【注意】即使没有不论什么代码处理也要实现该接口。否则拖拽不成功
} // 结束拖拽
public void OnEndDrag (PointerEventData eventData) {
// 调用交换方法
PickUpDrop.SwapItem(gridID);
} }
后语
眼下还有点Bug。拖拽模式下当前物体拖拽会导致物品尾随。
另外屏幕适配还没有搞。
【Unity】基于MVC模式的背包系统 UGUI实现的更多相关文章
- struts1:(Struts重构)构建一个简单的基于MVC模式的JavaWeb
在构建一个简单的基于MVC模式的JavaWeb 中,我们使用了JSP+Servlet+JavaBean构建了一个基于MVC模式的简单登录系统,但在其小结中已经指出,这种模式下的Controller 和 ...
- 构建一个简单的基于MVC模式的JavaWeb
零晨三点半了,刚刚几个兄弟一起出去吼歌,才回来,这应该是我大学第二次去K歌,第一次是大一吧,之后每次兄弟喊我,我都不想去,因为我还是很害怕去KTV,或许是因为那里是我伤心的地方,也或许是因为我在那里失 ...
- Unity之MVC 模式
MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式.这种模式用于应用程序的分层开发. Model(模型) - 模型代表一个存取数据的对象或 JAVA POJO.它 ...
- unity 使用MVC模式
这两天看了下老大的项目,他基本都是用MVC模式,写的很好,在此把我理解的记录下来 Model:实体对象(对应数据库记录的类) View:视图 presenter(controller):业务处理 vi ...
- 基于MVC模式的应用框架之struts
1.struts开发步骤 引入struts的jar包: 在web.xml中引入struts的核心功能,配置struts核心过滤器:(如果项目中用到了其他过滤器,要放在struts过滤器之前,否则会失效 ...
- 基于MVC模式的数据库综合练习
一.准备 没什么好说的,直接上代码.... 下面是web.xml <servlet> <servlet-name>list_user</servlet-name> ...
- 基于MVC模式开发的后台框架
1.ThinkCMF 2.NFine快速开发平台 3.力软快速开发框架 如有好的开发框架希望可以一起交流
- 基于 Dojo toolkit 实现 web2.0 的 MVC 模式
前言 MVC 模式是设计模式中的经典模式,它可以有效的分离数据层,展示层,和业务逻辑层.Web2.0 技术由于其良好的用户体验被广泛应用于 WEB 应用的展示层.但是在传统的 web 开发中,展示层的 ...
- 传统的MVC模式
对于MVC模式,我们可以将可视化UI呈现,UI处理逻辑和业务逻辑分别定义在View,Controller,和Model中. 可视化UI呈现->View UI处理逻辑->Controller ...
随机推荐
- [转载]Java 反射机制(包括组成、结构、示例说明等内容)
FROM:http://www.cnblogs.com/skywang12345/p/3345205.html 第1部分 Java 反射机制介绍 Java 反射机制.通俗来讲呢,就是在运行状态中,我们 ...
- mapreduce实现搜索引擎简单的倒排索引
使用hadoop版本为2.2.0 倒排索引简单的可以理解为全文检索某个词 例如:在a.txt 和b.txt两篇文章分别中查找统计hello这个单词出现的次数,出现次数越多,和关键词的吻合度就越高 现有 ...
- 转: ios学习入门进阶
著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:利炳根链接:https://www.zhihu.com/question/19627420/answer/45962351来源 ...
- 小伙子又乱码了吧-Java字符编码原理总结
前提 配合前面阅读的I/O和NIO的资料,现在总结一下关于字符集和乱码问题的原理和解决方案.参考资料: 码表ASCII Unicode GBK UTF-8 字符编码笔记ASCII,Unicode和UT ...
- iOS 程序进入后台,包含用户上拉快捷菜单导致程序失去活跃的研究
今日在使用某App时候,突然发现上拉菜单.程序视频扔在播放,咦!引起了我的兴趣. 首先,列出两个方法, 第一个方法是AppDelegate的代理.当程序进入后台时候调用 - (void)applica ...
- java IO,bufferedReader类
1,掌握bufferedreader类作用 2,掌握键盘输入的基本格式. Buffer:表示缓冲区,之前的StringBuffer,缓冲区中的内容可以更改,可以提高效率. 如果要想接收任意长度的数据, ...
- 今日头条&58转转笔试
昨天参加今日头条和58转转的笔试,因为时间上有冲突,所以主要选择参加头条的笔试. 先说头条: 头条的题型: 一道改错题 三道编程题 一道设计题 感受: 做题目的的时候还是有点紧张的,因为突然遇到题目需 ...
- C++语言基础(12)-虚函数
一.虚函数使用的注意事项 1.只需要在虚函数的声明处加上 virtual 关键字,函数定义处可以加也可以不加. 2.为了方便,你可以只将基类中的函数声明为虚函数,这样所有子类中具有遮蔽(覆盖)关系的同 ...
- C语言基础(19)-结构体,联合体,枚举和typedef
一.结构体 1.1 结构体struct定义及初始化 #include <stdio.h> // 这个头文件在系统目录下 #include <stdlib.h> // 使用了sy ...
- Django的模型
Django的模型类相当于数据库的一张表,模型类的实例对象相当于表中的一行内容 Django提供了多种创建对象的方式,常用如下: 通过create()方法 1.Person.objects.creat ...