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,
    }

}

时间: 2024-10-11 13:02:00

Unity 背包道具搜索的相关文章

hdu--1059--多重背包||DP||搜索

碎碎念----- 突然 觉得好无聊~~ 还好 只有4天了~~ 直接上题吧~~ touch  me 使用多重背包的代码是转自---键盘上的舞者---- 写得特别有想法 使用dp的代码是porker写的.. 使用搜索的 我一开始是将价值从低到高搜索的 这样TLE了,,因为速度实在是太慢了 假如有arr[k]个 那么我要有arr[k]+1个操作... 但是 按价值从高到低的搜索 只要遵循 尽量在不到sum/2的时候去搜就是了 有就添加进来...但这个方法的正确性 没有得到证明... 1 #includ

01背包 暴力搜索

/** 01背包,recursive * 05.08/2014 */ #include <cstdio> #include <cstring> #include <algorithm> #define MAXN 30000 using namespace std; int N,W; int w[MAXN],v[MAXN]; int solve(int i, int tw) { int res; if( i == N) //已经全部搜索完 res = 0; else if

unity编辑器的搜索框好特么坑啊,居然不支持*号通配符

上图 t:Scene或者点搜索框旁边的 分类按钮 用*.unity是什么也搜索不出来的

nyoj 456——邮票分你一半——————【背包思想搜索】

邮票分你一半 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述      小珂最近收集了些邮票,他想把其中的一些给他的好朋友小明.每张邮票上都有分值,他们想把这些邮票分成两份,并且使这两份邮票的分值和相差最小(就是小珂得到的邮票分值和与小明的差值最小),现在每张邮票的分值已经知道了,他们已经分好了,你知道最后他们得到的邮票分值和相差多少吗? 输入 第一行只有一个整数m(m<=1000),表示测试数据组数.接下来有一个整数n(n<=1000),表示邮票的张数.然后有n

Unity场景道具模型拓展自定义编辑器

(一)适用情况 当游戏主角进入特定的场景或者关卡,每个关卡需要加载不同位置的模型,道具等.这些信息需要先在unity编辑器里面配置好,一般由策划干这事,然后把这些位置道具信息保存在文件,当游戏主角进入后根据保存的文件信息加载模型道具.如 跑酷场景的金币 赛车赛道的道具 (二)实例文件格式 Json 需要导入SimpleJson 具体使用方法可以看我另外一篇<Unity游戏数据用Json保存>,有详细介绍 http://www.cnblogs.com/July7th/p/4808095.html

unity 使用深度优先搜索生成迷宫之二

之前写过一篇使用深度优先搜索生成随机迷宫的文章 https://www.cnblogs.com/JinT-Hwang/p/9599913.html 今天做了一下优化,使用unity的TileMap来做,并且代码减少到100行以内. 先看一下效果图 下面直接是代码,至于在unity中怎么创建tilemap资源这里就不讲了: using System.Collections; using System.Collections.Generic; using UnityEngine; using Uni

[译]如何在Unity编辑器中添加你自己的工具

在这篇教程中你会学习如何扩展你的Unity3D编辑器,以便在你的项目中更好的使用它.你将会学习如何绘制你自己的gizmo,用代码来实现创建和删除物体,创建编辑器窗口,使用组件,并且允许用户撤销他们所作出的任何动作,这些全部都是用编辑器脚本来实现的. 这篇教程假设你已经熟悉Unity的基本工作流程.如果你知道如何在编辑器中创建物体.预设.场景并且知道如何移动它们,知道如何添加组件,那么你可以开始本教程的学习了. 最终结果预览 让我们看一下我们做出的最终结果是什么样子: 如你所见,我们会创建一个编辑

【Linux探索之旅】第一部分第五课:Unity桌面,人生若只如初见

内容简介 1.第一部分第五课:Unity桌面,人生若只如初见 2.第一部分第六课预告:Linux如何安装在虚拟机中 Unity桌面,人生若只如初见 不容易啊,经过了前几课的学习,我们认识了Linux是什么,以及如何安装Linux系统(我们以Ubuntu这个Linux发行版为以后的演示系统),我们也在上一课终于把Ubuntu安装好了. "很不错,掌声给自己". 安装Ubuntu遇到什么问题,可以在我们的QQ群和微信群提问,也可以私信小编,QQ.微信.邮件都行.联系方式在下面. Linux

一些技巧吧!Unity Tips(日常使用)

孙广东 2015.10.30 1.按组件名称搜索 场景的hierarchy 层次结构, 就是得到 使用了这个组件的对象 2.如何查找文档快捷方式(就是很快的方式找到 组件的文档) 3.如何复制和还原在播放模式下所做的更改(只能是一个组件的内容) 就是在Play状态下copy这个组件,然后 在恢复状态下 在粘贴 如果是修改了 一个对象的多个组件的话, 怎么办? 就是拷贝这个对象呗 在粘贴之前 ,删除那个对象. 4.如何使用Play模式下的色调设置(是一种提示吧) 结果就是 除了 game和 sce