位置: 编程技术 - 正文

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)

  • 境外企业在中国境内承包建筑工程应在
  • 怎样注册投资有限公司
  • 补缴以前年度增值税以及滞纳金
  • 押金和租金
  • 合并抵消分录的原理是什么
  • 调整企业银行存款账面余额的记账依据是什么
  • 回购股票增加权益吗
  • 借款利息是否可以转为本金
  • 违反有关规定擅自开设银行账户的
  • 销售自己使用过的固定资产如何开票
  • 企业支付给生产车间
  • 缴纳土地出让金后多久能拿到土地证
  • 多计提以前年度损益调整账务处理怎么做
  • 土地使用权作为固定资产的情况
  • 注销时公司账上没有钱付股东投资款
  • 增值税普通发票需要交税吗
  • 汽车销售行业的现状及发展趋势
  • 关于国际货运代理协会联合会的描述不正确的是
  • 没有进项开销项发票是虚开发票吗
  • 公司走税,对公司有影响吗
  • 装卸增值税税率最新的
  • 订购维修设备零件怎么做账?
  • 企业出售旧设备的收入要纳税吗
  • 收入冲正
  • 应收和预收可以抵消吗
  • 社保银行扣款未扣怎么办
  • 企业所得税是怎么来的?
  • 社保打入其他公司代扣分录怎么做?
  • 银行承兑汇票接收
  • 公司租房可以抵扣个人所得税吗
  • php输出mysql
  • 公司注册小规模有什么要求
  • 野生动物保护区有哪些
  • 员工离职的类型
  • 软件开发中的业务一般指什么
  • 抵扣进项税额的几种情况是
  • 新准则下公允价值变动损益纳税调整
  • 购入固定资产应该怎么做账
  • 保证增信是什么意思东奥2023
  • 新个人所得税起征点2023
  • 会计实务中的计提是什么意思
  • 水利建设基金申报
  • 工业企业会计核算中常见的会计核算程序有哪些?
  • 办税人员可绑定银行卡吗
  • 运输发票抵扣税额怎么算
  • 个人建筑安装属于劳务吗
  • 水利基金的计税税率6
  • 小额收据报销
  • 出纳需要填写会计凭证吗
  • 公司聚餐做什么科目
  • 什么是应收账款管理
  • 幼儿园报税的基础是什么
  • 长期待摊费用可以摊销20年吗
  • 资产负债率比率
  • win8打开桌面
  • win7提示无法访问权限
  • 苹果系统声音怎么设置方法
  • xp系统修复怎么操作
  • centos ll
  • win7怎样关闭ie浏览器
  • win7系统介绍
  • win10 mobile 1709
  • javascript RegExp 使用说明
  • 基于重大误解实施的民事法律行为
  • gitlab管理员账号 审批
  • jquery校验数字
  • 输入命令的三种方法
  • python调用ansible执行playbook
  • 批处理设置dns
  • python twinter
  • javascript学习指南
  • JavaScript数据类的特点
  • 安卓手机管家删除的照片怎么恢复
  • 国土局和地税局的区别
  • 怎么判断买的盐是不是真的
  • 转让专利权取得的所得属于财产转让所得吗
  • 三证合一的资料
  • 买高档手表
  • 江苏徐州买房
  • 税控卡丢失怎么办
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设