因为背包有很多道具,用户要根据不同需要搜索出不同的道具.  道具的属性有非常居多,游戏快开发完毕的时候,突然发现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 背包道具搜索的更多相关文章

  1. Unity 背包道具搜索(2)

    上一篇: http://www.cnblogs.com/plateFace/p/6490577.html 上次编写代码只是把逻辑编写出来, 对于里面的代码还存在一下问题 1. 搜索功能没有解耦 2. ...

  2. Unity场景道具模型拓展自定义编辑器

    (一)适用情况 当游戏主角进入特定的场景或者关卡,每个关卡需要加载不同位置的模型,道具等.这些信息需要先在unity编辑器里面配置好,一般由策划干这事,然后把这些位置道具信息保存在文件,当游戏主角进入 ...

  3. unity编辑器的搜索框好特么坑啊,居然不支持*号通配符

    上图 t:Scene或者点搜索框旁边的 分类按钮 用*.unity是什么也搜索不出来的

  4. Unity背包/商城物品逐个显示缓动效果-依次显示

    道具栏/商城中物品逐个显示效果 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分 ...

  5. nyoj 456——邮票分你一半——————【背包思想搜索】

    邮票分你一半 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述      小珂最近收集了些邮票,他想把其中的一些给他的好朋友小明.每张邮票上都有分值,他们想把这些邮票分 ...

  6. 道具搜索框(|=, & , ^=)实现的列子

    需求: 勾上界面上多选框筛选出符合的道具 思路: 1. 使用组合数字让一个数字包含多这个搜索条件,比如2代表搜索衣服和武器, 数字按照2的n次幂的值递增,通过|,&,^运算符实现一个数字包含多 ...

  7. HDU - 5887 2016青岛网络赛 Herbs Gathering(形似01背包的搜索)

    Herbs Gathering 10.76% 1000ms 32768K   Collecting one's own plants for use as herbal medicines is pe ...

  8. Unity Shader后处理-搜索灰度效果

    如U3D中Hierarchy面板下的搜索效果: 讲解分析: 1.这种PostEffect效果其实就是指Unity shader的后处理,即游戏中实现屏幕特效的常见方法.顾名思义屏幕后处理就是指在渲染完 ...

  9. [Unity]背包效果-使用NGUI实现物品的拖拽效果Drag

    背包效果-使用NGUI实现物品的拖拽效果Drag 效果实现如图 对象层级关系图 PacketCell - Right 对象作为单元格背景 PacketContainer 对象作为单元格容器 Packe ...

随机推荐

  1. 理解Python的迭代器(转)

    原文地址: http://python.jobbole.com/81916/ 另外一篇文章: http://www.cnblogs.com/kaituorensheng/p/3826911.html ...

  2. bzoj 3203: [Sdoi2013]保护出题人 凸包

    题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=3203 题解 首先我们考虑对一大波僵尸来袭的情况进行分析 假设来袭的僵尸是\(\{ a_1 ...

  3. POJ2068 Nim 博弈论 dp

    http://poj.org/problem?id=2068 博弈论的动态规划,依然是根据必胜点和必输点的定义,才明白过来博弈论的dp和sg函数差不多完全是两个概念(前者包含后者),sg函数只是mex ...

  4. 【高斯消元】CDOJ1783 曜酱的线性代数课堂(一)

    高斯消元求逆矩阵板子. #include<cstdio> #include<cmath> #include<algorithm> #include<cstri ...

  5. iOS 在系统设置中展示Version, Build, Git等信息

     在设置中,展示自定义内容,如下图INFO区域内容:         步骤: 1.在项目中添加Settings.bundle文件 Root.plist和Root.plist的Source code如下 ...

  6. DN安卓2014版(5-9)

    DN安卓2014版(5-9) 联系2g32@sina.com

  7. Java RSA加密算法生成公钥和私钥

    原文:http://jingyan.baidu.com/article/6dad5075f33466a123e36ecb.html?qq-pf-to=pcqq.c2c 目前为止,RSA是应用最多的公钥 ...

  8. palm os

    在3G展会上,Palm将告别Palm OS操作系统 2009年2月12日消息,据国外媒体报道,周三,Palm CEO埃德•科林根(Ed Colligan)在旧金山的一个投资者会议上表示,Palm将告别 ...

  9. Ubuntu下Wine使用教程

    转自:http://blog.csdn.net/wangchangshuai0010/article/details/12057251 用了段时间的Ubuntu,感觉很好!可是工作的时候还是要用到 w ...

  10. 转-"进程android.process.acore已意外停止" 解决办法

    运行手机虚拟机时,老是弹出这样的“android.process.acore“服务已意外停止,虽不影响正常使用,但终究影响心情.网上找的方案,按如下步骤操作,可以解决问题: 出现这个提示不用担心,并不 ...