位置: 编程技术 - 正文

Unity3D(二)用反射、泛型读取XML后动态创建实例并赋值(unity反射效果)

编辑:rootadmin
前言:最近小匹夫参与的游戏项目到了需要读取数据的阶段了,那么觉得自己业余时间也该实践下数据相关的内容。那么从哪入手呢?因为用的是unity3d的游戏引擎,思来想去就选择了C#读取XML文件这个小功能。网上的例子倒也不少,但总是觉得缺点什么。比如读取xml文件之后该如何处理?看到的文章基本上都是手动创建一个目标类的实例,然后手动从读取的XML文件的内容中给刚才创建的目标类实例相关字段赋&#;。缺点什么呢?对嘞,感觉上不够简单和智能。正所谓驱动科技发展的原因就是懒,为了使我们的小工具能够傻瓜到只需要指定一个需要的目标类型和要读取的xml的地址就能实现目标类实例的动态生成,下面的文字就诞生了。需要解决的问题:问,从xml文件到需要的目标类实例需要几步?答,读取XML文件,实例化一个目标实例,赋&#;。问题一:如何读取XML文件所以第一个问题就是如何读取XML文件,参考这篇博客《c#读取XML》,我们可知备选答案无非如下几种:XmlDocumentXmlTextReaderLinq to Xml1.XmlDocument的使用:[C#] 纯文本查看 复制代码?//XmlDocument使用XmlDocument doc = new XmlDocument();doc.Load("./Assets/xml-to-egg/xml-to-egg-test/Test.xml");XmlNode root = doc.SelectSingleNode("Test");...但是要注意的是,XmlDocument是读取整个XML的,所以如果XML内容过多,则会消费很多内存。所以XML内容过大时,不推荐使用XmlDocument。2.XmlTextReader的使用:[C#] 纯文本查看 复制代码?//XmlTestReader的使用方法XmlTextReader reader = newXmlTextReader("./Assets/xml-to-egg/xml-to-egg-test/Test.xml");//使用read()方法向下读取while(reader.Read()){ ..... }要说明与XmlDocument的最大区别,其实也很简单,XmlReader使用Steam(流)来读取文件,所以不会对内存造成太大的消耗。XmlReader通过read()方法不断向下读取,我们就可以在这个过程中进行我们需要的操作。不过这个也不是我们的答案,我们选择的答案在下面。3.Linq to Xml在System.Xml.Linq命名空间中,操作十分简单和方便。[C#] 纯文本查看 复制代码?//Linq to Xml的使用XElement xml = XElement.Load("./Assets/xml-to-egg/xml-to-egg-test/Test.xml");//读取的xml文件的元素都在生成的XElement的实例xml.Elements中。stringname = xml.Element("name").Value;......可见十分简单明了。传入xml文件的路径就会返回一个XElement类型的实例,并且xml文件的元素也都存入了XElement实例中。那么我们读取XML文件的任务就交给它了。读取XML相关逻辑的代码如下:[C#] 纯文本查看 复制代码?/// <summary>/// Sets the xml path./// </summary>publicstatic void SetXmlPath(stringp){ path = p;}/// <summary>/// Loads the XML Files./// </summary>privatestatic XElement LoadXML(){ if(path == null) returnnull; XElement xml = XElement.Load(path); returnxml;}问题二:如何实例化一个目标实例。假设我们并不知道我们的这个动态读取XML创建实例并赋&#;的小工具要处理的是什么类型的对象,那问题就来了,总不能每一个不同的类都对应一套处理方法吧?那也太不智能且代码太难以复用了。所以这里我们实例化一个目标实例碰到的第一个问题就来了,也就是如何破解目标类型的问题?答案是使用泛型。在实例化具体对象的时候,才确定类型,这样就可以避免由于类型不同而导致的代码无法复用的问题。那么,下面我们的小工具---XMLToEgg就要出场了,对,就是一个处理引用类型的泛型类。[C#] 纯文本查看 复制代码?publicstatic class XmlToEgg<T> where T : class{ }可是光解决了实例类型的问题还是差一步啊,差点什么呢?对啊,那就是如何实例化一个泛型目标实例。这也就是我们在实例化一个目标实例时遇到的第二个问题。答案是使用反射。那下面继续上代码:[C#] 纯文本查看 复制代码?/// <summary> /// Creates the class initiate. /// </summary> privatestatic void CreateInitiate() { Type t = typeof(T); ConstructorInfo ct = t.GetConstructor(System.Type.EmptyTypes); target = (T)ct.Invoke(null); }当然这里小匹夫假设我们的目标类的构造函数是不需要参数的,如果需要参数也很简单,看官们自己可以查到这里就不赘述了。好了,到这里我们如何创建一个一开始我们不知道是什么类型,只有到创建的时候才知道是什么东西的类的实例的问题就解决了。(好绕)问题三:如何为创建好的实例中的字段赋&#;终于来到了我们的终极问题,也是我们最终的目标,实现从XML到目标类实例的最后一步。在问题二的时候已经说了,作为一个可以复用的工具,对处理的目标类型应该有包容性,那么既然连目标类型都不确定,那么目标类型的字段咋能确定呢?所以这个问题的本质其实就是我不知道目标类有啥字段啊。。。(如果你把字段写死,是不是就没有一点扩展性了。。。low爆有木有),那问题连环一个接一个,我既然不知道目标类有啥字段,那我更不可能知道目标类的字段的类型了吧。好,就算我啥都知道,我应该怎么设呢?直接用instance.field = XXX? 图样图森破。所以问题的本质是明确的:我不知道目标类有啥字段我不知道各个字段是啥类型就算1,2我都知道,但是我就是不知道咋把&#;赋给相应字段。正所谓“车到山前必有路,答案还是用反射”。只要能解决上面三个小问题,那么最后这一步就算是迈过去了。话不多说,下面上代码:[C#] 纯文本查看 复制代码?/// <summary>/// attribute assignment,/// 由于反射中设置字段&#;的方法会涉及到赋&#;的目标类型和当前类型的转化,/// 所以需要使用Convert.ChangeType进行类型转化/// </summary>publicstatic T ToEgg(){ if(target != null) { target = null; } CreateInitiate(); XElement xml = LoadXML(); Type t = target.GetType(); FieldInfo[] fields = t.GetFields(); stringfieldName = string.Empty; foreach(FieldInfo f infields) { fieldName = f.Name; if(xml.Element(fieldName) != null) { f.SetValue(target, Convert.ChangeType(xml.Element(fieldName).Value, f.FieldType)); } } returntarget;}所以看代码就很明白了,简单介绍一下:Q:我不知道目标类有啥字段 A:拿到实例的Type,之后调用GetFields获取字段。Q:我不知道各个字段是啥类型 A: 其实知道赋&#;目标字段类型的目的就是为了能把从XML中读取的元素Value类型转化为字段类型,所以问题就变成了如何把XML的元素Value类型转化为目标字段类型,所以字段类型为FieldInfo.FieldType,转化就是Convert.ChangeType(xml.Element(fieldName).Value, f.FieldType)。Q:我不知道该如何给字段赋&#; A:当然还是用反射,FieldInfo.SetValue(obj, obj)。这样,一个处理动态读取XML创建类实例并赋&#;的类或者说小工具XMLToEgg就完成了,下面是完整的代码以及测试。游客,如果您要查看本帖隐藏内容请回复测试:当然,其实这里还有问题?辣是什么呢?看看小匹夫的上一篇文章《匹夫细说unity3d(一)——移动平台动态读取外部文件全解析》 各位看官就会发现问题所在啦,当然小匹夫也相信各位一定能解决这个问题~那么,下一篇文章见咯完整的项目代码以及使用方法、测试可以从这里获取:XMLToEgg (

推荐整理分享Unity3D(二)用反射、泛型读取XML后动态创建实例并赋值(unity反射效果),希望有所帮助,仅作参考,欢迎阅读内容。

Unity3D(二)用反射、泛型读取XML后动态创建实例并赋值(unity反射效果)

文章相关热门搜索词:unity屏幕空间反射,unity平面反射,unity屏幕空间反射,unity反射效果,unity 反射调用方法,unity反射探测器,unity 反射,unity 反射,内容如对您有帮助,希望把文章链接给更多的朋友!

Unity的Profiler性能分析 1.CPUUsageA.WaitForTargetFPS:Vsync(垂直同步)功能所,即显示当前帧的CPU等待时间B.Overhead:Profiler总体时间-所有单项的记录时间总和。用于记录尚不明确的时间

unity学习之小游戏 欢迎来到我们的狗刨网,我们今天主要来复习一下我们学过的知识点。因为电脑原因,装了两天的系统,小游戏比其他同学做的慢了很多,今天下午5点

unity之简单的对话框 今天我们主要学习了svn的用法,并且写了项目的需求分析。在今天的空余时间,我还抽空看了一下对话框的制作,在一个游戏中,NPC是不可缺少的,在

标签: unity反射效果

本文链接地址:https://www.jiuchutong.com/biancheng/377345.html 转载请保留说明!

上一篇:Unity中实现全局管理类的几种方式(unity全屏)

下一篇:Unity的Profiler性能分析(unity rp)

  • 2023年印花税税率口诀
  • 项目税后现金流量的计算方法
  • 减免所得税额怎么做分录
  • 小规模纳税人专票免税吗?
  • 个人购买股权的法律规定
  • 借支单是借方还是贷方
  • 个人房产税延期怎么办理
  • 拆迁车间
  • 调整以前年度多计提的工资
  • 单位装饰
  • 工资薪金支出税收金额怎么算
  • 烟草企业发生的广告和宣传费在当年营业收入15
  • 免征增值税的进项税额如何处理
  • 用于当年免征的增值税
  • 不计提盈余公积可以分红吗
  • 个人借款利息收入增值税税率
  • 劳务派遣用工工资标准
  • 公户以借款形式打款给个人,对个人有影响么?
  • 银行承兑汇票怎么取钱
  • 速冻食品增值税税率
  • 其他应付款包括应付职工薪酬吗
  • 城建税上月少计提本月怎么做账
  • 没有银行回单可以用付款凭证
  • 工资做账表格怎么做
  • 研发支出和研发费用是一个吗
  • 如何在excel中计算两列数值的差
  • 注册资金印花税税目
  • php如何导入数据库
  • 未分配利润转增股本交印花税
  • php输出数字
  • 企业免租申请
  • 增值税专用发票丢了怎么补救
  • css5个定位
  • 视图机制
  • 预支工资的借条图片
  • 转让全部探明矿权合法吗
  • 劳务报酬可以专项附加扣除吗
  • php5.2漏洞
  • erp用友u8操作教程
  • 变动成本法的计算步骤
  • 上年亏损次年赢亏怎么算
  • 资本公积 转增
  • 公司班车运费如何入账的
  • 无形资产摊销如何操作
  • 销售退货成本如何计算
  • 医院收到卫生局拨款会计分录
  • 网络销售还可以叫什么
  • 排污费征收范围包括
  • 金蝶系统如何设置套打
  • 新会计准则经营租赁
  • 应用《企业会计》的论文
  • 土地闲置费属于政府性基金收入
  • 企业失信是什么意思
  • eclipse连接mysql代码
  • sqlgun
  • sqlserver日期范围
  • mysql 高效分页
  • centos bond mode
  • windowsxp查ip地址
  • linux临时目录一般存在哪个文件夹
  • KunlunPlatform.exe是什么进程?KunlunPlatform.exe是安全的程序吗?
  • ios macos
  • centos中netspeeder网络加速/优化器的安装方法
  • win10mobile还能用吗
  • linux命令的参数
  • 电脑主板驱动
  • windows alt r
  • win7系统安装谷歌浏览器
  • vue assign
  • nodejs图片合成
  • 安卓 图形api
  • 安全工具有哪些
  • 如何在unity里设置碰撞体积
  • 单向链表的基本操作
  • nodejs中间层的作用有哪些
  • 基于springboot的毕设
  • 四川十大纳税企业
  • 技术合同备案要求
  • 地税申报网上操作步骤
  • 国税局北京税务局官网
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设