UNITY->(width*height)style Inventory
项目过后对项目功能进行记录,(width*height)风格背包实现细节,包含对物体的存放,装备,替换,对未知装备的鉴定,物体前缀的获取,项目类型为tcg+rpg,背包的作用主要为游戏中的物品的获取存放,卡牌的获取管理,对可叠加物品的存放,(width*height)的目的为对物品的存放管理,其效果如下
- 基础物品 (width*height)
物品的创建通过ScriptObject进行创建,根据物品类型设计相关的尺寸(width*height),利用deepcopy创建实体存放如背包,项目的物品管理通过一个独立的类
ItemDatabase进行管理,在玩家获取一个新物品(未鉴定),通过一个随机生成类来产生词缀和属性

本项目物品的生成通过deepcopy生成物品并添加进itemdatabse,Itemdatabase的作用对游戏物品资产的管理以及生成,有利于未知装备的生成,在对商品商管理上,添加未知随机的装备可以为游戏的物品提高游戏性
public static ItemClass DeepCopy(ItemClass obj) {
GameObject oj = obj.worldObject;
//ItemClass is item base class
ItemClass i = (ItemClass)Process(obj);
i.worldObject = oj;
return i;
}
static object Process(object obj) {
if(obj==null)
return null;
Type type=obj.GetType();
if(type.IsValueType || type==typeof(string)) {
return obj;
}
else if(type.IsArray) {
Type elementType=Type.GetType(
type.FullName.Replace("[]",string.Empty));
var array=obj as Array;
Array copied=Array.CreateInstance(elementType,array.Length);
for(int i=; i<array.Length; i++) {
copied.SetValue(Process(array.GetValue(i)),i);
}
return Convert.ChangeType(copied,obj.GetType());
}
else if(type.IsClass) {
object toret=Activator.CreateInstance(obj.GetType());
FieldInfo[] fields=type.GetFields(BindingFlags.Public|
BindingFlags.NonPublic|BindingFlags.Instance);
foreach(FieldInfo field in fields) {
object fieldValue=field.GetValue(obj);
if(fieldValue==null)
continue;
field.SetValue(toret, Process(fieldValue));
}
return toret;
}
else
throw new ArgumentException("Unknown type");
}
2.生成slot并将物品存放进slot(width*height)
在物品添加进背包时,根据几个条件进行判断
1.slot是否能填充进去
在物品添加进背包栏,需要检测物品尺寸是否越过背包限制并物品之间是否存在重叠,重叠状态一般在物品编辑器中设置(通常为药水...),当不可叠加物品存在重叠状态中,获取状态颜色并提示状态
//检测边界以及叠加状态
public bool CheckItemFit(ItemClass item, InventorySlot slot, bool skipLastCheck) {
//Run through all the slots that the item occupies
for(int i = ; i < item.height; i++) {
for(int j = ; j < item.width; j++) {
//Check if the slot exists
if(slot.itemStartNumber + inventoryWidth * i + j >= items.Count) {
return false;
}
//Check to see if the first slot is located at the edge of the inventory
for(int k = ; k < item.height; k++) {
if(slot.itemStartNumber + inventoryWidth * k + j != slot.itemStartNumber + inventoryWidth * k) {
if(((slot.itemStartNumber + inventoryWidth * i + j ) % inventoryWidth == ) && item.width != ) {
return false;
}
}
}
//Last check is only used sometimes
//Checks to see if there's already something in the slots
if(!skipLastCheck) {
if(items[slot.itemStartNumber + inventoryWidth * i + j].itemStartNumber != slot.itemStartNumber + inventoryWidth * i + j) {
return false;
}
}
else {
List<int> counter = new List<int>();
for(int l = ; l < item.height; l++) {
for(int m = ; m < item.width; m++) {
if((slot.itemStartNumber + inventoryWidth * (item.height - ) + (item.width - )) < items.Count - && items[slot.itemStartNumber + inventoryWidth * l + m].itemStartNumber != slot.itemStartNumber && items[slot.itemStartNumber + inventoryWidth * l + m].item.itemName != "" && !counter.Contains(items[slot.itemStartNumber + inventoryWidth * l + m].itemStartNumber)) {
counter.Add(items[slot.itemStartNumber + inventoryWidth * l + m].itemStartNumber);
}
}
}
if(counter.Count > ) {
//return false if there's more than one item
return false;
}
else if(counter.Count == ) {
return true;
}
}
}
}
return true;
}
当物品状态为可添加时,添加进slot,根据width*height尺寸进行添加
for(int l = ; l < item.height; l++) {
for(int m = ; m < item.width; m++) {
//First we add the items to the slots the it fills and set their slots to clear
items[i + inventoryWidth * l + m].item = DeepCopy(item);
items[i + inventoryWidth * l + m].itemStartNumber = i;
items[i + inventoryWidth * l + m].GetComponent<Image>().color = Color.clear;
items[i + inventoryWidth * l + m].stacksizeText.gameObject.SetActive(false);
//If it's the first index of the added item
if(items.IndexOf(items[i + inventoryWidth * l + m]) == i) {
SetSlotImageSprite(items[i + inventoryWidth * l + m], item.icon);
items[i + inventoryWidth * l + m].itemFrame.gameObject.SetActive(true);
items[i + inventoryWidth * l + m].itemFrame.GetComponent<CanvasGroup>().interactable = true;
items[i + inventoryWidth * l + m].itemFrame.GetComponent<CanvasGroup>().blocksRaycasts = true;
items[i + inventoryWidth * l + m].GetComponent<CanvasGroup>().blocksRaycasts = true;
items[i + inventoryWidth * l + m].itemFrame.rectTransform.sizeDelta = new Vector2(item.width * slotIconSize, item.height * slotIconSize);
//If the item is stackable
if(item.stackable) {
items[i + inventoryWidth * l + m].stacksizeText.gameObject.SetActive(true);
items[i + inventoryWidth * l + m].stacksizeText.text = item.stackSize.ToString();
}
//The item is unidentified
if(item.unidentified) {
items[i + inventoryWidth * l + m].itemImage.color = Color.red;
items[i + inventoryWidth * l + m].unidentified.gameObject.SetActive(true);
}
}
}
}
2.物品是否存在物品
当物品存在物品时,需要对存在物品的占用尺寸进行判断(int slot=indexof(item)),当slot存在物品时,遍历slot.count 获取空栏位并存放,另外一种情况是当玩家处于dragging状态时,可以对物品进行替换,存放在物品的方式一般为
Items[slot.itemStartNumber + inventoryWidth * l + m].item.variables
UNITY->(width*height)style Inventory的更多相关文章
- offset[Parent/Width/Height/Top/Left] 、 client[Width/Height/Top/Left] 、 Element.getBoundingClientRect()
开篇提示:以下内容都经个人测试,参考API文档总结,但还是不能保证完全正确,若有错误,还请留言指出___________________________________________________ ...
- client/scroll/offset width/height/top/left ---记第一篇博客
client/scroll/offset width/height/top/left (盒模型为contentBox,定位原点是元素左上角边框最外层的交点) clientWidth width+左p ...
- as3:sprite作为容器使用时,最好不要指定width,height
除 TextField 和 Video 对象以外,没有内容的显示对象(如一个空的 Sprite)的高度为 0,即使您尝试将 height 设置为其它值,也是这样. 如果您设置了 height 属性,则 ...
- 正则:img的url,width,height 和 a标签的url以及替换
代码:// 内容:$detail['content'] //img的url,width,height $img = array(); $matches = array(); $regeImg = '/ ...
- ffmpeg按比例缩放--"width / height not divisible by 2" 解决方法
最近在处理视频的时候,有这么一个需求 如果视频的分辨率宽度大于960的话,就把宽度设为960,而高度按其比例进行缩放 如果视频的分辨率高度大于540的话,就把高度设为540,而宽度按其比例进行缩放 之 ...
- 如何理解VB窗体中的scale类属性及width height属性之间的关系
如何理解VB窗体中的scale类属性及width height属性之间的关系 VB中的SCALEHIEGT,SCALEWIDTH,与窗体中的WIDTH,HEIGHT的区别及关系是许多VB初学者难以理解 ...
- css 行内元素 块元素 替换元素 非替换元素 以及这些元素的width height margin padding 特性
一.各种元素的width height margin padding 特性(具体css元素的分来参看二) 1.块级元素 width. height. margin的四个方向. padding的四个方向 ...
- 转:Canvas标签的width和height以及style.width和style.height的区别
转自:http://www.cnblogs.com/artwl/archive/2012/02/28/2372042.html 作者:Artwl 背景 今天在博问中看到一个问题:用canvas 的 l ...
- [WPF系列]- Style - Specify width/height as resource in WPF
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:sys=" ...
随机推荐
- Laravel / PHP 扩展包视频教程
https://laravel-china.org/courses/laravel-package 每周精选两个以上扩展包进行讲解,涵盖 PHP 和 Laravel 相关的最新.最热.最常用的扩展包. ...
- mysql把一个表的字段update成另一个表的字段根据id
mysql把一个表的字段update成另一个表的字段根据id 1.填充activity表里面的creator字段,用org的founderid,其中activity的orgid要和org的id对应,具 ...
- 创建我的flask第一个应用(一)
本地python版本 (venv) dongge@dongge-PC:/data/webroot$ python --version Python 3.6.5 创建flask命令 $mkdir myp ...
- 一线实践 | 借助混沌工程工具 ChaosBlade 构建高可用的分布式系统
在分布式架构环境下,服务间的依赖日益复杂,可能没有人能说清单个故障对整个系统的影响,构建一个高可用的分布式系统面临着很大挑战.在可控范围或环境下,使用 ChaosBlade 工具,对系统注入各种故障, ...
- @codeforces - 1205E@ Expected Value Again
目录 @description@ @solution@ @part - 1@ @part - 2@ @part - 3@ @solution@ @details@ @description@ 给定两个 ...
- oralce 减少访问数据库的次数
当执行每条SQL语句时, ORACLE在内部执行了许多工作: 解析SQL语句, 估算索引的利用率, 绑定变量 , 读数据块等等. 由此可见, 减少访问数据库的次数 , 就能实际上减少ORACLE的工作 ...
- Android Xutils框架HttpUtil Get请求缓存问题
话说,今天和服务器开发人员小小的逗逼了一下,为啥呢? 话说今天有个"收藏产品"的请求接口,是get request的哦,我客户端写好接口后,点击"收藏按钮",返 ...
- SuperSocket命令加载器 (Command Loader)
在某些情况下,你可能希望通过直接的方式来加载命令,而不是通过自动的反射. 如果是这样,你可以实现你自己的命令加载器 (Command Loader): public interface IComman ...
- Mac MAMP 使用终端shell操作mysql数据库
在MAMP中已经集成了phpMyAdmin,可以很方便的管理mysql数据库,但是有的情况是phpMyAdmin不能做到的.比如,导入sql文件,当sql文件非常大(大于20MB)的时候,apache ...
- Example-09-01
#define _CRT_SECURE_NO_WARNINGS #include <cstdio> #include <cstring> int min(int a, int ...