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 ...
随机推荐
- C++中cin、cin.get()、cin.getline()、getline()、gets()等函数的用法(转)
学C++的时候,这几个输入函数弄的有点迷糊:这里做个小结,为了自己复习,也希望对后来者能有所帮助,如果有差错的地方还请各位多多指教(本文所有程序均通过VC 6.0运行) 1.cin 2.cin.get ...
- JavaScript中的Date类型
ECMAScript中的Date类型是在早起Java中的java.util.Date类基础上构建的.为此,Date类型使用自UTC(Coordinated Universal Time,国际协调时间) ...
- BZOJ 4884 [Lydsy2017年5月月赛]太空猫(单调DP)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4884 [题目大意] 太空猫(SpaceCat)是一款画面精致.玩法有趣的休闲游戏, 你 ...
- 【推导】Codeforces Round #364 (Div. 2) D. As Fast As Possible
一种方法是二分总时间,复杂度O(nlogn). 另外我们可以证明,当所有人同时到达终点的时候,是最优的,因为没有人的时间“浪费”了. 我们又发现,每个人的运动过程总是两段,要么是走路,要么是坐车.于是 ...
- 【欧拉回路】【Fleury算法】CDOJ1642 老当益壮, 宁移白首之心?
题意: 构造一个01串,使得满足以下条件: 1. 环状(即首尾相连) 2. 每一位取值为0或1 3. 长度是2^n 4. 对于每个(2^n个)位置,从其开始沿逆时针方向的连续的n位01串(包括自己) ...
- 一段javascript设计模式应用场景
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <hea ...
- mysql函数的使用create function myfunction(...
use test //必须在某个数据库下面创建 delimiter $ //创建 CREATE FUNCTION myFunction(ln int, ls int) //参数这里不能加def ...
- [转]Spring Security学习总结一
[总结-含源码]Spring Security学习总结一(补命名空间配置) Posted on 2008-08-20 10:25 tangtb 阅读(43111) 评论(27) 编辑 收藏 所属分 ...
- dump备份mysql库
Auth: Jin Date: 20140403 Content: #!/bin/bash - ### auth: Jin ### ### Desc: 根据配置文件里的ip,端口(dblist文件格式 ...
- 查看mysql服务器连接
查看服务器连接,排查连接过多,查看连接状态时特别有用! 命令: show full processlist 作用: 显示当前运行的线程以及状态,也可以根据该命令来查看服务器状态. Id: 连接Id.U ...