初入虚幻引擎全流程开发所涉及的一些基础知识,为了各位方便翻阅我改编了一遍文字版。

UE4之全流程开发基础知识(上)

      经过一年的时间,终于通过UE4将去年的《PERIODIC TABLE 元素周期表 概念设计》成功实现出来,也是对初入学习UE4第一个学习项目。这其中也是踩了大大小小不少坑,这座山找不到解决办法,翻到另一座山解决。看不懂的鸟语找各种朋友帮忙。公司的程序大哥哥小姐姐们都快被烦死了。最终才搞定这个学习项目。

      现在我将项目中涉及到功能点与大大小小的坑整理在这里,感兴趣的朋友可以看看(全文大概在2.4万字),希望对想研究UE4这款引擎的朋友有所帮助。之后我会将发布程序与项目源文件分享在百度云与github上。同时我会将X-MIND版与WORD版的内容放置在百度云。项目程序请使用4.25.4或高于的UE4版本。

      随着数字孪生的日益普及与逐渐进入大众的视野,虚幻引擎已经不仅仅用来制作游戏了。涉及领域甚是包含建筑可视化、影视制作、产品制造展示与数据可视化展示。同时随着近期UE5的体验版发布后伴随Nanite虚拟几何体与Lumen功能的出现,致使我们能够更容易更简单的构建一个更真实数字虚拟世界。

      虚幻引擎并不是一个简单的3D软件,它是一个全面性的开发编辑器, 其学习难度要远高其他三维设计软件,甚至会涉及一定的代码逻辑与知识,同时还需要多软件的联合制作。其中会涉及到PS、XD、AI、AE、DW(代码编辑器)、C4D/3DMAX/MAYA(基础建模软件)、Substance Alchemist、Substance Designer、FontCreator(字体库编辑软件),为什么会涉及这些软件我会在下面的功能点介绍里说明。

接下来我会根据开发本项目我所应用及所涉及到功能点做部分的介绍与说明,毕竟虚幻引擎这个东西真心不像其他软件1、2年就可以玩透的,我只能为各位介绍下我所用的一些功能点与制作时碰到的坑。

      这里我将所用的内容分类为资产管理、模型、贴图制作与导入、字体应用、材质、参数集、枚举、蓝(Actor)、数据表、UMG(用户界面)。

元素每个区域的信息

 

元素模块内容信息所使用的各种字体与字重 

区分的是周期表中的区域,分为s、d、ds、p区,是按电子填充规律划分的

全新的用户界面,采用橙与蓝的互补色的搭配,为整体项目提升科技感的同时带有一丝暖意。全新的界面还对数据内容进行重新的编排,使用户可以更清晰的查阅每个元素的数据内容。

      接下来我会根据开发本项目我所应用及所涉及到功能点做部分的介绍与说明,毕竟虚幻引擎这个东西真心不像其他软件1、2年就可以玩透的,我只能为各位介绍下我所用的一些功能点与制作时碰到的坑。

      这里我将所用的内容分类为资产管理、模型、贴图制作与导入、字体应用、材质、参数集、枚举、蓝(Actor)、数据表、UMG(用户界面)。

 

      资产管理顾名思义就是对项目所应用的所有资产的一个管理,比如关卡、材质、贴图、媒体文件、蓝图、字体、数据表等等。所以不做过多的说明,在这我只说下各位需要主要的问题。
首先,对于没有接触过代码的朋友会有一个问题,就是文件名会用中文去命名,这时就可能会出现引擎无法识别路径找不到对应内容的问题,所以各位尽量所有都使用英文命名。
其次,部分文件不会被添加到资产目录里需要手动添加,比如媒体文件与字体文件,因为这些文件在创建是引擎是让咱们选择的外部路径。如果需要分享项目文件时就会出现这些外部文件找不到链接的问题。
最后来说下如果使用了中文命名引擎找不到路径怎么解决,这里并不是简单的修改一下名字就能解决的。首先各位在修改完文件名后,可能会出现修改后的文件未被指向到源位置和被复制了一份并且原文件无法删除的情况,这时需要右键文件或文件夹选择“修复重定向器”这时文件就会被重新指向到源位置然后就可以手动删除原文件了,如果在资产管理器里无法删除可以手动找到文件目录在目录里删除。其中需要注意的是千万不要再外部修改文件名一定再资产管理器里修改,不然会出现报错问题。

      模型具体怎么导入用什么格式这类的就不说了,主要说下在导入模型时需要注意的。

      首先就是法线方向,本人用的C4D在导入模型时很多法线是返的,在导入至UE4种后就会发现模型上了材质看不到 ,解决方法有两个,一个是开启材质的双面材质这个明显不太友好,后期还会碰到其他问题,所以最好还是手动调整好所需的发现方向后再次导入模型。

      然后就是模型轴的位置,有时会发现模型导入后,模型并没有在轴中心位置,而便宜的很多,这时需要手动调整轴位置后再次重导入。

      最后就是模型材质尽量使用材质实例,这样方便后期的材质调整。

      至于LOD,UE4自带自动的LOD一般来说是可满足大部分需求,但是如果最求完美还是自行制作,不过随着UE5体验版的发布我想也没有什么必要了。

      贴图所支持的格式也蛮多的这里也就不挨个说明了。主要需要注意LOD,虽然模型有自动LOD、UE5有Nanite,但是贴图好像并没有,所以在大量使用高清贴图时还是会影响程序的运行速度。所以还需通过层次细节内的MIP生成设置与LOD偏移去设置我们所需的贴图大小,然后结合蓝图节点去控制所需的LOD。

      使用OC、RS、Arnold、VRAY等渲染器的朋友尽量还是使用Substance Designer来制作贴图,虽然UE4也是节点编辑器,但是器工作原理相对来还是很不友好的。

      举个例子,比如说一个简单的渐变色与渐变方向的调整,现在市面上绝对多数渲染器都只需一个节点即可完成。但是UE4就会涉及至少4-6个节点,并且还需要咱们懂得其工作原理才能调整出想要的效果。

      媒体视频需要结合动态媒体源、动态纹理与媒体功放器一同使用。主要用于模型需要动态材质,比如场景里放置了一台电视机,那么你可以让电视机播放想要的视频。

      说道这个应该会有人想到为什么不用GIF,因为目前UE4并不支持GIF格式的贴图,虽然有一个外部插件可以导入GIF并使用,但是综合可控性是比较差得,毕竟GIF图你不能控制他何时播放何时停止,相对来说如果你只需不可控的动画效果那么用插件导入GIF贴图确实是一个不错的选择,但是这里还是推荐各位使用媒体播放的方式。

      下面来说下在使用媒体视频时都有哪些坑需要避免。

      首先,大家在建立动态媒体源时,尽量将源视频手动放置在项目资产目录里,这样在分享项目与打包项目时就不会出现丢失源文件的问题。

      其次,一个媒体播放器可以对应多个动态纹理。举个例子,比如说你有一个媒体播放器,但有2个动态纹理分别在不同的模型材质上。这时2个模型播放的是同一个视频文件,如果你需要让他们分别播放不同的视频,那么你就需要在创建一个媒体播放器才能播放不同的视频。

      导入字体后会生成一个字体样式与字体。字体样式就是所使用的字体文件,为避免分享项目与打包项目时丢失源文件,尽量将源文件放置在资产目录内,

      至于字体就是一个字体样式管理器,我们可以通过默认字体族系与子字体族系添加其他字体字重,还可通过下方预览输入内容查看具体内容的字体样式和是否用于字体样式。而退却字体族系理论上来说,当当前族系没有所需字体样式时自动使用的代替的字体样式,但是通过测试发现好像并没有用。所以这时就需要使用字库编辑软件在外部重新编辑字库再次导入,这里我用的FontCreator。

      UE4的材质编辑器相对目前市面流行的各大渲染器来说并算友好,除了需要熟练运用各种数学算法外,一些在其他渲染器看似简单的节点想要在UE4内使用是极其复杂的。

      数学运算节点是UE4内最基础且最常用的工作节点,只有熟练使用了数据节点才能制作出精美的材质。

      Multiply 乘法也可当做混合使用,制作发光材质时配合参数节点使用,快捷键m

  •       divide 除法 快捷键d

      Subtract 减法 去掉共有的纹理

      加法,将两个通道上的数值或者纹理增加到一起 快捷键“a”

      Mask(分化蒙版),用来屏蔽、分离通道,分化多维向量的值等,可通过细节面板选择所需分离或屏蔽遮罩的R、G、B通道。

      Lerp(线性,全称LinearInterpolate)线性插值 用来融合两个通道,当alpha值等于0时,融合值为A通道,为1时为B通道,因此0.5以下则为靠近A通道颜色,0.5以上靠近B通道,0.5为对等分融合,快捷键L

      Sin(正弦)与Cosine(余弦)在-1到0之间浮动的抛物线(曲线) 和time配合使用,比如可以用在物体自发光闪烁上(在-1到1之间反复运动)

      if做参数判断 A和B是基础对比判断参数,如果A>b那么输出A>B所连接的参数C,如果A=b那么输出A==B所连接的参数D,如果A<b那么输出A<B所连接的参数E。

      当勾选了材质细节面板里的使用材质属性选项后,咱们就可以使用参数材质与混合材质进行图层的混合。

      材质属性,与默认的属性接口一样,但有一个输出接口可以配合混合材质属性使用。

      UE4想要制作毛玻璃效果,并不能想其他渲染器一样提高粗糙度即可,需要使用SpiralBlur-SceneTexture高斯模糊材质函数节点来实现。这个几点其实我也没弄太明白,但是仅仅是制作简单的毛玻璃,配合参数节点控制Distance的强度,将Result与SceneColor Clamp分别配到基础颜色与透明度即可。

      在使用这个节点时也有一些问题,在毛玻璃后方的所有拥有透明材质的模型将不可见,具体原因目前我也不太清楚,可能是最大折射深度的问题,目前暂时没有很好的解决办法。

      Frensnel(菲尼尔)   学过任意一款3D软件的朋友应该都用过,所以不多说。

      TexCoord(UV坐标节点,全称TextureCoordinate)纹理坐标。

      纹理数量等于UV值相乘 U为横向 V为竖向 快捷键U

      其实算一种置换节点,需要配合数学节点与纹理节点一同使用。

      模型在全局空间内的顶点法线颜色,配合Mask节点可以输出指定通道,也可配合Multiply节点与Vertex Coolor节点制作置换效果。

      constant(一维向量) 输出R通道0-1(黑-白)的向量 快捷键1

      constant2Vector(二维向量) 输出 R G通道 快捷键2

      constant3Vector(三维向量)输出RGB通道 快捷键3

      constant4Vector(四维向量)输出RGB及alpha通道 快捷键4

      TextureSample(纹理贴图)节点如名称所示,用于贴图的调用。不仅可调用常用贴图还能调用动态媒体纹理。

      材质参数是广泛应用去UE4内的一种可调用可修改的参数值,就好如C4D中的用户数据类似(本人入门软件)。通过右键选择转换参数或提升参数,可将向量、常量、纹理等节点转换为参数节点,在通过命名,可供蓝图、用户界面、材质实例等多方面调用并对其进行参数的修改。

      通过右键材质选择“创建材质实例”来为主材质创建一个或多个子后缀为Inst的材质,子材质及时材质实例,每个材质实例都会继承主材质的所有属性,并可修改主材质内的全部参数节点与部分材质属性。

      多个材质实例可分别修改参数,也就说你可以通过建立一个主材质,然后根据主材质修改出多种不同的子级材质,同时修改了主材质时子级材质也会修改。

      材质实例除了以上用处外,还有一个最大的用处。当模型使用材质实例时,我们可通过调整材质实例内的参数,在编辑器视口内实时预览材质的情况,如果使用主材质则需要保存并等待重新构建纹理。这样可大大提升工作效率。

      参数集是一种高级参数的用法,一个参数集可以建立多个标量参数和向量参数,同时还可应用在多个材质或者蓝图内,拱起调用。

      虽然参数集是一种高级参数,但是也是有其弊端。比如参数集不可在材质实例里进行修改,又或者在修改参数集后所有调用的此参数集的资产都会一并修改。所以在使用时还是需要慎重选择。

      枚举简单来说就是一个可选的下拉菜单,通过枚举去实现流程的控制。

      通过右键蓝图创建枚举资产。一个枚举资产可以新增多个枚举类型。之后我们可在蓝图变量中根据枚举资产的名称创建一个枚举变量,这时变量就会获取我们建立的枚举内的类型。

      枚举的使用范围还是很广泛的,比如可以配合布尔做布尔运算,可以配合切换做流程控制等。而且枚举带有描述与选项的直观性,相对使用数值等方式来做流程控制更为直观。

      对于不会C++的朋友来说蓝图是玩转UE4最基本的功能。而且蓝图有很多种类但是大体功能都差不多,这里我用Actor这类蓝图来给他说介绍我所使用的到的蓝图功能点。

      变量是蓝图中最最基础的工作节点,其涉及UE4中方方面面极大部分的内容。只有熟练掌握变量的应用,才能更好的使用蓝图内的其他功能。因为变量类型太多,这里我只针对我用过的来说明。

      在说明之前,大家需要先了解所有变量都拥有2个节点“设置变量与获取变量”。

      1.设置变量是对变量参数的设置。可以手动调整获取从其他节点获取

      2.获取变量是把变量当成一个参数,并设置给其他节点

      其中要注意的是,变量的设置与获取是有先后顺序的,先设置后获取与先获取后设置最终得到的结果是完全不一样的。

      细节面板,我们可以设置“变量名称”,选择所需的变量类型与变量容器等变量细节。其中单独说明下,当打开可编辑实例时大家可以在关卡里的细节面板调整已经放置的本Actor并打开可编辑实例的变量。最后变量在编译成功后才可对变量默认值等属性进行操作。

      设置变量拥有一个输入口和一个输出口与2个执行口。

      1.可以通过修改设置上的输入框设置数值。

      2.也可通过其他几点或其他变量参数位置赋值。

      3.我们还可通过右键对应的接口,选择提升为变量直接创建一个该类型的变量。

      注:这里设置的值并不是默认值,当程序执行到本节点后参数则会被修改。

      对于向量类的变量,我们可以右键每个数据接口去分割结构引脚,然后叫向量的每类引脚分开可供我们单独链接使用,当然这个分割不仅仅使用在变量上,许多带有向量的应用节点也是可以分割的,当我们仅想设置某各值的时候而不知道从何下手时,不妨试试右键接口看看能不能分割。

      获取变量是获取变量当前参数值并将其赋予某节点。

      布尔变量,基础的判断型变量,分别可以设置True与Fasle,经常配合分支节点使用。常用节点之一。

      浮点变量,一个实数节点灵活度与应用范围非常的好 。几乎所有节点都能应用的变量。常用节点之一。

      整数变量,一个整数变量相对浮点灵活度较差但是应用范围页非常广泛。也属于常用节点之一。

      时间变量有很多类型,比如时间间隔、日期时间、时间码。都是时间的变量。经常与拆分节点使用。

      Actor变量是一个类型的统称。Actor变量的默认值是不可能编辑的,需要进行设置。但是我们可以通过变量类型输入已有的Actor蓝图名称创建指定的Actor变量。同时Actor变量可以创建自己的事件。平时Actor变量会与获取节点、设置节点与类型转换节点配合使用较多。

      静态网格体变量,是一个模型设置与获取的变量。我们可以使用次变量设置所需调用的模型。通过静态网格体变量生成的模型不会显示在蓝图视口与组件内。这个变量多用于动态获取或修改改变模型。

      变量,经常与获取材质与设置材质配合使用,来实现动态更换材质或者更改材质参数的目的。属于常用变量一。

      枚举变量在上方介绍枚举时已经很详细说明了着了不多说了。

      媒体播放器变量就是调用媒体播放器使用,经常配合播放、暂停、打开源等节点使用。当蓝图实例需要调用打开多个不同媒体时,我们需要媒体播放器变量与纹理变量配合使用,然后编辑各个蓝图实例上的这2个变量,即可达到每个蓝图实例播放不同的媒体。

      基础媒体源变量是调用媒体源的变量,常配合打开源节点使用。只有当打开了媒体源,媒体播放器才会播放媒体,动态材质才会显示媒体播放。

      纹理变量同时可调用动态纹理与静态纹理,可与设置纹理参数值节点设置纹理贴图,如果设置的是动态纹理,那么配合媒体播放器变量与播放节点即可播放媒体文件。本变量不仅应用在设置模型贴图,还可设置灯光天光等组件上,所以也属于常用变量。

      线性颜色变量,一个颜色的变量,不仅可以用于修改材质的向量参数,也可用于涉及颜色的组件。同样属于常用节点。

      UMG变量也是用户界面变量,这个变量在创建时与其他变量略有不同。首先我们需要创建一个UMG蓝图(用户界面蓝图),之后我们随便创建一个变量,然后再变量类型里搜索我们UMG蓝图的名称进行创建。UMG变量常与添加到视口节点和从父项移除节点配合使用。得以实现当用户对Actor进行交互操作时打开或关闭所需的用户界面。

      函数常用的一个函数脚本,用来构建或封装一些复杂的函数方便调用。

      构造脚本,默认无法删除的函数脚本,多用来预先构建某些事件。

      点击我的蓝图慢板函数后方的加号可以新增一个新函数。我们手动新增的函数,目前我所了解的是函数除了不能直接使用时间轴节点外其他节点都可以使用,但是函数可以调用已有的时间轴节点当做一个事件使用。

      并且手动新增的函数还可创建输入与输出的参数接口,方便我们将变量参数直接传入或传出。

      我们可以通过函数细节面板手动添加输入接口与输出接口,并调整戏接口类型与接口名称。当我们在创建输出接口后,会自动新增一个返回节点。具体的使用看下方实例。

      我们可以通过函数细节面板手动添加输入接口与输出接口,并调整戏接口类型与接口名称。当我们在创建输出接口后,会自动新增一个返回节点。具体的使用看下方实例。

      调用函数时,如果布尔值为“ture”则执行数组循环赋值到字典,当循环完成时返回枚举显示。如果布尔值为“false”,则返回枚举不显示。

      调用函数时,如果布尔值为“ture”则执行数组循环赋值到字典,返回枚举显示如果布尔值为“false”,则返回枚举不显示。

      这2个函数看似一样,实则大有不同,例子1:是当循环赋值完成后才会返回在执行接下来的程序,如果数组的数据量非常大时,这个时间可能会很长。

      例子2:并没有等待循环结束直接返回并执行下面的程序,如果这时数据量过大就会出现后面程序已经开始执行而数据还没有赋值完成显示不出来。

      所以这个返回节点具体放在什么位置还需斟酌。

      图表,蓝图编写主要程序的地方。我们可以新增多个图表,每个图表可以拥有多个事件。

      UE4为我们准备了多种多样的事件选项,当触发事件后就会执行事件所对应的程序。当然除了一些固定事件外,为了方便管理与调用UE4还为我们增加了一种自定义事件。

      程序开始运行就执行的事件,用处很多,比如运行一段蒙太奇动画、生成一些模型、创建一些UMG蓝图等。

      Tick事件,每帧行一次程序。“Delta Seconds”参数则是每帧所的时间,因为各种原因(比如卡帧等),每一帧所花费的时间并不是相同的。“Delta Seconds”具体用处目前我还没有弄清楚。并且次节点是在实时执行程序,如果如果频繁使用会降低程序运行速度。

      事件被点击的Actor,也就是当Actor被点击时所触发的事件。应用范围非常广泛。Button Pressed为按下按钮参数。

      如字面意思,就是鼠标开始悬停与结束悬停所触发的事件,这两个会经常配合使用。

      滚轮事件有3类,鼠标滚轮轴、鼠标滚轮上滚与鼠标滚轮下滚。先来说下我所用的是鼠标滚轮上滚与鼠标滚轮下滚。这2种与鼠标左键事件一样,只是输入方式改变了而已。通过输入消耗上滚轮与下滚轮来实现镜头远近。而鼠标滚轮轴事件则是每帧提供一次滚轮轴的当前值。

      至于这2类有什么不同呢,滚轮上下滚的的事件是输入时执行,需要配合多个数学几点与控制节点来配合,相对来说不太影响程序的运行速度。而鼠标滚轮轴是程序开始运行时就开始TICK滚轴轴的值,相对来说会比较占用程序运行速度。

      看到这里大家会发现,每个事件的右上角都有一个红色圆角方块。这个是Output Delegate委托事件,这个功能我还真没有用到仅仅了解了一下,终于的逻辑层面还是必须深的,感兴趣的朋友可以去查一查管网的资料。

      鼠标左键、鼠标右键事件。最最最常用的事件。Pressed为按下事件,Released为松开事件,Key是返回的一个键值。其实这个事件其实更应该称为“键”事件,因为我们可以通过细节面板修改输入的方式,直接改变触发事件所需的键位与物理设备。这其中消耗输入、暂定时执行与重载父绑定我没有接触就不做说明了。下面的修改器,其实就是绑定PC与Mac的CTRL、ATL、SHIFT与WIN键来一起输入。

      我们通过右键图表空白区输入“自定义”,即可找打添加自定义事件。自定义事件是一个灵活且非常常用的事件,他可以将复杂的程序逻辑整合成一个事件供我们在需要的时候进行调用。有的朋友会发现这个事件与函数貌似差不多,那么为什么不用函数?目前我发现的区别就是自定事件可以跨蓝图进行通讯调用,而函数则不可以。

      在创建自定义事件时大家需要注意,自定义事件的名称是可以自行修改的,方便根据名称进行调用,但是自定义事件的名称不能重复。

      自定义事件之所以灵活就是它为我们提供了输入接口,我们可以通过自定义事件的细节面板内的输入区新建所需调用的的变量接口类型。通过这个接口我们可以让本蓝图或其他蓝图的变量数据传入到这个事件内,供事件内的程序使用。

      添加了输入接口的自定义事件,通过下方蓝色调用自定义事件左侧接口接收输入,然后从上方红色自定义事件右侧接口输出给程序。

      节点,蓝图程序构成的基本的元素。UE4蓝图的节点众多,每个节点都有不同的功能与用处,我这里至整理了我所应用到的节点。

      流程控制类节点用于程序的流程管控与整理程序代码,属于常用的蓝图节点类。

      序列节点的作用就是可以将一个长的顺序执行代码划分成段,更便于管理。

      分支节点,需要配合布尔值来进行判断执行的节点。

      切换节点Flip Flop,根据输入事件在A与B之间切换执行程序代码。

      我用到了两种循环节点,For Each Loop、For Each Loop with Break。这两种循环节点都是用于循环执行数组变量的节点。均都从左侧Exec进入然后通过Loop Body进行循环,右侧Array则是输入的数组,右侧Array Element则是输出的元素,而Array index则是元素的索引。Completed是完成执行接口,当loop Body循环执行完成后可以触发Completed之后的事件。要说这两个节点的区别则是在于左侧的Break,这个中断,当某个事件通过次接口后则会中断停止循环。

      大家在使用循环节点时需要注意的是,当我们更换数组类型时,Array、Array Element这两个接口时不会自动更换类型的,需要我们手动断开链接后先链接Array这个接口然后节点就会自动更换类型。

      切换节点我们上面枚举篇幅里有过体现这里就简单说下。

      当我们右键输入“切换”时,可以在Switch里看到很多类型,这里不要怕。其实这个切换就是我们枚举里的类型,根据当前枚举所选的类型去执行对应的程序代码。当我们了解了这个切换是做什么的之后就好说了,我们只需要找到与我们枚举相对应的切换节点即可。

      门gate节点,其实一种开关节点,Enter是输入事件,Open则是由某事件控制开启输入,Close则是由某事件控制关闭输入,Toggle则是由某事件控制在开启与关闭之间切换。Start Closed是否启用关闭事件。

      时间轴节点,是蓝图图表常用的一个节点。通过它我们可以实现一些效果或控制一些事件。

      很简单左侧为事件输入,右侧则是输出执行。

      先来看左侧。Play播放,不多说就是播放。Play from Start从头开始播放,就是没次播放都会从头开始。Stop停止,小学4年级英语不多说。Reverse反转,这里要注意这个接口时从当前时间点反转。Reverse from End从末端反转。Set New Time设置新时间,举个例子:假如当前时间轴共5秒,你可以通过这个接口与New Time浮点去更改新的时间,可以更长也可以更短但是时间轴里的关键帧位置是不变的。

      然后是右侧输出。Update执行,如例1:开始执行,立方体1秒Z从0旋转到360。

      Finished完成时,如例2:时间轴播放完成后执行立方体Y轴直接变成180。Direction是时间轴自带的枚举变量,是当前时间轴的一个播放状态,这里UE4自带翻译是快进与快退,其实我感觉正确的翻译应该是播放与反转播放。

      最后是下方4类轨道变量,供输出使用的。这里大家看到的是4类,其实这里是大家手动添加的。

声明:* 本站所提供的资源均来源于互联网,站内所有文字、图片内容由网站会员上传而来,UI社不具备此内容的版权。由于将本站资源用于商业用途而引起的纠纷,本站不负任何责任。如果有侵犯到您的权益,请联系本站删除,谢谢合作!联系邮箱:Uishe#qq.com (请将[#]换成@)