【Unity】基于MVC模式的背包系统 UGUI实现

前言

本文基于MVC模式,用UGUI初步实现了背包系统。

Control层包含了点击和拖拽两种逻辑。

博文首发:

下载地址:https://github.com/duzixi/InventorySystem

一、工程准备(详见工程文件)

场景中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();}// 当物品按钮被点下时(点击触发模式)public void Drop() {SwapItem(gridID);}// 当物品放在格子中时(拖拽触发模式)public void OnDrop (PointerEventData eventData) {SwapItem(gridID);}}一个有信念者所开发出的力量,大于99个只有兴趣者。

【Unity】基于MVC模式的背包系统 UGUI实现

相关文章:

你感兴趣的文章:

标签云: