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

相关文章

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

C#和Unity中的中介者模式使用方式

《C#和Unity中的中介者模式使用方式》中介者模式通过中介者封装对象交互,降低耦合度,集中控制逻辑,适用于复杂系统组件交互场景,C#中可用事件、委托或MediatR实现,提升可维护性与灵活性... 目录C#中的中介者模式详解一、中介者模式的基本概念1. 定义2. 组成要素3. 模式结构二、中介者模式的特点

HTML5 搜索框Search Box详解

《HTML5搜索框SearchBox详解》HTML5的搜索框是一个强大的工具,能够有效提升用户体验,通过结合自动补全功能和适当的样式,可以创建出既美观又实用的搜索界面,这篇文章给大家介绍HTML5... html5 搜索框(Search Box)详解搜索框是一个用于输入查询内容的控件,通常用于网站或应用程

Python使用DeepSeek进行联网搜索功能详解

《Python使用DeepSeek进行联网搜索功能详解》Python作为一种非常流行的编程语言,结合DeepSeek这一高性能的深度学习工具包,可以方便地处理各种深度学习任务,本文将介绍一下如何使用P... 目录一、环境准备与依赖安装二、DeepSeek简介三、联网搜索与数据集准备四、实践示例:图像分类1.

C# ComboBox下拉框实现搜索方式

《C#ComboBox下拉框实现搜索方式》文章介绍了如何在加载窗口时实现一个功能,并在ComboBox下拉框中添加键盘事件以实现搜索功能,由于数据不方便公开,作者表示理解并希望得到大家的指教... 目录C# ComboBox下拉框实现搜索步骤一步骤二步骤三总结C# ComboBox下拉框实现搜索步骤一这

认识、理解、分类——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