《.Net框架设计》 |
版本 |
作者 |
参与者 |
完成日期 |
备注 |
YanlzFramework_.Net_V01_1.0 |
严立钻 |
|
2019.02.15 |
|
|
|
|
|
|
##《.Net框架设计》发布说明:
++++“.Net框架设计”:是对“.Net框架设计”的一个了解,由于最近对公司产品框架进行了重构,从内到外全面重构,涉及到产品框架、软件框架、服务器架构等,工作量非常大,而且风险也不小;那为什么要做这么大的重构呢?随着产品线的不断丰富,单一产品框架已经不能满足日益增长的业务需求,所以需要一个产品战略级的重构,而不是项目级堆积修补;
++++“.Net框架设计”:定位在一个科普类知识,让大家知道产品级框架设计思想!
##《.Net框架设计》目录
#第一篇:框架设计的基本概念
#第二篇:框架的精髓
#第三篇:框架的灵活性及扩展性
#第四篇:框架的工具可视化使用
#第五篇:立钻哥哥对.Net框架设计的拓展
#推广:【XR游戏开发QQ群:784477094】
#第一篇:框架设计的基本概念 |
#第一篇:框架设计的基本概念
++++立钻哥哥:学习如何颠覆程序设计思维:基于大型互联网系统架构解析.Net高级设计艺术;框架本意是肩负着架构的直接着陆,框架存在的意义不是为了帮助我们快速开发,而是能够在架构设计之后将这张蓝图通过不同的框架,让架构能从一个理想化的抽象概念变成一个能够真正运转起来的核心代码块,而那些核心代码块是模式在背后支撑的;
++++A.1、什么是框架设计
++++A.2、.Net框架设计的C#进阶
++++A.3、立钻哥哥对.Net框架设计基本概念的拓展
##A.1、什么是框架设计 |
++A.1、什么是框架设计
++++立钻哥哥:框架设计不仅仅是代码模式(传统设计模式),不是只有学会了设计模式就能开发一个很好的框架,通过配置文件可以很方便地避开强代码,动静结合可以将开发时、编译时、运行时3个不同的阶段产生的代码最终合并在一起动态运行,这些高级应用跟我们能熟练使用设计模式关系不是很大;
++++A.1.1、什么是框架
++++A.1.2、什么是框架设计
++++A.1.3、框架设计的核心元素
++++A.1.4、立钻哥哥对框架设计概念的拓展
###A.1.1、什么是框架 |
++A.1.1、什么是框架
++++立钻哥哥:软件开发要满足用户的功能性需求,只有在满足了功能性需求的前提下,非功能性需求才算有价值的;软件开发的两大需求:功能性需求和非功能性需求;
++++[非功能性需求]:安全、性能、稳定性、易维护、易伸缩;
++++框架就是肩负着功能性需求和非功能性需求安全落地的保障者;在开发期间,如果我们能使用某个框架来解决某个特定的问题域,那么后续的非功能性需求完成起来将会变得很平滑,不会因为一些非功能性需求使我们的项目延期,或是变得很脆弱;
++++框架的主要作用就是让我们更好地实现非功能性需求,因为非功能性需求直接影响着功能性需求的使用;良好的用户体验、良好的视觉效果,这些都是软件产品所必需的;
++框架和组件的区别
++++立钻哥哥:其实框架与组件的区别在于框架应该是基础组件,组件化拆分所有的业务模块,分割关注点;
++框架与Library、API的区别
++++立钻哥哥:框架相对比较强大,能解决某一类复杂的问题集,这是由于它本身就肩负着重要的任务,所以框架的示例代码很重要,需要用很简短的方式来表达框架的作用,方便入门,让框架使用者有兴趣了解使用;
++++[Library]:是一个相对比较小的API的封装;
++++[API]:可以理解成目录式的方法;
++SOA架构(Service-Oriented Architecture)
++++立钻哥哥:以大型互联网系统架构为背景,基于当下最流行的SOA架构,针对最切合当前的互联网业务展开框架设计,保证框架设计的众多实践都具有科学依据;
++++[SOA架构]:面向服务的架构(SOA:Service-Oriented Architecture)是一个组件模型,它将应用程序的不同功能单元(称为服务)进行拆分,并通过这些服务之间定义良好的接口和契约联系起来;接口是采用中立的方式进行定义的,它应该独立于实现服务的硬件平台、操作系统和编程语言;这使得构建在各种各样的系统中的服务可以以一种统一和通用的方式进行交互;
++++面向服务架构,它可以根据需求通过网络对松散耦合的粗粒度应用组件进行分布式部署、组合和使用;服务层是SOA的基础,可以直接被应用调用,从而有效控制系统中与软件代理交互的人为依赖性;
++++SOA是一种粗粒度、松耦合服务架构,服务之间通过简单、精确定义接口进行通讯,不涉及底层编程接口和通讯模型;SOA可以看作是B/S模型、XML/Web Service技术之后的自然延伸;
++++SOA将能够帮助软件工程师们站在一个新的高度理解企业级架构中的各种组件的开发、部署形式,它将帮助企业系统架构者以更迅速、更可靠、更具重用性架构整个业务系统;较之以往,以SOA架构的系统能够更加从容地面对业务的急剧变化;
++++SOA系统是一种企业通用性架构;
++框架的生命周期
++++立钻哥哥:框架在其生命周期中,为了满足各种需求,需要不断地维护;在多系统之间复用框架,必然会出现很多定制化需求,所以框架在其生命周期中经常要维护修改,只有这样框架才会一直保持着重要的价值;
++++框架的生命周期过程和任何一个非功能性需求的生命周期过程在特征上基本一致,都会面临着各种修改;
++++框架并不是固定不变的;
###A.1.2、什么是框架设计 |
++A.1.2、什么是框架设计
++++立钻哥哥:框架设计有着复杂的过程,每一步都需要进行严格的把关;
++确定问题域和识别变化点
++++立钻哥哥:模式驱动模型,模型驱动设计;确定了问题域之后,就可以选择相应的模式来驱动出符合当前问题域的框架架构;
++++[问题域]:就是将要用框架来解决的问题范围,有了范围之后我们才可以针对每个点进行详细的分析;
++++[变化点]:变化点的整理可以让我们更细致地了解架构,这对后面的架构选择很重要,因为架构模型是由架构模式驱动出来的;
++++[模式]:是对某一类固定问题的求解方式和方法,是经验的总结;
++选择合适的架构模式、配置变化数据、可视化管理
++++立钻哥哥:通常一种模式对应一种问题的解决方法,不过在必要情况下需要组合多个模式来搭建一个符合当前问题域的模式出来;
++++框架设计中另一个很重要的部分就是可视化:一个完整的框架必须配备可视化工具来帮助我们方便地使用框架和管理框架;
###A.1.3、框架设计的核心元素 |
++A.1.3、框架设计的核心元素
++++立钻哥哥:框架设计核心三要素:框架模式、配置和工具;框架模式是骨架,配置是变化点,工具是辅助管理,从框架的架构到变化的配置再到框架的使用工具,这是一条正确的框架设计指导路线;
++++[框架模式]:是一套针对框架设计而言的解决方法,不同的模式解决不同的问题域,可以使用单一的模式来解决一个单一的问题,也可以使用一整套模式来解决一个复杂的问题;
++++[框架配置]:框架设计必然少不了对一些数据和逻辑的配置;
++++[框架工具]:框架的可视化部分非常重要,尤其是现代大型企业级应用架构中,任何一个地方出现问题都会引起一些连带反应,这个时候我们需要使用工具来定位到问题,或者起码要帮助我们定位到问题;
++框架工具
++++立钻哥哥:框架工具需要在开发时、编译时、运行时等方面提供对框架使用的支持;
++++[开发时]:要在开发时带有部分可视化自动完成的功能,最后是集成在Visual Studio中的插件,当然这取决于框架的使用方式;
++++[编译时]:企业级分布式框架需要在很多环境中运行,在测试阶段需要在测试环境中运行,在发布到生成线之后就需要在真实的环境中运行,不同的环境,需要配置不同的环境信息,测试环境可能不存在负载均衡,而在真实环境中会有集群,这个时候就需要在使用框架编译时能够生成一些环境变量信息;
++++[运行时]:运行时的工具责任重大,日志、监管、调试等功能都需要框架提供,有了这些功能,对框架使用才会更有信心;
###A.1.4、立钻哥哥对框架设计概念的拓展 |
++A.1.4、立钻哥哥对框架设计概念的拓展
++++立钻哥哥:一个架构师 构架了一个框架,约束框架使用者只能使用规定的结构来进行二次开发;
++++架构是指软件结构的专用名词,构架只是架构的另一种叫法;框架是半成品;框架是系统或子系统的半成品;
++.Net框架参考
++++立钻哥哥:.Net框架;
++其他框架设计模型参考
++++立钻哥哥:提供框架设计模型的参考;
##A.2、.Net框架设计的C#进阶 |
++A.2、.Net框架设计的C#进阶
++++立钻哥哥:C#作为一门强类型的、面向对象的强大编程语言,有着接近完美的结构,让人爱不释手;
++A.2.1、类、继承、接口
++++立钻哥哥:类是用来体现领域模型的元素,所有我们对类的定义要尽量贴近领域模型,贴近真正的业务逻辑,将领域模型中的数据、逻辑进行抽象归纳,最后得出一个丰富饱满的对象;
++++[类]:类是定义对象结构的一个过程,静态语言都需要这样的一个定义过程,也就是定义对象实例化的模板,从这个模板出来的所有对象都是一致的;类是对业务建模过程的定义,通过面向对象的思想来将业务切割、建模,并创建出一个个具有真实业务概念的类时,类才会体现出这门设计语言的价值和重要性;
++A.2.2、字段、属性、常量、枚举
++++立钻哥哥:字段是用来保存状态值的最终归宿,在类中声明一个字段,最为重要的就是考虑它的访问范围,设计原则告诉我们,字段尽量使用属性进行包装访问,这对后面的重构很有帮助;
++++[属性]:通过属性对字段进行包装;
++A.2.3、方法、委托、事件
++++立钻哥哥:方法扮演着对象的行为一职,因此就存在着重用,当类型被继承时就会涉及对基类行为的访问和扩展;
++++[委托(delegate)]:通过委托,可以在不需要方法宿主实例的情况下直接调用某个方法,很实用;委托将方法对象化,然后可以无任何时空限制地传递这个对象,甚至可以序列化到地球的另一端,然后再自然地调用;委托是对方法的对象化包装,其主要目的是让方法可以传递,这可以让我们在计算某个逻辑的时候无缝地集成一些第三方过滤算法;使用委托我们可以轻而易举地注入一些参数化的逻辑,这些逻辑不是传统的值,而是一组可以改变内部运算结果的对象;
//立钻哥哥:带自定义过滤逻辑的委托对象 public List<Item> Filter(Func<Item, bool> filter){ var result = from item in Items where filter(item) select item; return result.DefaultIfEmpty().ToList(); }
public double GetPrices(){ this.Filter(item=>{ if(item.Price <= 0){ return true; } return false; });
return this.OperationPrices.GetPrices(this); } |
++++[事件]:多播事件注意内存溢出,如果事件是可以被多个对象监听的,那么在释放对象时一定要及时清理你所暴露出来的事件;移除时的判断,在对事件进行移除时,一定要记住先判断,然后再进行移除操作;异步领域事件与事件回溯,在复杂业务场景中,会使用异步事件来保存领域状态,必要时用回溯事件值来还原领域模型;
++A.2.4、泛型、协变/逆变、类型推断
++++立钻哥哥:泛型的出现让模板化代码成为可能,我们可以共用一组算法对任何领域实体进行相同的计算,这也是泛型元素出现的根本需求;
++++[泛型]:泛型可以让类型参数化,这就允许我们在设计功能的时候可以提高设计思路,更加提高面向对象编程;
++++[接口协变性]:public interface IMergeOrderList<out TOrder> where TOrder : Order{}
++A.2.5、扩展方法
++++立钻哥哥:扩展方法是让我们在不改变类原有代码的情况下动态地添加方法的方式,这给面向对象设计、模块设计带来了质的提升;
++++扩展方法能在不需要修改被扩展类的代码的情况下动态地添加行为,这为灵活性设计带来了一把利剑,也为持续版本更新带来了福音;我们完全可以将扩展方法独立于一个干净的DLL中,与具体的被扩展类区分开来,这样就会减少问题的出现;扩展方法可以使我们进行链式编程;
++A.2.6、部分类、部分方法
++++立钻哥哥:部分类和部分方法是编译时的动态合并功能,并非运行时的,是C#与编译器为了帮助我们进行局部独立变化而用的;它可以将类的定义分开在一个或多个类文件中,这为代码自动生成提供了很好的环境;
++++部分类、部分方法为框架的开发提供了对外扩展这样一个强大的功能,可以将部分代码通过插件的方式自动生成,而部分方法我们只保留抽象定义部分,就好像设计模式中的模板方法模式;最后将业务逻辑和自动生成的代码完美地结合;
//立钻哥哥:EmployeeTemp.cs public partial class Employee{ public string Name{ get; set; } public void GetEmployeeFullName(){} }
|
//立钻哥哥:YanlzEmloyee.cs public partial class Employee{ } |
//立钻哥哥:在两个独立的物理文件中定义了相同的类名Employee,但我们可以完整地使用其中的成员 Employee employee = new Employee(); employee.GetEmployeeFullName(); var name = employee.Name; |
++A.2.7、特性、元数据
++++立钻哥哥:特性可以理解为附加在类型上的一段数据属性,可以称为类型的元数据;
++++熟练掌握特性的使用对框架设计来说至关重要;
++++参数元数据通常用来作为上游对下游的约定,也就是说用来获取参数特性的功能点是在方法的调用端,然后根据该方法所用的参数元数据来约定该参数;
++A.2.8、反射、代码对象模型、动态编译、动态缓存
++++立钻哥哥:反射是运行时动态获取.Net类型元数据的功能;
++++在运行时,.Net会将我们定义的每一个类型保存一份元数据表,这就是我们要在运行时动态获取一个类型的元数据的基础元数据字典;在运行时动态生成代码,然后再动态编译,最后再动态缓存起来;
++++DOM文档对象模型就是通过文档来保存对象的结构,是对象的文档持久化;
++++通过.Net提供的提要CodeDom模板生成代码之后,就可以通过.Net提供的动态编译模块将一组代码字符串动态地编译成可以直接运行的内存对象,这样我们就可以将原本需要很多反射步骤才能完成的事情通过直接调用的方式来完成,这将大大提高程序的性能;最后将动态生成的对象缓存起来,在下一次需要的时候再直接读取出来使用,这就保证反射对性能的消耗只在第一次,而后续的同样的功能将等同于类级别的直接调用;
##A.3、立钻哥哥对.Net框架设计基本概念的拓展 |
++A.3、立钻哥哥对.Net框架设计基本概念的拓展
++++立钻哥哥:如何运用C#语言的优势和特点来改进传统设计模式的代码结构;
++A.3.1、创建型:工厂模式、工厂规则注入、委托工厂
++++立钻哥哥:使用C#委托对象可以实现工厂规则注入;
//立钻哥哥:我们将具体的逻辑放在工厂的调用端,这些变化的逻辑实际上是和被调用端紧密相关的,和工厂没有太多的关系;而工厂本身就要支持定制化需求,将需要定制化的逻辑注入,然后工厂将其带入到合适的流水线上进行生产即可,这将大大增加工厂的灵活性; public class MyEmployeeFactory{ public static MyEmployee(string name, string address, Func<string, bool> logic, Func<string, string> filterName){ if(logic(name)){ return new MyEmployee(){ Name = filterName(name), Address = address }; }
return new MyEmployee(){ Name = name, Address = address }; } } //立钻哥哥:public class MyEmployeeFactory{} |
++A.3.2、行为型:观察者模式、基于事件的观察者
++++立钻哥哥:使用C#事件机制能很好地实现观察的效果,而无需再生硬地使用对象实例调用的方式;
++++行为型模式的一个共同点:就是将一些需要的参数通过委托传递出去;所以在设计观察事件的委托类型时,一定要仔细分析委托参数的业务场景,尽量将参数分门归类,形成明了的参数上下文对象;
++A.3.3、结构型:桥接模式、扩展方法
++++立钻哥哥:使用C#扩展方法可以很好地将部分实现动态地绑定到抽象的对象上,而抽象的对象不需要做任何改动就可以调用这些扩展方法,这种方法用于扩展接口有着天生的优势;
++++扩展方法实现的桥接模式与使用继承实现的桥接模式有着本质的区别,扩展方法并不直接依赖某个抽象的部分,不再直接使用继承的实现,而是使用在签名上,有着天然的高适应性,可以随意地无限横向扩展;
++++优先考虑使用扩展方法来设计有关抽象与实现分离的模式,除了桥接模式,其他相关模式都可以使用C#天然的扩展方法优势来最大化使用模式的优点;
++A.3.4、编码时应注意防御性、稳定性和性能
++++立钻哥哥:防御性判断指我们不应该总是那么相信目前正在调用的接口或返回的数据结果正是我们所期望的值,而要加以判断,特别是在多人合作开发的时候,对每个将要处理的元素,都要先进行验证;
++++[避免直接返回NULL,保持80%的稳定性]:由于没有进行NULL判断导致的BUG占程序中总BUG的80%之多:未将对象引用设置到对象的实例;比较合理的做法是尽量不返回NULL,而是返回空对象;按经验来看,在靠近外部的方法中尽量不返回NULL,而在靠近领域模型的代码时可以返回NULL;
++++[空对象模式和扩展方法的NULL验证]:空对象模式是用来给原本为NULL的对象赋一个具有NULL意义的实例,让用户的引用始终有一个实例,而这个实例是表示没有任何值的空实例,主要是用来做判断的;通过扩展方法可以完成很多以往很难或者无法完成的设计效果;
++++[注重性能的编码方式]:在编写代码时,要保持资源释放的警惕性,时刻提醒自己如何提高性能,至少要做到减少无辜资源的浪费;在对象使用时再实例化;在对象不使用时及时设置为NULL;使用IDisposable接口来声明有重要资源需要及时释放;(IDisposable接口是用来声明该对象内部有重要的资源需要在不使用时及时释放的,像数据库连接、消息池对象,这些都是很重要、很有限的系统资源;尤其是当对象使用到本地非托管资源时,一定要记住及时地实现IDisposable接口,而使用者也一定要及时调用IDisposable.Dispose()方法或者使用Using()语句来自动地释放资源)
++A.3.5、单元测试、可测试性代码、持续重构
++++立钻哥哥:单元测试的重要性及核心意义;重构与单元测试的重要关系;
++++[单元测试的重要性及核心意义]:单元测试是一种保证我们所写的代码在整个生命周期中都不会出现BUG的防火墙,是具有重要价值的软件过程制品之一;我们需要随时随地地进行重构,而不需要害怕自己的修改是否会使以往的代码出现BUG;
++++[可测试性代码的重点]:设计原则中很重要的一条就是“面向接口编程而非实现”;为了解决被测试类的依赖挂你,需要将类中所有依赖其他实现类或外部不确定资源的对象全部抽象成接口,然后对接口进行动态模拟实现,这样任何面向对象设计的问题都可以通过添加一个间接层来解决;有了接口之后就可以借助于动态生成技术来对接口生成一个模拟的实现类,而这个动态实现类的生成规则正是单元测试所需要辅助的规则;
++++[TDD(Test Driven Design,测试驱动设计)]:是指先写单元测试用例,然后写测试用例的代码实现;这样可以保证所有的代码都是经过测试的,不会存在有问题的代码,从而保证运行在生产线上的代码都是安全的;
++A.3.6、第三方库是可插拔的、依赖库的版本
++++立钻哥哥:框架的设计或多或少会借用一些第三方的库来辅助实现,随着框架的规模越来越大,借用的第三方库会变得越来越多;
++++[依赖抽象接口]:将需要依赖的第三方库抽象成一个接口,内部只使用这个抽象的接口,断开与第三方库的直接依赖,这会使我们的实现更灵活;
++++[依赖库的版本]:正确引用第三方库需要有版本的验证;在对第三方库进行动态加载时需要做版本约束性检查,同时需要将每个依赖版本的信息都文档化,以便查询目前正在使用的库版本;
#第二篇:框架的精髓 |
++立钻哥哥推荐的拓展学习链接(Link_Url):
立钻哥哥推荐的拓展学习链接(Link_Url) |
++++立钻哥哥Unity 学习空间: http://blog.csdn.net/VRunSoftYanlz/
++++Unity5.x用户手册:https://blog.csdn.net/VRunSoftYanlz/article/details/81712741
++++Unity面试题ABC:https://blog.csdn.net/vrunsoftyanlz/article/details/78630687
++++Unity面试题D:https://blog.csdn.net/VRunSoftYanlz/article/details/78630838
++++Unity面试题E:https://blog.csdn.net/vrunsoftyanlz/article/details/78630913
++++Unity面试题F:https://blog.csdn.net/VRunSoftYanlz/article/details/78630945
++++Cocos2dx面试题:https://blog.csdn.net/VRunSoftYanlz/article/details/78630967
++++禅道[zentao]:https://blog.csdn.net/VRunSoftYanlz/article/details/83964057
++++框架知识点:https://blog.csdn.net/VRunSoftYanlz/article/details/80862879
++++游戏框架(UI框架夯实篇):https://blog.csdn.net/vrunsoftyanlz/article/details/80781140
++++游戏框架(初探篇):https://blog.csdn.net/VRunSoftYanlz/article/details/80630325
++++.Net框架设计:https://blog.csdn.net/VRunSoftYanlz/article/details/87401225
++++设计模式简单整理:https://blog.csdn.net/vrunsoftyanlz/article/details/79839641
++++专题:设计模式(精华篇):https://blog.csdn.net/VRunSoftYanlz/article/details/81322678
++++U3D小项目参考:https://blog.csdn.net/vrunsoftyanlz/article/details/80141811
++++Unity案例(Vehicle):https://blog.csdn.net/VRunSoftYanlz/article/details/82355876
++++UML类图:https://blog.csdn.net/vrunsoftyanlz/article/details/80289461
++++PowerDesigner简介:https://blog.csdn.net/VRunSoftYanlz/article/details/86500084
++++Unity知识点0001:https://blog.csdn.net/vrunsoftyanlz/article/details/80302012
++++Unity知识点0008:https://blog.csdn.net/VRunSoftYanlz/article/details/81153606
++++U3D_Shader编程(第一篇:快速入门篇):https://blog.csdn.net/vrunsoftyanlz/article/details/80372071
++++U3D_Shader编程(第二篇:基础夯实篇):https://blog.csdn.net/vrunsoftyanlz/article/details/80372628
++++Lua快速入门篇(Xlua拓展):https://blog.csdn.net/VRunSoftYanlz/article/details/81173818
++++Lua快速入门篇(XLua教程):https://blog.csdn.net/VRunSoftYanlz/article/details/81141502
++++Lua快速入门篇(基础概述):https://blog.csdn.net/VRunSoftYanlz/article/details/81041359
++++Unity引擎基础:https://blog.csdn.net/vrunsoftyanlz/article/details/78881685
++++Unity面向组件开发:https://blog.csdn.net/vrunsoftyanlz/article/details/78881752
++++Unity物理系统:https://blog.csdn.net/vrunsoftyanlz/article/details/78881879
++++Unity2D平台开发:https://blog.csdn.net/vrunsoftyanlz/article/details/78882034
++++UGUI基础:https://blog.csdn.net/vrunsoftyanlz/article/details/78884693
++++UGUI进阶:https://blog.csdn.net/vrunsoftyanlz/article/details/78884882
++++UGUI综合:https://blog.csdn.net/vrunsoftyanlz/article/details/78885013
++++Unity动画系统基础:https://blog.csdn.net/vrunsoftyanlz/article/details/78886068
++++Unity动画系统进阶:https://blog.csdn.net/vrunsoftyanlz/article/details/78886198
++++Navigation导航系统:https://blog.csdn.net/vrunsoftyanlz/article/details/78886281
++++Unity特效渲染:https://blog.csdn.net/vrunsoftyanlz/article/details/78886403
++++Unity数据存储:https://blog.csdn.net/vrunsoftyanlz/article/details/79251273
++++Unity中Sqlite数据库:https://blog.csdn.net/vrunsoftyanlz/article/details/79254162
++++WWW类和协程:https://blog.csdn.net/vrunsoftyanlz/article/details/79254559
++++Unity网络:https://blog.csdn.net/vrunsoftyanlz/article/details/79254902
++++PhotonServer简介:https://blog.csdn.net/VRunSoftYanlz/article/details/86652770
++++编写Photon游戏服务器:https://blog.csdn.net/VRunSoftYanlz/article/details/86682935
++++C#事件:https://blog.csdn.net/vrunsoftyanlz/article/details/78631267
++++C#委托:https://blog.csdn.net/vrunsoftyanlz/article/details/78631183
++++C#集合:https://blog.csdn.net/vrunsoftyanlz/article/details/78631175
++++C#泛型:https://blog.csdn.net/vrunsoftyanlz/article/details/78631141
++++C#接口:https://blog.csdn.net/vrunsoftyanlz/article/details/78631122
++++C#静态类:https://blog.csdn.net/vrunsoftyanlz/article/details/78630979
++++C#中System.String类:https://blog.csdn.net/vrunsoftyanlz/article/details/78630945
++++C#数据类型:https://blog.csdn.net/vrunsoftyanlz/article/details/78630913
++++Unity3D默认的快捷键:https://blog.csdn.net/vrunsoftyanlz/article/details/78630838
++++游戏相关缩写:https://blog.csdn.net/vrunsoftyanlz/article/details/78630687
++++HTC_VIVE开发基础:https://blog.csdn.net/VRunSoftYanlz/article/details/81989970
++++Oculus杂谈:https://blog.csdn.net/VRunSoftYanlz/article/details/82469850
++++Oculus安装使用:https://blog.csdn.net/VRunSoftYanlz/article/details/82718982
++++SteamVR简介:https://blog.csdn.net/VRunSoftYanlz/article/details/86484254
++++SteamVR脚本功能分析:https://blog.csdn.net/VRunSoftYanlz/article/details/86531480
++++SteamVR2.0开发指南:https://blog.csdn.net/VRunSoftYanlz/article/details/86618187
++++SteamVR/Extras:https://blog.csdn.net/VRunSoftYanlz/article/details/86584108
++++SteamVR/Input:https://blog.csdn.net/VRunSoftYanlz/article/details/86601950
++++OpenXR简介:https://blog.csdn.net/VRunSoftYanlz/article/details/85726365
++++VRTK杂谈:https://blog.csdn.net/VRunSoftYanlz/article/details/82562993
++++VRTK快速入门(杂谈):https://blog.csdn.net/VRunSoftYanlz/article/details/82955267
++++VRTK官方示例(目录):https://blog.csdn.net/VRunSoftYanlz/article/details/82955410
++++VRTK代码结构(目录):https://blog.csdn.net/VRunSoftYanlz/article/details/82780085
++++VRTK(SceneResources):https://blog.csdn.net/VRunSoftYanlz/article/details/82795400
++++VRTK_ControllerEvents:https://blog.csdn.net/VRunSoftYanlz/article/details/83099512
++++VRTK_InteractTouch:https://blog.csdn.net/VRunSoftYanlz/article/details/83120220
++++UnityAPI.Rigidbody刚体:https://blog.csdn.net/VRunSoftYanlz/article/details/81784053
++++UnityAPI.Material材质:https://blog.csdn.net/VRunSoftYanlz/article/details/81814303
++++UnityAPI.Android安卓:https://blog.csdn.net/VRunSoftYanlz/article/details/81843193
++++UnityAPI.AndroidJNI安卓JNI:https://blog.csdn.net/VRunSoftYanlz/article/details/81879345
++++UnityAPI.Transform变换:https://blog.csdn.net/VRunSoftYanlz/article/details/81916293
++++UnityAPI.WheelCollider轮碰撞器:https://blog.csdn.net/VRunSoftYanlz/article/details/82356217
++++UnityAPI.Resources资源:https://blog.csdn.net/VRunSoftYanlz/article/details/83155518
++++JSON数据结构:https://blog.csdn.net/VRunSoftYanlz/article/details/82026644
++++CocosStudio快速入门:https://blog.csdn.net/VRunSoftYanlz/article/details/82356839
++++VR实验:以太网帧的构成:https://blog.csdn.net/VRunSoftYanlz/article/details/82598140
++++FrameVR示例V0913:https://blog.csdn.net/VRunSoftYanlz/article/details/82808498
++++FrameVR示例V1003:https://blog.csdn.net/VRunSoftYanlz/article/details/83066516
++++SwitchMachineV1022:https://blog.csdn.net/VRunSoftYanlz/article/details/83280886
++++PlaySceneManagerV1022:https://blog.csdn.net/VRunSoftYanlz/article/details/83280886
++++Unity企业内训(目录):https://blog.csdn.net/VRunSoftYanlz/article/details/82634668
++++Unity企业内训(第1讲):https://blog.csdn.net/VRunSoftYanlz/article/details/82634733
++++Unity企业内训(第2讲):https://blog.csdn.net/VRunSoftYanlz/article/details/82861180
++++Unity企业内训(第3讲):https://blog.csdn.net/VRunSoftYanlz/article/details/82927699
++++Unity企业内训(第4讲):https://blog.csdn.net/VRunSoftYanlz/article/details/83479776
++++Unity企业内训(第5讲):https://blog.csdn.net/VRunSoftYanlz/article/details/83963811
++++Unity企业内训(第6讲):https://blog.csdn.net/VRunSoftYanlz/article/details/84207696
++++钻哥带您了解产品原型:https://blog.csdn.net/VRunSoftYanlz/article/details/87303828
++++插件
++++计算机组成原理(教材篇):https://blog.csdn.net/VRunSoftYanlz/article/details/82719129
++++立钻哥哥Unity 学习空间: http://blog.csdn.net/VRunSoftYanlz/
--_--VRunSoft:lovezuanzuan--_--