Unity 背包道具搜索

2023-11-05 21:10
文章标签 搜索 背包 unity 道具

本文主要是介绍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,}}

image

转载于:https://www.cnblogs.com/plateFace/p/6490577.html

这篇关于Unity 背包道具搜索的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/352515

相关文章

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

hdu1240、hdu1253(三维搜索题)

1、从后往前输入,(x,y,z); 2、从下往上输入,(y , z, x); 3、从左往右输入,(z,x,y); hdu1240代码如下: #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#inc

poj2576(二维背包)

题意:n个人分成两组,两组人数只差小于1 , 并且体重只差最小 对于人数要求恰好装满,对于体重要求尽量多,一开始没做出来,看了下解题,按照自己的感觉写,然后a了 状态转移方程:dp[i][j] = max(dp[i][j],dp[i-1][j-c[k]]+c[k]);其中i表示人数,j表示背包容量,k表示输入的体重的 代码如下: #include<iostream>#include<

hdu2159(二维背包)

这是我的第一道二维背包题,没想到自己一下子就A了,但是代码写的比较乱,下面的代码是我有重新修改的 状态转移:dp[i][j] = max(dp[i][j], dp[i-1][j-c[z]]+v[z]); 其中dp[i][j]表示,打了i个怪物,消耗j的耐力值,所得到的最大经验值 代码如下: #include<iostream>#include<algorithm>#include<

csu(背包的变形题)

题目链接 这是一道背包的变形题目。好题呀 题意:给n个怪物,m个人,每个人的魔法消耗和魔法伤害不同,求打死所有怪物所需的魔法 #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<queue>#include<set>//#include<u>#include<map

hdu1011(背包树形DP)

没有完全理解这题, m个人,攻打一个map,map的入口是1,在攻打某个结点之前要先攻打其他一个结点 dp[i][j]表示m个人攻打以第i个结点为根节点的子树得到的最优解 状态转移dp[i][ j ] = max(dp[i][j], dp[i][k]+dp[t][j-k]),其中t是i结点的子节点 代码如下: #include<iostream>#include<algorithm

hdu1171(母函数或多重背包)

题意:把物品分成两份,使得价值最接近 可以用背包,或者是母函数来解,母函数(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v) 其中指数为价值,每一项的数目为(该物品数+1)个 代码如下: #include<iostream>#include<algorithm>

hdu 2602 and poj 3624(01背包)

01背包的模板题。 hdu2602代码: #include<stdio.h>#include<string.h>const int MaxN = 1001;int max(int a, int b){return a > b ? a : b;}int w[MaxN];int v[MaxN];int dp[MaxN];int main(){int T;int N, V;s

uva 10130 简单背包

题意: 背包和 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <queue>#include <map>

hdu 4517 floyd+记忆化搜索

题意: 有n(100)个景点,m(1000)条路,时间限制为t(300),起点s,终点e。 访问每个景点需要时间cost_i,每个景点的访问价值为value_i。 点与点之间行走需要花费的时间为g[ i ] [ j ] 。注意点间可能有多条边。 走到一个点时可以选择访问或者不访问,并且当前点的访问价值应该严格大于前一个访问的点。 现在求,从起点出发,到达终点,在时间限制内,能得到的最大