因为背包有很多道具,用户要根据不同需要搜索出不同的道具.  道具的属性有非常居多,游戏快开发完毕的时候,突然发现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. SqlHelper——只因为在人群中多看了你一眼

    对SQLHelper,还是有一点陌生的,但是大多数人都在使用,我就有一种想了解并使用的意愿,于是查了很多资料,发现一片不错的博客,放在下面,作为自己或读者使用的材料. 一.SqlHelper 出场 不 ...

  2. [xsy2238]snake

    题意:给定一条折线,问能否在不扭曲它的情况下让它完全通过一个小孔 这个条件就是:过折线上任意一点$x$存在一条直线把折线分成不与直线相交的两部分,换句话说存在(与折线只有一个交点$x$)的直线 结论是 ...

  3. 【最大流】POJ3236-ACM Computer Factory

    [题意] 装配一个电脑需要P个零件,现在给出N机器的信息,每个机器可以将k个电脑由状态{S1,S2..,Sp}转变为{Q1,Q2..,Qp},问最多能装配多少台电脑以及对应的方案? [思路] 1A.. ...

  4. [转]Spring MVC 事务配置

    Spring MVC事务配置 要了解事务配置的所有方法,请看一下<Spring事务配置的5种方法> 本文介绍两种配置方法:  <tx:advice/>就是告诉事务管理器:怎么做 ...

  5. 使用织梦开源的分词算法库编写的YII获取分词扩展

    在编辑文章中,很多时候都需要自动根据文章内容获取关键字的功能,因此,本文主要是说明如何在yii中使用织梦开源的分词算法编写一个独立的扩展,可以在不同的模块中使用,步骤如下: 1 到这里下载其他朋友整理 ...

  6. linux shell实现随机数多种方法(date,random,uuid)

    参考: http://www.cnblogs.com/chengmo/archive/2010/10/23/1858879.html $ cat /proc/sys/kernel/random/uui ...

  7. 理解SQL Server是如何执行查询的---Joe-T :mvp

    http://www.cnblogs.com/Joe-T/ http://rusanu.com/2013/08/01/understanding-how-sql-server-executes-a-q ...

  8. jQuery插件示例笔记

    插件的种类 封装对象方法的插件 将对象方法封装起来,用于对通过选择器获取的jQuery对象进行操作. //注意,为了更好的兼容性开始前有个分号 ;(function($){ //此处将$作为匿名函数的 ...

  9. druid+spring配置

    web.xml配置 <!-- Druid,监控数据库,以及WEB访问连接信息 --> <!-- 配置好后访问 http://ip:port/projectName/druid/ind ...

  10. 调用wsdl的接口-用axis

    // 创建一个服务(service)调用(call) org.apache.axis.client.Service service = new org.apache.axis.client.Servi ...