位置: 编程技术 - 正文

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)

  • 软件产品即征即退条件
  • 领的增值税专用发票如何录入电脑
  • 个体工商户税种认定
  • 零申报还要抄税吗
  • 小规模纳税人开工程款税率是多少
  • 已认证发票对方红冲应该怎么做账
  • 在项目地预缴税款有哪些税种
  • 结转损益管理费用在借方
  • 厂房无偿租赁合同
  • 第三方协议补贴
  • 将汽车奖励给员工财务如何处理?
  • 专用发票包括增值税吗
  • 建筑企业在四库一平台找不到
  • 补发工资个人所得税怎么申报
  • 钢结构安装有哪些工种
  • 政府部门纳税人识别号查询
  • 开票金额是纳税金额吗
  • 补充养老保险费可以扣除吗
  • 增值税普通发票需要交税吗
  • 微信收入与支出是怎么算的
  • 土地合并需要什么资料
  • ahqinit.exe是什么进程 ahqinit是安全的进程吗
  • 高薪技术企业的有效期是几年
  • PHP:pg_field_name()的用法_PostgreSQL函数
  • 融资租入固定资产的账务处理
  • 高手成长礼包
  • php 算法
  • 其他综合收益的来源
  • 经营租入的设备为什么不属于资产
  • 固定资产折旧计算方法公式大全
  • 在生产经营过程中违反什么规定
  • 应收账款余额在借方表示谁欠谁
  • 比利牛斯山作为天然界限
  • php屏蔽错误
  • 已抄报未反写什么意思
  • chrome 浏览器插件开发
  • 权限管理实现的功能包括
  • patriotic研究
  • css中的hover属性
  • apk文件包下载
  • python脚本例子
  • 看望职工家属可以计入福利费吗
  • 资产负债表和现金流量表之间的勾稽关系
  • 学电脑的好网站
  • 代扣代缴完税凭证抵扣期限
  • 其他应收款专项审计报告
  • 小规模纳税人是小微企业吗
  • 公司购买垃圾箱会计分录
  • 门市装修费用会计处理
  • 付款方和发票抬头不一致会计处理
  • 外经证预缴税款的附加税所属期写错怎么办
  • 研究开发费用加计扣除最新政策
  • 资本公积转为实收资本会计科目
  • 房产公司增值税专用发票
  • 一次性补缴养老保险的最新规定
  • 存货期末报表列示
  • 境外机构境内外汇账户管理办法
  • 清除sql表内容
  • sqlserver数据库中表的类型有哪些
  • mysql主从复制原理以及架构
  • windows隐藏功能
  • 电脑xp系统的设置在哪
  • windows开机自启动程序
  • 快速锁定单元格的方法
  • 磁贴for kwgt
  • linux系统简介
  • squid服务器配置
  • win8如何进入高级启动项模式
  • 怎么用linux运行c程序
  • win11系统ie浏览器
  • 浏览器隐藏用法
  • JAVA的OPENGL,JOGL入门实例----碰撞移动的正方体 (配置+源代码)
  • html超链接打开本地文件
  • javascript中的函数
  • js 截取
  • python中scipy用法
  • 医院票据怎么查询
  • 打印发票需要什么信息
  • 上海长宁区多大面积
  • 佩兰诗胶原蛋白填充霜真的有效果吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设