位置: 编程技术 - 正文

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)

  • 收到退个税手续费要交增值税吗?
  • 汽车保养 美容
  • 企业所得税的会计核算
  • 出口关税税率表
  • 政府奖励企业如何申请
  • 运输服务增值税纳税义务发生时间
  • 以前年度损益调整属于哪类科目
  • 转让固定资产发生的费用可以税前扣除吗
  • 明细分类账采用的格式有
  • 生产企业出口货物会计分录
  • 研究开发费用的归集
  • 辅导期一般纳税人
  • 商业企业月末结转成本
  • 国有企业业务招待费管理办法
  • 出口货款收不回来怎么办
  • 融资贷款保险费计算公式
  • 流动资产投资的特点有
  • 转让合同债权
  • 蓝字发票是什么票据类型
  • 污水处理厂的财务处理流程
  • 购金蝶软件记什么科目
  • 企业购买结构性存款会计处理
  • 土地契税及印花税缴纳规定
  • 预提厂房租金
  • 去年的发票可以红冲重新开具吗?
  • win11发热严重怎么解决
  • 表彰比例如何确定
  • 购入已提足折旧的固定资产
  • php中apache的配置
  • php连接sqlserver2008
  • 什么是suv汽车
  • win7系统怎么操作
  • 红冲暂估需要附件吗
  • 正爬上唐娜·诺克沙滩的灰海豹,英格兰北林肯郡 (© Frederic Desmette/Minden Pictures)
  • 应付福利费和应付职工薪酬的关系
  • 事业单位委托业务费拨付时是否需要发票
  • 人工智能示例
  • 安装工程在工程建设中的主要内容有哪些
  • php静态函数
  • 造孽啊啥意思
  • 帝国cms安装教程
  • 客户购买商品的条件?
  • 种植中药材公司取名字大全
  • 促销服务费分录
  • mysql_assoc
  • 小规模纳税人升为一般纳税人条件
  • 免税农产品有哪些类型
  • datatable怎么用
  • 个税手续费发给财务人员 文件
  • 法人和税务可以是一个人吗
  • 企业对于无法收回的应收账款,应列入
  • 增值税进项税转出有哪些
  • 公司有美金账户如何做账
  • 预提短期借款利息的会计科目
  • 纳税人将外购的货物用于非应税项目
  • 专票入账用哪一联
  • 暂估入库可以隔几个月再冲回吗
  • 填制费用报销单怎么填写
  • 什么叫自主研发
  • sql server 错误
  • initcause
  • windows7怎么打开开机启动项
  • windows十桌面
  • windows7可以打开多个窗口
  • centos fuser
  • win10远程桌面连接教程
  • linux查看rpm是否安装
  • Append、Debug、Diskcomp命令的使用说明
  • Windows上安装Python
  • nodejs readfile
  • unity2018.4破解
  • jquery教程chm
  • flash谈广告
  • android布局文件详解
  • python动态加载py
  • js方法不执行
  • 四川国税网上申报
  • 充电桩充电怎么收费,几种收费方法
  • 车辆购置税查询不到
  • 三方协议暂不支持缴款
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设