位置: 编程技术 - 正文

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)

  • 税务局纳税申报网站官网
  • 旅游业成本交税会计分录怎么做
  • 运输公司税率和税种
  • 税务制服的肩章是什么
  • 医院都需要交什么税
  • 个人所得税可以不交税吗
  • 研发费用直接计入成本吗
  • 小微企业所得税税率2.5% 10% 25%
  • 主税零申报附加税怎样申报
  • 资产负债表期初和期末的关系
  • 减免所得税额是怎么算出来的2022
  • 什么叫税控盘清卡
  • 异地劳务分包要外经证吗
  • 经营租入的固定资产是资产吗
  • 如何理解出口退税政策
  • 企业用于在建工程购入的材料
  • 公司与银行签订的远期合约汇率是什么
  • 金融企业同期同类贷款利率计算
  • 股权转让时未分配利润的税务处理
  • 高铁票财务怎么报销
  • 办税员的工作职责
  • 苹果键盘快捷键怎么用
  • 计划成本是什么科目
  • 上月库存占比怎么算
  • win10 20h1 bug
  • linux mint 20.1安装
  • 命令提示符打错了怎么修改
  • memcache php
  • 胆固醇为什么会高
  • avgserv9.exe是什么进程 avgserv9进程的详细介绍
  • 写入缓存策略无法更改
  • 前端实战开发
  • php实现四种基础方式
  • 会计核算方法有几种
  • 固定资金是什么科目
  • 公对公的税票是怎么个流程
  • 固定资产折旧完报废账务处理
  • phpcms建站流程
  • 资产负债表日后至财务报告批准报出日之间
  • 一般纳税人销售货物税率
  • 水运企业会计核算办法
  • 资金占用费的税费是多少
  • 不含税单价和不含税合价的区别
  • 税金及附加主要包括什么
  • 开一家公司的具体步骤
  • 旅游业营改增会计分录
  • 停车费报销会计分录
  • 以前年度多计提成本怎么处理
  • 待认证进项税怎么转出
  • 代收收入
  • 承兑汇票怎么贴
  • 无形资产可以占多少比例
  • 票已收到、款未付会计分录
  • 月末结转各项费用支出479000
  • 会务费所需要注意的细节
  • aix解除镜像
  • win8的应用商店
  • win8.1配置要求
  • centos添加自启动
  • win7系统u盘打不开怎么办
  • win10系统预览版
  • ps到底怎么用
  • win10桌面添加画图图标
  • window10重置和做系统的区别
  • sendmail邮件服务器的配置
  • visual studio 10 cocos2dx项目移植到eclipse的android项目(配置请参照上一篇文章开发环境搭建)
  • shell中的循环语句有哪些
  • JavaScript打开WPS
  • jquery层次选择器主要包括哪几种分类
  • python tkinter tabview
  • jQuery插件库
  • js命名函数
  • jquery查找指定元素
  • 副局长哪里任命
  • 城市垃圾处理费会计分录
  • 持有上海市居住证一年以上是什么意思
  • 税局如何查账
  • 曲靖市国家税务局杨春天
  • 怎么删除天眼查的判决文书
  • 江西省国家税务局李德平
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设