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

相关文章

【文末附gpt升级秘笈】腾讯元宝AI搜索解析能力升级:千万字超长文处理的新里程碑

腾讯元宝AI搜索解析能力升级:千万字超长文处理的新里程碑 一、引言 随着人工智能技术的飞速发展,自然语言处理(NLP)和机器学习(ML)在各行各业的应用日益广泛。其中,AI搜索解析能力作为信息检索和知识抽取的核心技术,受到了广泛的关注和研究。腾讯作为互联网行业的领军企业,其在AI领域的探索和创新一直走在前列。近日,腾讯旗下的AI大模型应用——腾讯元宝,迎来了1.1.7版本的升级,新版本在AI搜

【Unity Shader】片段着色器(Fragment Shader)的概念及其使用方法

在Unity和图形编程中,片段着色器(Fragment Shader)是渲染管线中的一个阶段,负责计算屏幕上每个像素(片段)的颜色和特性。片段着色器通常在顶点着色器和任何几何处理之后运行,是决定最终像素颜色的关键步骤。 Fragment Shader的概念: 像素处理:片段着色器处理经过顶点着色器和几何着色器处理后,映射到屏幕空间的像素。颜色计算:它计算每个像素的颜色值,这可能包括纹理采样、光

【Unity Shader】Alpha Blend(Alpha混合)的概念及其使用示例

在Unity和图形编程中,Alpha Blend(也称为Alpha混合)是一种用于处理像素透明度的技术。它允许像素与背景像素融合,从而实现透明或半透明的效果。Alpha Blend在渲染具有透明度的物体(如窗户、玻璃、水、雾等)时非常重要。 Alpha Blend的概念: Alpha值:Alpha值是一个介于0(完全透明)和1(完全不透明)的数值,用于表示像素的透明度。混合模式:Alpha B

代码随想录算法训练营第三十九天|62.不同路径 63. 不同路径 II 343.整数拆分 96.不同的二叉搜索树

LeetCode 62.不同路径 题目链接:62.不同路径 踩坑:二维的vector数组需要初始化,否则会报错访问空指针 思路: 确定动态数组的含义:dp[i][j]:到达(i,j)有多少条路经递推公式:dp[i][j] = dp[i-1][j] + dp[i][j-1]初始化动态数组:dp[0][0] = 1遍历顺序:从左到右,从上到下 代码: class Solution {pu

秋招突击——6/22——复习{区间DP——加分二叉树,背包问题——买书}——新作{移除元素、实现strStr()}

文章目录 引言复习区间DP——加分二叉树个人实现 背包问题——买书个人实现参考实现 新作移除元素个人实现参考思路 找出字符串中第一个匹配项的下标个人实现参考实现 总结 引言 今天做了一个噩梦,然后流了一身汗,然后没起来,九点多才起床背书。十点钟才开始把昨天那道题题目过一遍,然后十一点才开始复习题目,为了不耽误下午的时间,所以这里的就单纯做已经做过的题目,主打一个有量,不在学

leetcode刷题(45)——35. 二叉搜索树的最近公共祖先

给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。” 例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5] 示例 1: 输入: root = [

Unity Meta Quest 开发:关闭 MR 应用的安全边界

社区链接: SpatialXR社区:完整课程、项目下载、项目孵化宣发、答疑、投融资、专属圈子 📕教程说明 这期教程我将介绍如何在应用中关闭 Quest 系统的安全边界。 视频讲解: https://www.bilibili.com/video/BV1Gm42157Zi 在 Unity 中导入 Meta XR SDK,进行环境配置后,打开 Assets > Plugins > An

【智能优化算法改进策略之局部搜索算子(五)—自适应Rosenbrock坐标轮换法】

1、原理介绍 作为一种有效的直接搜索技术,Rosenbrock坐标轮换法[1,2]是根据Rosenbrock著名的“香蕉函数”的特点量身定制的,该函数的最小值位于曲线狭窄的山谷中。此外,该方法是一种典型的基于自适应搜索方向集的无导数局部搜索技术。此法于1960年由Rosenbrock提出,它与Hooke-Jeeves模式搜索法有些类似,但比模式搜索更为有效。每次迭代运算分为两部分[3]: 1)

Day59 代码随想录打卡|二叉树篇---把二叉搜索树转换为累加树

题目(leecode T538): 给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。 提醒一下,二叉搜索树满足下列约束条件: 节点的左子树仅包含键 小于 节点键的节点。节点的右子树仅包含键 大于 节点键的节点。左右子树也必须是二叉搜索树。 方法:本题

智能优化算法改进策略之局部搜索算子(六)--进化梯度搜索

1、原理介绍     进化梯度搜索(Evolutionary Gradient Search, EGS)[1]是兼顾进化计算与梯度搜索的一种混合算法,具有较强的局部搜索能力。在每次迭代过程中,EGS方法首先用受进化启发的形式估计梯度方向,然后以最陡下降的方式执行实际的迭代步骤,其中还包括步长的自适应,这一过程的总体方案如下图所示:     文献[1]