Unity 背包道具搜索
因为背包有很多道具,用户要根据不同需要搜索出不同的道具. 道具的属性有非常居多,游戏快开发完毕的时候,突然发现ItemManager类里面几乎每一个搜索方法都有一个foreach循环, 循环里面因为一点点不同的搜索条件就会导致重新写一个搜索方法出来.最后发现有10多种搜索方法. 后来打算优化下这个问题, 参考了下Itween传入参数进行移动的方式.
代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace SearchOp
{
class Program
{
static void Main(string[] args)
{
Dictionary<string, object> search = new Dictionary<string, object>();
search.Add("ConfigId", 101);
search.Add("Bind", true); ItemManager.I.TestInit(); //第一次搜索
List<ItemBase> itemList = ItemManager.I.Get(search);
PrintItem(itemList); //第二次搜索
search.Clear();
search.Add("Bind", false);
itemList = ItemManager.I.Get(search);
PrintItem(itemList); Console.ReadLine();
} public static void PrintItem(List<ItemBase> itemList)
{
foreach (var item in itemList)
{
Console.WriteLine("Name: " + item.Name);
Console.WriteLine("Id: " + item.ConfigId);
Console.WriteLine("Bind: " + item.Bind);
Console.WriteLine("BigType: " + item.BigType);
Console.WriteLine("SubType: " + item.SubType);
Console.WriteLine("TimeType: " + item.TimeType);
Console.WriteLine("-----------------------");
}
} } public class ItemManager
{
private static ItemManager m_I;
public static ItemManager I
{
get
{
if (m_I == null)
m_I = new ItemManager(); return m_I;
}
} private List<ItemBase> mItemList = new List<ItemBase>(); public void TestInit()
{
mItemList.Add(new ItemBase()
{
Name = "幽梦之刃",
ConfigId = 101,
BigType = 1,
SubType = 1,
Bind = true,
TimeType = TimelimitEnum.None
});
mItemList.Add(new ItemBase()
{
Name = "幽梦之刃",
ConfigId = 101,
BigType = 1,
SubType = 1,
Bind = false,
TimeType = TimelimitEnum.None
});
mItemList.Add(new ItemBase()
{
Name = "幽梦之刃",
ConfigId = 101,
BigType = 1,
SubType = 1,
Bind = true,
TimeType = TimelimitEnum.None
});
mItemList.Add(new ItemBase()
{
Name = "无尽之刃",
ConfigId = 102,
BigType = 1,
SubType = 1,
Bind = true,
TimeType = TimelimitEnum.PastDue
});
} public List<ItemBase> Get(Dictionary<string, object> condition)
{
List<ItemBase> tempList = new List<ItemBase>();
List<ItemFilter> conditionFunList = ConvertCondition(condition); bool isNotThrough = false;
foreach (var item in mItemList)
{
isNotThrough = true;
foreach (var cond in conditionFunList)
{
if (cond.Execute(item) == false)
{
isNotThrough = false;
break;
}
} if (isNotThrough)
{
tempList.Add(item);
}
} return tempList;
} public List<ItemFilter> ConvertCondition(Dictionary<string, object> dic)
{
List<ItemFilter> conditionFunList = new List<ItemFilter>();
foreach (var str in dic)
{
switch (str.Key)
{
case "ConfigId":
conditionFunList.Add(new ItemFilter()
{
Fun = ItemFilterFun.EquilId,
FunArgs = str.Value
});
break;
case "Bind":
conditionFunList.Add(new ItemFilter()
{
Fun = ItemFilterFun.IsBind,
FunArgs = str.Value
});
break;
case "TimeType":
conditionFunList.Add(new ItemFilter()
{
Fun = ItemFilterFun.CheckTime,
FunArgs = str.Value
});
break;
case "IsEquip":
conditionFunList.Add(new ItemFilter()
{
Fun = ItemFilterFun.IsEquip,
FunArgs = str.Value
});
break;
case "IsMaterial":
conditionFunList.Add(new ItemFilter()
{
Fun = ItemFilterFun.IsMaterial,
FunArgs = str.Value
});
break;
case "IsSpecial":
conditionFunList.Add(new ItemFilter()
{
Fun = ItemFilterFun.IsSpecial,
FunArgs = str.Value
});
break;
}
} return conditionFunList;
} } public class ItemFilterFun
{
public static bool EquilId(ItemBase item, object args)
{
int id = (int)args;
return item.ConfigId == id;
} public static bool IsBind(ItemBase item, object args)
{
bool isBind = (bool)args;
return item.Bind == isBind;
} public static bool CheckTime(ItemBase item, object args)
{
TimelimitEnum timeType = (TimelimitEnum)args;
return item.TimeType == timeType;
} public static bool IsEquip(ItemBase item, object args)
{
return item.BigType == (int)ItemType.Equip;
} public static bool IsMaterial(ItemBase item, object args)
{
int type = item.BigType;
return type == 2 || type == 4 || type == 6;
} public static bool IsSpecial(ItemBase item, object args)
{
int type = item.BigType;
return type == 1 || type == 5 || type == 7 || type == 8;
}
} public class ItemFilter
{
public Func<ItemBase, object, bool> Fun;
public object FunArgs; public bool Execute(ItemBase item)
{
return Fun(item, FunArgs);
} } public class ItemBase
{
public string Name;
public int Pos;
public int ConfigId;
public bool Bind;
public int BigType;
public int SubType;
public TimelimitEnum TimeType;
} public enum TimelimitEnum
{
None = -1,
PastDue = 0,
NoPastDue = 1
}
public enum ItemType
{
//(0-装备,1-消耗品,2材料,3宝箱) Equip = 0,
Consume = 1,
Material = 2,
Task = 3,
Gem = 4,
SkillBook = 5,
SkillGoods = 6,
NumberGoods = 7,
Chest = 8,
TimeLimit = 9,
Currency = 999,
} }

Unity 背包道具搜索的更多相关文章
- Unity 背包道具搜索(2)
上一篇: http://www.cnblogs.com/plateFace/p/6490577.html 上次编写代码只是把逻辑编写出来, 对于里面的代码还存在一下问题 1. 搜索功能没有解耦 2. ...
- Unity场景道具模型拓展自定义编辑器
(一)适用情况 当游戏主角进入特定的场景或者关卡,每个关卡需要加载不同位置的模型,道具等.这些信息需要先在unity编辑器里面配置好,一般由策划干这事,然后把这些位置道具信息保存在文件,当游戏主角进入 ...
- unity编辑器的搜索框好特么坑啊,居然不支持*号通配符
上图 t:Scene或者点搜索框旁边的 分类按钮 用*.unity是什么也搜索不出来的
- Unity背包/商城物品逐个显示缓动效果-依次显示
道具栏/商城中物品逐个显示效果 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分 ...
- nyoj 456——邮票分你一半——————【背包思想搜索】
邮票分你一半 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 小珂最近收集了些邮票,他想把其中的一些给他的好朋友小明.每张邮票上都有分值,他们想把这些邮票分 ...
- 道具搜索框(|=, & , ^=)实现的列子
需求: 勾上界面上多选框筛选出符合的道具 思路: 1. 使用组合数字让一个数字包含多这个搜索条件,比如2代表搜索衣服和武器, 数字按照2的n次幂的值递增,通过|,&,^运算符实现一个数字包含多 ...
- HDU - 5887 2016青岛网络赛 Herbs Gathering(形似01背包的搜索)
Herbs Gathering 10.76% 1000ms 32768K Collecting one's own plants for use as herbal medicines is pe ...
- Unity Shader后处理-搜索灰度效果
如U3D中Hierarchy面板下的搜索效果: 讲解分析: 1.这种PostEffect效果其实就是指Unity shader的后处理,即游戏中实现屏幕特效的常见方法.顾名思义屏幕后处理就是指在渲染完 ...
- [Unity]背包效果-使用NGUI实现物品的拖拽效果Drag
背包效果-使用NGUI实现物品的拖拽效果Drag 效果实现如图 对象层级关系图 PacketCell - Right 对象作为单元格背景 PacketContainer 对象作为单元格容器 Packe ...
随机推荐
- Outlook Font
- JDBC 编程
DAO设计 没有使用DAO存在的问题:多个地方都要都同时做CRUD操作时,重复的代码就会很多. DAO:Data Access Object(数据存取对象). 位于业务逻辑和持久化数据之间,实现对持久 ...
- BZOJ 2286 [Sdoi2011]消耗战(虚树+树形DP)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2286 [题目大意] 出一棵边权树,每次给出一些关键点,求最小边割集, 使得1点与各个关 ...
- view加阴影和边框
UIImageView *imgvPhoto = [UIImageView alloc] init]; //添加边框 CALayer *layer = [_imgvPhoto layer]; ...
- C# base64编码的字符串与图片互转
protected string ImgToBase64String(string Imagefilename) { try { Bitmap bmp = new Bitmap(Imagefilena ...
- tcpdump的使用
tcpdump命令的控制分4个部分 控制tcpdump行为 -c 控制抓取报文的个数 -p 非混杂模式 -s 限制报文长度,0 为不限制 -w 保存抓取的报文到指定路径 -r 从pcap报文读取报文 ...
- 十.spring-boot添加jsp支持
1.创建maven web project: 2.在添加web依赖 3.配置application.properties支持jsp 4.添加一个controller类 5.加入jsp页面 6.启动类 ...
- 二十四种设计模式:策略模式(Strategy Pattern)
策略模式(Strategy Pattern) 介绍定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.本模式使得算法的变化可独立于使用它的客户. 示例有一个Message实体类,对它的操作有 ...
- 流畅的python第十四章可迭代的对象,迭代器和生成器学习记录
在python中,所有集合都可以迭代,在python语言内部,迭代器用于支持 for循环 构建和扩展集合类型 逐行遍历文本文件 列表推导,字典推导和集合推导 元组拆包 调用函数时,使用*拆包实参 本章 ...
- vue项目配置使用flow类型检查
你是否经常在debug那些简单可避免的bug?可能你给函数传参的时候搞错了参数的顺序,或者本来应该传个Number类型的参数,你传了一个String类型?JavaScript的弱类型是这一类bug的罪 ...