Unity-背包系统与Json文本解析
1.简单背包系统设计思路
物品类Item:包含物品的所有属性
Json信息存储文本:根据物品类的属性录入数据
储物总控制类InventoryManager:解析Json文本获取物品信息,并根据物品id获取物品
格子类Slot:对将进入背包格子的物品进行设置
物品UI类ItemUI:设置格子中物品UI显示
格子管理类Knapsack:找空格子,并进行存储
设计思路:设置物品属性,根据设定的物品编写Json文本文件,设定一个ItemList集合,通过Json解析工具,解析Json文本,并将其存入ItemList,通过ItemList中已添加的Item的id判断物品,并存入背包中的空格子中(需找到空格子),在空格子中添加代表物品的UI图片。
2.具体代码实现
Item(此处简单设置两个物品属性id与存放路径)
using UnityEngine;public class Item
{public int ID {get;set;}public string Sprite { get; set; } public Item( int id,string sprite){this.ID = id;this.Sprite = sprite;}
}
Json文本文件(可在记事本中编写后将后缀改为.json再导入unity中,放在Resources文件夹下,方便读取,物品UI也同理)
[{"id": 1,"sprite": "Picture/fork"},{"id": 2,"sprite": "Picture/cake"},{"id": 3,"sprite": "Picture/paper"},{"id": 4,"sprite": "Picture/match"},{"id": 5,"sprite": "Picture/key"}
]
Json解析工具,可在Asset Store中下载,导入工程
在场景添加空物体,并挂载脚本InventoryManager
using System.Collections.Generic;
using UnityEngine;public class InventoryManager : MonoBehaviour
{#region 单例模式private static InventoryManager _instance;public static InventoryManager Instance{get{if(_instance==null){_instance = GameObject.Find("InventoryManager").GetComponent<InventoryManager>();} return _instance; }}#endregionprivate List<Item> itemList;private void Start(){ParseItemJson();}/// <summary>/// 解析物品信息 /// </summary>void ParseItemJson(){itemList = new List<Item>();TextAsset itemText= Resources.Load<TextAsset>("Item");string itemsJson = itemText.text;JSONObject j = new JSONObject(itemsJson);foreach (JSONObject temp in j.list){Item item = null;int id = (int)(temp["id"].n);//得到Json中物品id的值string sprite = temp["sprite"].str;//得到Json中的物品路径item = new Item(id, sprite);itemList.Add(item);}}public Item GetItemById(int id)//通过id获取物品{foreach (Item item in itemList){if(item.ID==id){return item;}}return null;}
}
在背包的格子中添加Slot脚本,并给ItemPerfab添加以创建好的UI预制体
using UnityEngine;public class Slot : MonoBehaviour
{public GameObject itemPrefab;public void TheStoreItem(Item item){GameObject itemGameObject = Instantiate(itemPrefab) as GameObject;itemGameObject.transform.SetParent(this.transform);itemGameObject.transform.localPosition = Vector3.zero;itemGameObject.GetComponent<ItemUI>().SetItem(item);}
}
给UI预制体添加脚本ItemUI并给itemImage赋值
using UnityEngine;
using UnityEngine.UI;
public class ItemUI : MonoBehaviour
{public Image itemImage;public Item Item {get;set;}public void SetItem(Item item){this.Item = item;itemImage.sprite = Resources.Load<Sprite>(item.Sprite);}
}
给背包添加Knapsack脚本
using UnityEngine;public class Knapsack : MonoBehaviour
{private Slot[] slotList;private static Knapsack _instance;public static Knapsack Instance{get{if(_instance==null) { _instance = GameObject.Find("KnapsackPanel").GetComponent<Knapsack>();}return _instance;}}void Start(){slotList = GetComponentsInChildren<Slot>();//得到所有含有Slot组件的子物体 }public bool StoreItem(int id){Item item = InventoryManager.Instance.GetItemById(id);return StoreItem(item);}public bool StoreItem(Item item){if(item==null){Debug.LogWarning("要存储的物品的ID不存在");return false;}else{Slot slot = FindEmptySlot();if(slot==null){Debug.LogWarning("没有空的物品槽");return false;}else{slot.TheStoreItem(item);//存储物品到空槽}return true;}}private Slot FindEmptySlot()//找空格子{foreach (Slot slot in slotList){if(slot.transform.childCount==0){return slot;}}return null;}
}
至此简单的背包管理业务逻辑(无拖拽,同物品累计添加功能)就完成了,最后就可以根据实际情况(鼠标点击获取物品,按键获取物品,完成任务获取物品)调用Knapsack中的StoreItem(int id)函数,根据id来往背包中的空格子进行物品的添加了。
Unity-背包系统与Json文本解析相关推荐
- C语言实现json文本解析
C语言实现json文本解析 背景 总体方法 实现源码 相关资料 背景 项目中,有时需要根据外部输入条件,进行程序的灵活切换,运用JSON文件解析,能高效的替换指令行输入,且直观易懂. 总体方法 JSO ...
- Android json数据解析及简单例子
JSON的定义: 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性.业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语言的支持),从而可以在不同平台间进行数据 ...
- Android开发--使用实体类解析JSON文本
Android开发–使用实体类解析JSON文本 在Android开发过程中,涉及到了API的调用的时候,会返回特定的数据,两个主流返回的数据格式是JSON形式和XML形式.但是相对于XML,JSON数 ...
- 解析json文本并使用handler完成三个控件文本内容的切换
Demo需求: 三个控件展示三个关键词,在资源文件获取文本,每隔5秒切换下一词,关键词展示到最后再重头开始 开发工具:Android studio 布局: <?xml version=" ...
- Unity数据持久化-Json
文章目录 JSON概念: JSON结构: JSON优势: 与JavaScript的关系: Unity方法: 使用JsonUtility Json存储 Json加载: 注意事项: 完整代码参考: 使用L ...
- spark中读取json_【spark】文件读写和JSON数据解析
1.读文件 通过 sc.textFile("file://")方法来读取文件到rdd中. val lines = sc.textFile("file://")/ ...
- JSON 数据格式解析(转)
JSON 即 JavaScript Object Natation,它是一种轻量级的数据交换格式,非常适合于服务器与 JavaScript 的交互.本文将快速讲解 JSON 格式,并通过代码示例演示如 ...
- Json字符串解析原理、超大json对象的解析
概述 附上完整的代码: https://files.cnblogs.com/files/xcr1234/json.rar 一个类实现json解析核心代码(ObjectParser),其他的类都是工具类 ...
- 将html代码确析成json数据格式,JSON字符串解析成JSON数据格式
在JS中将JSON的字符串解析成JSON数据格式,一般有两种方式: 1.一种为使用eval()函数. 2. 使用Function对象来进行返回解析. 使用eval函数来解析,并且使用jquery的ea ...
- JSON数据格式解析库(cJSON、Jansson)的使用在STM32上移植和使用
json | json-c使用入门 这篇讲的也不错,抽空看下(网络传输json数据) https://www.bilibili.com/video/av669454528?p=3&spm_id ...
最新文章
- Owncloud-X安装配置
- 聊聊spring cloud gateway的GlobalFilter
- 关于webrtc视频会议的解决方案
- 【Android 应用开发】Android 返回堆栈管理 ( 默认启动模式 | 栈顶复用启动模式 | 栈内复用启动模式 | 单实例启动模式 | CLEAR_TOP 标识 )
- 生成对抗网络(GAN)的统计推断
- 林子大了,什么鸟都有----.NET运用String的十八层境界
- 【POI1999codevs3634】积水,关于sunshine爷的NOIP(suan)水(ge)题(pi)赛
- Linux 内核简介
- hdu5651 xiaoxin juju needs help(逆元)
- web前端学习(总结/心得)
- JSONP 的工作原理
- 前端提高篇(三十九)CSS进阶7:columns多列布局
- python计算金星凌日
- 无法在此iPhone激活面容ID怎么办?
- python怎么换行输入print_python中print换行的方法
- ICS文件说明和创建(以Outlook为例)
- 苹果电脑 开机密码 忘记了, 黑苹果系统
- BT源代码学习心得(二):程序运行参数的获取 -- 转贴自 wolfenstein (NeverSayNever)
- 华为k662c的虚拟服务器,华为k662c路由器怎么设置 | 华为k662c路由器设置_什么值得买...
- 打印机服务无法启动 错误代码1068