unreal4 介绍_unreal4 behaviortree介绍 - CSDN
  • unreal4特性介绍

    2017-09-12 10:44:31
    原文地址: https://www.unrealengine.com/products/unreal-engine-4 unreal enginer介绍 我的UE4学习(一) 你曾想过用连线的形式来编写程序么; 你曾想过通过编辑工具就可以来创建类,并在vs中...


    原文地址:   https://www.unrealengine.com/products/unreal-engine-4     unreal enginer介绍


    我的UE4学习(一)


    你曾想过用连线的形式来编写程序么;
    你曾想过通过编辑工具就可以来创建类,并在vs中自动生成类和函数,头文件和cpp文件么;
    你曾想过粒子效果可以成千上万的渲染,并且牛逼的粒子还可以反射光线么;
    你做的效果可以能会超越电影画质的游戏;
    你曾想象和意淫一下,C++不用编译可以实时的在编辑图形界面上调试和添加断点么;

    我看了UE4代码的一个小小的角落,就觉得自己来到了一个无知的世界。你的想象,别人已经实现了。
    自惭形秽的同时,希望能学到人家的一二。

    Welcome To  The Future! 牛逼闪闪的UE4 来了!

    ue4需要的基本电脑配置:
    Win7 64位系统或Mac OSX10.9.2以上版本
    Intel 或AMD处理器 2.5GHZ以上。
    兼容DX11 的GPU。
    8G内存,不够的请自动升级!
     

    一、特性说明

    特性

    Ue4是一款专业开发高质量游戏的平台开发工具。Ue4的渲染加快可以满足开发者完成出色的画面,同时也可以匹配低端系统。

    全新工作流的特性和深度的工具箱可让开发者快速的实现想法,并可以看到效果,同时c++开源带来了全新的体验。

    Ue技术支持几百种游戏,实时3D电影,训练仿真,可视化等。在过去的15年中,成千上万的个人和团体围绕者ue开发技术建立了公司,成为了一种职业。

    二、 具体特性

    (一)

    UE4支持更高级的DX11的渲染特性,比如:全屏的HDR映像,每个场景上千种动态光照,artis-可编程镶嵌技术和disPlacement(位移)技术,基于物理特性的阴影和材质,IES光照轮廓等等。

    (二)

    颗粒特效·

    颗粒特效编辑器VFX为我们提供了创建精细的火、烟、血、尘土、污垢、碎石等的工具。颗粒管线包括的了快速低成本GPU粒子仿真,可与深度缓冲交互的碰撞系统。场景中数百万的动态粒子可以接受和反射光线,你可以控制各种粒子效果参数,包括有大小,颜色,密度,下降散开和反弹。

     

    (三)

    新材质管道

    UE4通过使用基于物理模型的shading,提供了前所未有的控制方式,你可以观察和感受角色和对象。快速创建一个宽阔场景面,它是经得起对细节的考验。在像素级别上,层材质和微调值,可以满足你的任何想象。

      

    (四) 

    蓝图

    蓝图可视脚本带把你有创造力的想法,展示到可视化的游戏中。使用蓝图,任何人不需要写一行代码,可以快速原型和建立玩家内容。蓝图可以在创建级别、对象和玩家行为,修改用户界面,调整输入控制等操作中发挥作用。

     

    (五) 

    实时的蓝图调试debugging

    在游戏测试的中,通过蓝图可视化脚本内置了一个debugger,你可以与可视化的游戏流程交互并检查属性值。通过在蓝图的可视节点上设置断点,来随意的暂停游戏,查看游戏的各种状态。逐步的通过事件和功能,随意的变化,优化你的游戏。

    你之前有想象过,不通过代码来调试程序么?你想过你能在编辑工具的界面上设置断点和调试么?

     

    (六) 

    内容浏览

    使用UE4内容浏览器,用来导入,组织,搜索,标记,过滤,修改在unreal编辑器中的游戏的对象。实时动态预览图使用截屏功能,可以被修改保存。创建任何的对象集合,都可以被个人或共享给其他开发者。

     

    (七) 

    角色动画

    使用角色动画工具集,可以来编辑骨骼动画,骨骼网格,sockets,动画蓝图等。这个是多用途工具,你可以预览动画序列,变形目标体,也可以设置动画混合空间和蒙太奇剪切。当然,也可以使用PHAT(物理编辑工具集)用来修改骨骼网格的物理和碰撞属性。

     

    (八) 

    过场动画

    UE4的过场动画工具集提供了在场景级别的直接的级别控制,动态玩家镜头和电影。通过一个类似的非线性编辑器,能够是你在场景中设置精细的动作细节和动画场景属性,产生很棒的电影片段。

     

     

    (九) 

    地形和枝叶

    我们使用景观系统可以创建大型开放的环境,然而平铺地形的方法的命令条数是巨大的,多亏了强大的LOD系统和高效的内存使用。使用枝叶工具,快速绘制或删除所有排序的地形组件,从而达到修改大型室外场景的目的。


    (十)

    后处理效果

    UE4的后处理特性可以使你完美的体验对于场景的观感。电影般的效果,举几个例子:环境立方贴图,环境遮挡,bloom,颜色分级,景深,眼适应,镜头耀斑,光轴,抗锯齿,色调映射等。

     

     (十一) 

    完全源码接入

    UE4带有全部的C++代码,你可以修改和扩展UE编辑工具和UE的子系统,包括物理系统,声音系统,在线系统,动画系统,渲染系统和slate 界面系统。全部控制引擎和角色代码,你可以干任何事情。

     

    (十二) 

    专业的源码控制

    UE4委托GitHub来源码开源,这样由很清晰的版本控制文档和版本跟踪。另,Perforce的版本控制和ApacheSubversion支持,对开发者而言都是用户条款的。不管,你的团队规模,均享有在UE基础版本上开发和设计的权利。

     

    (十三) 

    C++代码可视

    在游戏角色和对象,UE4代码允许直接浏览c++函数功能,直接跳转到在vs的源代码行来做更改,从而节约了时间。

     

    (十四)  

    热重载功能

    使用UE很受欢迎的热重载特性,你可以在你游戏运行的过程中,更新你的角色代码。这个工具你开业用C++编写代码,并且可以不用暂停游戏来观看代码的运行效果。

     

      

    (十五) 

    模拟和仿真

    使用模拟仿真模式,可以快速调试和更新角色行为,这样你在编辑视口中,可以运行一下程序的逻辑,观察角色的表现。在模拟仿真的编辑环境下,全屏化运行游戏,你可以忽略UI,全身心的关注角色的变化。

     

    (十六) 

    即时游戏预演

    更新游戏和使用即时预演系统可以立即在游戏中任意地方产生一格玩家,并且不用等待文件保存。

     

    (十七) 

    获取和丢失特性

    获取和丢失特性,允许你在编辑的游戏中,可以在任何时间来以玩家视角来编辑和控制相机以便观察那些行为不正确。

     

    (十八) 

    人工智能

    UE4的角色框架和AI系统,可以使角色拥有世界周围的空间意识,从而使他们更智能的行为。当你的运行对象在总是在优化路径,动态导航实时的更新网格

     

    (十九) 

    音频

    使用UE4的音频编辑可以建立音频管线,定义游戏的重复音效。

     

    (二十) 

     领先的中间件集成

    UE4的主要的配件程序提供了很多的引领工业级的中间件技术,包括英伟达的PhysX,Autodesk的Gameware,Enlighten,暗影,Oculus VR等软件库。

     

    三、 

    样例使用说明

    虚幻4的样例展示了引擎使用高要求粒子效果的能力。在运行样例之前,你需要安装vs2013runtimes.

    使用批处理文件可以进行设置,比如:分辨率x=1920,分辨率y=1080等。

     

    -------------------------------------

    展开全文
  • Unreal Engine 4 初学者教程:开始 原文:Unreal Engine 4 Tutorial for Beginners: Getting Started 作者:Tommy Tran 译者:kmyhy Unreal Engine 4 是一个游戏开发工具集,能够开发从 2D 手机游戏到 3A ...

    原文:Unreal Engine 4 Tutorial for Beginners: Getting Started
    作者:Tommy Tran
    译者:kmyhy

    Unreal Engine 4 是一个游戏开发工具集,能够开发从 2D 手机游戏到 3A 级主机游戏的一切。“方舟:生存进化”、“泰克肯7”和“王国之心 III”这些游戏背后使用的引擎就是它。

    对于初学者来首,用 Unreal Engine 4 开发是很简单的。通过蓝图可视化脚本系统,你可以不写一行代码就创建出整个游戏。再加上一个易于使用的界面,你就可以获得一个可以运行的游戏原型。

    本教程主要是让初学者入门。它涉及以下几个知识点:

    • 安装引擎
    • 导入资源
    • 创建材质
    • 用蓝图(Blueprint)创建具有基本功能的对象

    为了学习这些知识,你会创建一个用于展示一只香蕉的旋转转盘。

    注:本教程属于 Unreal Engine 教程系列,这个系列共 10 个部分:

    安装 Unreal Engin 4

    Unreal Engine 4 使用 Epic Games Launcher 进行安装。进入 Unreal Engine 网站 并点击 Get Unreal 按钮(右上角)。

    下载这个安装器需要创建一个账号。创建账号之后,选择下载和你的操作系统对应的版本。

    下载并安装完安装器之后,运行安装器。会显示一个窗口:

    输入 email 和密码,点击 sign in。登录之后会显示这个窗口:

    在左上角,点击 Install Engine,安装器会让你选择要安装的组件:

    注:Epic Games 经常升级 Unreal Engine,因此你的引擎版本会与此不同。例如我写第一稿时,版本已经升级到 4.14.3! 只要你的版本不低于 4.14, 你就可以使用本教程。

    默认选中的是 Starter Content、Templates and Feature Packs 和 Engine Source。就保持这样的选择不变。它们分别是:

    • Starter Content: 这是你可以在自己项目中免费使用的资源集。它包含了一些模型和材质。你可以在你的游戏中临时使用它们。
    • Templates and Feature Packs: 模板可以根据你的选择来创建基本功能。例如,Side Scroller 模板会创建一个项目,项目中包含一个角色、基本动作和一个固定的水平相机。
    • Engine Source: Epic 提供了源码,这样任何人都可以修改这个引擎。例如,如果你想为编辑器添加自定义功能,你可以通过修改源码来实现。

    拖动这个列表,还有几种不同的平台。如果你不打算支持某个平台,请让它反选。

    选好组件之后,点击 Install。安装完成后,引擎会在 library 中显示。接下来我们创建项目。

    创建项目

    点击 Launch 按钮打开项目浏览器。在项目浏览器中,点击 New Project 标签页。

    点击 Blueprint 标签页。这里,你可以选择一个模板。但是,因为我们想从空白开始,所以选择了 Blank template。

    在下面,你会发现有更多的设置。

    分别有这几个选项:

    • Target Hardware: 选择 Mobile/Tablet 会关闭一些后期处理效果。还会用鼠标模拟触摸。设置为 Desktop/Console。
    • Graphical Target: 选择 Scalable 3D or 2D 会关闭一些后期处理特效。请设置为 Maximum Quality。
    • Starter Content: 使用这个选项可以包含一些开始内容。为了简单起见,这里将它设为 No Starter Content。

    最后一部分设置是指定项目文件夹地址和项目名称。

    点击 Folder 栏右边的 3 个小点,可以改变项目文件夹地址。

    项目名称不代表游戏名称,因此不用担心后期可以修改这个名称。选择 Name 栏的文本框,输入 BananaTurntable。

    最后,点击 Create Project.

    认识界面

    创建完项目,编辑器会打开。编辑器分成了几个区域:

    1. 内容浏览器: 这里显示所有项目文件。用它创建文件夹并组织文件。可以在搜索栏中查找文件或者过滤文件。
    2. Modes: 这里可以选用各种工具比如 Landscape 工具和 Foliage 工具。默认工具是 Place 工具。它允许将各种对象比如灯光和相机放到游戏关卡中。
    3. 世界大纲编辑器: 显示当前关卡中的所有对象。你可以通过将相关的对象放入文件夹中来组织整个列表。它也可以搜索或者通过类型来过滤。
    4. 详情: 你选中的对象会在这里显示出属性。这里可以编辑对象的设置。这里进行的修改只会影响这个对象的实例。例如,如果你有两个球体,如果你改变了其中一个的大小,那么只会对你选中的对象有效。
    5. 工具栏: 包含各种功能。你用得最多的一个就是 Play。
    6. 视口: 关卡视图。按下右键拖动鼠标可以查看四周。按下右键,用 WASD 键进行移动。

    导入 Assets

    光有一个圆桌却没有要陈列的东西有什么用?请下载香蕉模型。里面有两个文件 Banana_Model.fbx 和 Banana_Texture.jpg。当然,你可以用自己的模型。但你怎么来使用这个该死的香蕉呢?

    在 Unreal 能够使用一个文件之前,你必须导入它。在内容浏览器,点击 Import。

    通过文件浏览器,找到 Banana_Model.fbx 和 Banana_Texture.jpg。框选住两个文件,然后点击 Open。

    对于 .fbx 文件,Unreal 会提供几个导入选项。确保 Import Materials 未选中,因为你会创建自己的材质。其它设置保持不变。

    点击 Import。这两个文件就显示到内容浏览器中了。

    在导入文件时,实际上它是不会保存到项目中的,除非你明确地这样做。你可以用右键点击这个文件,选择 Save 就可以保存它们了。还可以选择 File\Save All 来一次性保存所有文件。确保经常使用保存功能。

    注意在 Unreal 中模型被称为网格。选择你已经有一个香蕉的网格了,可以将它放到关卡中了。

    添加网格到关卡

    选择关卡看起来空空的,让我们放点东西。
    要添加网格,左键将 Banana_Model 从内容浏览器中拖到视口。放开鼠标左键,就可以将网格放下。

    关卡中的对象是可以移动、旋转和缩放的。它们的快捷键分别是 W、E 和 R。然后使用操纵杆:

    材质

    如果你近距离查看香蕉,你会发现它根本不是黄的。事实上,它是灰色的。要给香蕉一些颜色和细节,你必须创建材质。

    材质是什么?

    材质决定了某件东西的表面外观。在一个基本的关卡中,材质定义了 4 个方面:

    • 基本色: 一个表面的颜色或纹理。常用于添加细节和色彩的变化。
    • 金属化:表面和金属的相似度。通常,纯粹的金属拥有的金属化值是最大的,而织物的金属化值为 0。
    • 高光:控制非金属表面的发光。例如,陶瓷拥有较高的高光值,而黏土则相反。
    • 粗糙度:粗糙度最大时,没有任何高光。用于岩石或木头的表面。

    下面是 3 种材质的例子。它们颜色相同但属性不同。每种材质都有在对应的属性上设置为较高值。另外的属性则设为 0。

    创建材质

    要创建材质,请进入内容浏览器,点击绿色的 Add New 按钮。会弹出一个菜单显示你可以创建的 assets。点击 Material。

    将材质取名为 Banana_Material 然后双击文件打开材质编辑器。

    材质编辑器

    材质编辑器由 5 部分组成:

    1. 图(graph): 这个区域包含所有节点和结果节点。按下鼠标右键并移动鼠标可以平移。滚动鼠标滚轮可以进行缩放。
    2. 详情: 这里显示选中节点的属性。如果没有选择任何节点,这里会显示材质的属性。
    3. 视口: 包含一个预览的网格,显示你的材质。要转动相机可以按住鼠标左键并移动鼠标。要缩放可以用鼠标滚轮。
    4. 调色板:一个列表,列出材质所有节点变量。

    什么是节点?

    在开始编辑材质前,你必须知道节点是什么。

    节点构成了材质的主体。有许多不同的节点,提供了不同的功能。

    节点可以有输入和输出,用一个圆圈+一个箭头来表示。输入位于左边,输出位于右边。

    材质有一个特殊的节点,就是结果节点,在 Banana_Material 中它是现成的。它是所有节点的终点。一旦你接通这个节点,就可以决定材质的最终显示。

    添加材质

    要为一个模型添加颜色和细节,你需要一个纹理。一个纹理就是一张 2D 图片。通常,它们会投射到 3D 模型上,让它具有颜色和细节。

    为了给香蕉贴图,你需要使用到 Banana_Texture.jpg。TextureSample 节点允许你在材质上使用贴图。

    找到调色板,找到 TextureSample。按下鼠标左键,将它拖到“graph”窗口。

    要选择纹理,首先需要选中这个 TextureSample 节点。找到详情面板,点击 Texture 右边的下拉按钮。

    列表中列出项目中所有纹理。选择 Banana_Texture.

    要在预览网格上查看贴图,需要将它插进结果节点中。左键点击 TextureSample 节点的白色输出按钮上,将它拖到结果节点的 Base Color 输入按钮上。

    回到视口,在预览网格上查看纹理。旋转它(按下鼠标左键并拖动)查看其它细节。

    点击工具栏上的 Apply 按钮,应用你的材质。然后关闭材质编辑器——这部分的工作结束了。

    使用材质

    要将材质应用到香蕉上,你需要指定它。回到内容浏览器,双击 Banana_Model 打开它。这会显示一个编辑器:

    找到详情面板 Materials 一节。点击 Element 0 右边的下拉按钮,选择Banana_Material.

    关闭网格编辑器,回到主编辑器,看一下视口。你将看到香蕉现在已经贴图了。恭喜,你已经成为了一个关卡设计师了!

    注:如果光线太暗,你可以在世界大纲编辑器中点击 Light Source 来改变它。在详情面板中,找到 Intensity,设置为更高的值。

    蓝图

    香蕉看起来很好,但如果将它放到圆桌上旋转就更好了。用蓝图来创建一个圆桌很轻松。

    简单讲,一个蓝图(Blueprint)表示一件”东西“。蓝图允许你为对象创建自定义行为。对象可以是某种物体(比如圆桌),也可以是某些抽象的东西比如生命系统。

    想制作一辆会动的车吗?构建一个蓝图。一只会飞的猪呢?使用蓝图。一只在碰撞中爆炸的小猫?还是蓝图。

    就像材质一样,蓝图使用了节点系统。这意味着你只需要创建节点然后将它们连接起来,不需要编写代码!

    注:如果你更喜欢写代码,你可以用 C++。蓝图易于使用,但它们无法做到和 c++ 代码一样快。如果你不得不用到大量计算的东西,比如复杂算法,你应当使用 c++。
    当然虽然你喜欢 c++,但很多时候用蓝图其实是个好主意。蓝图有这些优点:

    • 通常,蓝图比 c++ 的开发速度更快。
    • 易于组织。你可以将节点分成不同的模块,比如功能和图形。
    • 如果你和非编程人员一起工作,修改蓝图更容易,因为它的可视化和直观性。

    将对象用蓝图来创建是一种好办法。当需要提升性能时,将它们转换成 c++。

    创建蓝图

    在内容浏览器,点击 Add New。在列表中选择 Blueprint Class。

    弹出一个窗口,让你选择父类。你的蓝图会从父类继承所有的变量、函数和组件。花点时间了解每个类能做什么。

    注:Pawn 和 Character 也是 Actor 类,因为你可以放置和生成它们。

    因为圆桌只会待在一个地方不动,Actor 类最适合。选择 Actor 然后给文件命名为 Banana_Blueprint。

    最后,双击 Banana_Blueprint 打开它。当窗口弹出时,点击 Open Full Blueprint Editor :

    蓝图编辑器

    首先,在蓝图编辑器中,选择 Event Graph 标签页。

    蓝图编辑器有 5 个主要的窗口:

    1. 组件窗口:当前组件的列表。
    2. 我的蓝图:用于管理你的图形、功能和变量。
    3. 详情窗口:显示当前选中对象的属性。
    4. 图形窗口:这是关键。所有节点和逻辑都在这里。按下右键并拖动鼠标进行平移。滚动鼠标滚轮进行缩放。
    5. 视口:任何拥有可视化元素的组件都在这里显示。你可以用主编辑器一样的方式移动和旋转。

    创建圆桌

    要创建圆桌,需要两个东西:一个基座和一个陈列品。你可以通过组件来创建这两个东西。

    什么是组件?

    如果一个蓝图是一辆车,那么组件就是组成车辆的构件。例如,车门、轮胎、引擎都是组件。

    但是,组件不仅仅限于物理对象。

    例如,要让车动起来,你需要添加一个移动组件,你甚至可以为它添加一个飞行组件让它飞起来。

    添加组件

    在你看到任何组件之前,你需要切换到视口视图。点击 Viewport 标签页即可切换到它。它看起来像这个样子:

    注:DefaultSceneRoot 组件在玩游戏时不会显示。它只在编辑器中显示。

    这个圆桌用到了两个组件:

    • Cylinder: 一个简单的白色圆柱体。这是放置香蕉的底座。
    • Static Mesh: 这个组件用于显示香蕉网格。

    要添加底座,找到组件面板。点击 Add Component 并选择 Cylindar。

    最好让底座变得更短一点。按下 R 键,显示缩放操作杆,然后将它缩短(不要管真实大小,你可以在后面修改它)。

    然后来添加网格。回到组件面板,在空白地方点击左键,清除对圆柱体的选中状态。这能保证接下来的组件不会附加在圆柱体组件上。

    注:如果不这样做,接下来的组件会附加在圆柱体上。这意味着它会继承圆柱体的 scale 属性。因为你缩短了圆柱体,那么接下来的组件也会被缩短。

    然后。点击 Add Component,选择 Static Mesh。

    要显示香蕉,选择这个静态网格组件,然后点击 Details 标签页。点击 Static Mesh 右边的下拉按钮,选择 Banana_Model。

    如果它的位置不对,请移动香蕉。按 W 激活操作杆,移动它的位置。

    蓝图节点

    接下来让圆桌旋转。这就要用到蓝图节点了。

    和材质节点不同,蓝图节点拥有特殊的 pin 叫做 Execution pin。位于左边的 pin 是输入,位于右边的则是输出。所有节点至少有一个输入/输出。

    如果节点有一个输入 pin,它前边必定有一个连接才能执行。如果有一个节点没连接,那么后续的任何节点都不会执行。

    举一个例子:

    节点 A 和节点 B 会执行,因为他们的输入 pin 已经有连接。节点 C 和节点 D 不会执行,因为节点 C 的输入 pin 是断开的。

    转动圆桌

    在开始之前,看一眼组件面板。你会看到 Cylindar 和 Static Mesh 有缩进而 DefaultSceneRoot 没有缩进。这是因为前者是附加到 DefaultSceneRoot 上的。

    如果你移动、旋转或缩放 root 组件,那么它包含的组件也会有同样动作。通过这种方式,你可以让 Cylinder 和 Static Mesh 一起旋转,而不是分别旋转。

    创建节点

    要开始编写脚本,需要进入 Event Graph 标签页。

    让某个对象旋转非常简单,只需要创建一个节点。在 graph 视图空白地方右键,打开有效的节点菜单。搜索 AddLocalRotation。因为你需要旋转底座和香蕉,你只需要旋转 root 组件即可。选择 AddLocalRotation(DefaultSceneRoot)。

    注:如果没有列出这个节点,请反选菜单右上角的 Context Sensitive 选项。

    在 graph 窗口中会多出一个 AddLocalRotation 节点。Target 输入会自动连接到你选择的组件。

    要设置旋转角度,找到 Delta Rotation 输入,然后修改 Z 值为 1.0。这将导致蓝图沿 Z 轴旋转。值越大,转速越快。

    要不断地旋转,你必须逐帧调用 AddLocalRotation。要逐帧调用,需要使用 Event Tick 节点。它已经在你的 graph 视图中了。如果没有,用前面一样的方法创建一个。

    将 Event Tick 节点的输出 pin 拖到 AddLocalRotation 节点的输入 pin。

    注:用这种方法,旋转速度取决于帧率。这意味着机器越慢圆桌的转速越慢,反之亦然。这对于本教程来说是可以的,因为我让事情简单化了,但在后面的教程中我会介绍如何解决这个问题。

    最后,点击工具栏上的 Compile 按钮,更新你的蓝图,然后关闭蓝图编辑器。

    将蓝图添加到关卡

    在添加蓝图之前,在主编辑器的视口中,删除香蕉的模型。选择该模型,点击 Edit\Delete 菜单或者按 Delete 键。

    添加蓝图和添加网格一样。在文件上按住左键,将它拖到视口中。

    点击工具栏上 的 Play 按钮,看看效果!

    注:如果你没有删除原有的香蕉模型,你可能会被警告”灯光需要重建“。如果删掉模型,则错误不再显示。

    接下来去哪里?

    在这里下载完成后的项目。

    你已经学完这篇教程,但那只是 Unreal 中极小的一部分。如果你想继续学习,请阅读本系列的下一篇教程,我将介绍 Unreal 引擎更多关于蓝图的内容。

    展开全文
  • Unreal Open Day 2017 活动上 ,Epic Games 资深开发者支持工程师王祢先生为到场的开发者介绍了在 Unreal Engine 4 中动画系统,以下是演讲实录。 大家好!鉴于引擎移动端功能以及 UI 优化都有同事做了介绍,今天我...

    Unreal Open Day 2017 活动上 ,Epic Games 资深开发者支持工程师王祢先生为到场的开发者介绍了在 Unreal Engine 4 中动画系统,以下是演讲实录。 

    大家好!鉴于引擎移动端功能以及 UI 优化都有同事做了介绍,今天我选择讲的主题是关于动画。动画是一个非常复杂的系统,我会主要介绍一些基本的概念,大家在了解了基本概念后,就可以在上面做出扩展。我并不会教大家怎么使用动画工具,关于一些动画节点的使用,我们的在线文档上都有比较详细的说明,也有比较多的资源。今天不会讲到的内容包括 Morph target,IK,Retargeting,Rootmotion,Additive,Skeletal Control 这些。

    首先,我们先来看看引擎中的动画系统是如何工作的。为什么我要先讲解这样一个问题,因为国内有很多用户在使用动画系统的时候,有很多疑问。这些疑问并不是因为他们没有查阅文档,而是因为没有理解系统的工作方式。本质上,动画系统工作原理是非常简单的,我这里还是重新介绍一下。


    我们先来看看在引擎中动画相关的资源主要分为哪几类。

    第一大类是最基本的数据资源。其中主要来自于外部 DCC 工具制作并导入的原始资源,我们称之为 Anim sequence。

    然后,有些资源可能为了制作和导入的方便是分散开来的,但是有些情况下会组合到一起使用。所以引擎中有一种资源叫 Anim Composite。他是使用多个 Anim sequence 或是自身(Anim Composite)所组合成的资源。在使用时,依然被看作是普通的 Anim Sequence。

    第三种数据资源类型叫 Blendspace。他可以是一维的也可以是二维的。二维的情况下,在两个轴上,通过变量控制对任意在二维平面上指定的动画序列(Anim sequence)作混合。对于任意的二维输入,总能找到这个输入值在二维图像附近最接近的四个动画序列按照权重来混合。严格来说,Blendspace 并不是单纯的基础数据,他也受其它输入参数的影响来混合 Pose 。但是,由于在动画混合蓝图中是作为 Pose 的输入结点,我们这里依然把它作为数据类资源。

    第四种数据资源叫 Montage。这一类资源一般是直接受逻辑控制的组合资源。


    在数据资源的基础上,我们还可以绑定一些额外的数据。

    第一类常用的数据类型叫 Notify。引擎包括一些内建的 Notify类型。譬如,在走路的时候希望脚步踩到地面的那一刻,触发踩地面的事件,用来向地面投射贴花,用于产生脚印,以及播放脚步音效或扬起尘土的特效之类。这里的 Notify 你还可以扩展成你自定义的事件类型,可以在蓝图以及代码中去处理事件对应的逻辑。举个例子:如果做一个动作或格斗类游戏,在出招的时候,判定并不是从这个动画开始播放的时刻就已经有了的,可能是从出招动画到某一时刻开始,才有打击判定。那么我们就可以通过 Notify 来用事件通知游戏逻辑在特定的时候去打开和关闭判定。

    第二类叫 Curve。Curve 就是伴随动画序列的时间轴所绑定的曲线数据,后面会有一些举例。再然后你也可以绑定一些你自定义的数据类型。


    讲完刚刚这些数据类型,接下来就是最重要的处理动画混合逻辑的资源,叫 Anim instance。Anim sequence 的设计是基于对于 3A 级游戏中复杂的动画需求所产生。这里有一个假设,那就是动画状态在复杂的情况下一定是需要对骨骼结构有认知的。所以引擎中的 Anim instance 和骨骼是强耦合的关系。譬如你需要知道腰部的骨骼位置来区别开上半身和下半身的动画,这样的设计可以完成相当复杂的动画混合,但是却也带来了一些限制。如果我的整个动画状态只需要简单的一个状态机在不同的状态中,譬如闲置、追逐、攻击、受击、死亡,在每中状态中,并不作复杂的混合,而只是播放一个简单的 Anim instance。在整个逻辑中完全不需要用到骨骼信息。那么照理来说,即使拥有不同骨骼结构的对象,如果只需要这个简单逻辑的话都可以共享这套逻辑。然而由于我刚刚所说的 Anim instance 和骨骼的强耦合设计导致在现在的引擎框架下,这样的功能暂时无法完成。我们在内部也在作一些讨论,以后可能会有支持纯逻辑的 Anim instance 功能,而目前来看,如果大家有这样的需求,我建议在可能的情况下把这些对象的骨骼层次结构尽可能保持一致,这并不是说多个对象的骷髅要完全一致,而只是骨骼树的层次结构一致就可以了。譬如你的基础骨骼是个人形,有些怪物会多出尾巴或翅膀,这些多出的骨骼并不破坏原先的树状结构,而只是多出来的分支。所以还是可以利用 Retargeting 来共享 Anim instance 的逻辑。


    Anim instance 中,最明显的两块分别是 EventGraph 和 AnimGraph。其中 EventGraph 就类似于普通的蓝图,用来在 tick 的时候处理一些逻辑状态的更新以及播放 Montage。当然这些逻辑也可以在 C++里面做。AnimGraph 是用来混合和输出 Pose 的地方。说到混合,我们可以把每一帧中整个混合的过程看成是一棵树,从叶子结点输出的 Pose 经过枝干结点的混合计算输出到根结点的最终 Pose。我们刚刚说到的数据类的资源,就是这里所谓的叶子结点。这些结点本身不需要其它的 Pose 作为输入,而直接提供了 Pose 的输出。而枝干结点则是进行混合的结点,当然真的说混合也不是很准确,有些枝干结点只需要输入一个 Pose,在自己的结点逻辑中,对这个 Pose 作一些修正,并不进行混合。我们把这些枝干结点计算调整和混合Pose 的行为称作评估(evaluate)。举个最简单的枝干结点的例子,那就是多结点混合。譬如,输入的有两个 Pose ,一个权重是 0.8,另一个是 0.2,相当于是把第一个 Pose 的 BoneMap 的 transform 乘以 0.8,第二个乘以 0.2,再相加输出。这里我列了一个树状图,来表示动画混合的过程。但是因为这是个非常简化了的例子,所以其中不包括直接对骨骼进行控制或者直接 Override 一个 Fullbody slot 来强制更新整个 BoneMap 之类的行为。并且一般来说,一个正常的 anim graph 的一帧的混合也不会像这张简化图这样是棵红黑树。首先,就像我刚刚说的,你并不能保证他是二叉的,譬如刚刚说的多混合结点完全可以由三个或以上结点来混合,以及我刚刚说的有些枝干结点,只有一个输入。再者,大部分情况下他也不会是平衡的。在混合状态复杂的情况下,我们一般会分层次来混合,这就导致了这棵混合树会往一个分支方向衍生出去。



    好了,那么刚刚看到的是单帧的 Pose 混合计算情况。当持续到多帧以后,情况又会稍微复杂一些。譬如说两个 Pose 混合起来,他们的长度很有可能不一样。举例,我有一个走路的动画,他可能长达 2 秒,同时我又有一个跑步的动画,他长达 1 秒。如果我直接混合,就会出现很怪异的情况,譬如走路还在迈左腿的时候,跑步已经迈右腿了,混合起来的姿势就会非常奇怪。基于这种情况,我们引入了 Sync Groups 的概念,当我们设置这两个动画序列在同一个 Sync Groups 下进行混合时,引擎会把当前混合时权重较高的作为领导,把剩下的序列缩放到和领导序列一样长的情况,再按比例去做混合。这样就能解决动画长度不一致的混合问题。



    再来看多帧动画状态下,如果状态复杂,动画树上的某些分支在不同的帧内是完全不同的状态。为了简化树的逻辑,动画混合系统中可以使用状态机来隔离每一帧的状态。我这里的图例举了一个比较简单的 Locomotion 的状态机。

    关于动画混合的这棵树,在复杂的情况下,我们还会把他做分层。也就是把一棵混合完的树的根结点缓存下来,作为另一棵树的叶子结点。当然你也可以把整个复杂的树连到一起,分层只是为了便于维护和调整。这个图片是我们的 MOBA 游戏《虚幻争霸》中一个角色分层混合的模版示例。


    讲完了动画的基础概念后,我们来看一些例子加深理解。

    子树类用例。在引擎中有一类功能叫 Sub anim instance。这就类似于刚刚说到分层里面的一棵子树,这个子树可以拥有一个输入结点,并且输出一个 Pose 。典型的应用方式,是把在同一个逻辑下有多种可替换的子逻辑分离开,做到不同的 Sub anim instance 中。这样可以把剩余的逻辑用来共享。通过替换不同的 Sub anim instance 来组合出最终不同的效果。



    接下来讲一些叶子类的用例。通常的叶子类结点就是我们刚刚说的数据类结点,我这里举两个比较特殊的例子。在 4.17 版本中,我们会加入一个叫 live link 的结点。它通过引擎的消息总线从外部实时读入数据输出Pose 。这里的输入源可以是各种 DCC 工具,也可以是动作捕捉或手势识别类设备。在我们放出的第一个版本中,会带有一个 maya 的实现,通过 maya 的插件把在 maya 中当前动画的 BoneMap 数据通过 live link 消息总线和引擎进行通信。引擎把接收到的数据转换成引擎内的数据输出当前的 Pose 。这样就可以做到在 maya 中一边播动画一边在引擎中看到效果了。



    下一个叶子类结点的举例,叫 Pose Snapshot。Pose Snapshot 就是把任意指定帧的 BoneMap 记录下来,在接下来的任意时刻,用来作为数据源输入和其它 Pose 做混合。譬如在 Robo Recall 中,你打倒了机器人,机器人会进入物理状态而倒地。你可以把这个状态存下来,在之后再和站起来的动画作混合。


    刚刚举了两个叶子类结点的例子,我们再来看看动画混合中最大的一类——枝干类结点的例子。大部分情况都是多个 Pose 按权重进行混合,当然也可以是按照 bool、int、enum 值进行混合。我这里依然举一些特殊的例子。


    第一个例子是 RigidBody 结点。在讲这个结点前,我要先介绍一个伴随而来的概念,叫 immediate mode physics。引擎中以前的 Physics 是所有的 RigidBody 都加到同一个 PhysX scene,这种情况下如果每个角色身上都有多个需要计算物理的 RigidBody,场景中又有大量的这样的角色,计算量就相当的大。但是大部分时候角色互相之间的物理碰撞细节大家并不关心,所以这样的效率比较低。

    因此我们和 Nvidia 进行了合作,他们对 PhysX 的 Api 进行了调整。在新版本中放出了更底层的 Api 可以让我们在引擎中做更细致的控制。大家可以看到这个新的 immediate physics,一个角色身上所有的 RigidBody 都只注册在当前这个 skeletal mesh component 下,多个 SMC(skeletal mesh component 缩写)之间并不会有交互,这样很大程度上提高了运行的效率。

    大家可以看到,这里的视频同屏有几百个小兵站在地上做闲置的动画,在受到物理冲击后转入到物理状态。这么大量的物理对象在我的笔记本上依然能稳定在 60 帧,而右边的图也显示了单个较为复杂的角色在模拟物理时候的开销,只使用了 0.24ms。大家可能觉得这是一个纯粹物理的功能,为什么我放到动画的枝干结点的例子里来讲呢? 因为事实上你可以在动画中把动画计算完的 Pose 输入进去,在这个结点中根据当前动画的Pose 和前一帧计算完的结果计算出骨骼结点的变化,从而模拟出物理受力的变化,并根据输入的权重混合回你的 Pose 。有了这样的功能,做我之前说的 Robo Recall 中很自然的击倒机器人或者拳击类的游戏、以及用枪射击怪物时怪物比较自然的受击都变得相当简单。



    好了,下面我们再来看另一个枝干结点的例子。我们称之为 Speed Warping。传统的游戏中如果你调整了移动速度,那么为了不产生滑步你也需要调整跑步的动画播放的速率。譬如你的速度翻了一倍,那么很多时候你就需要把动画也加快一倍播放,大家可以看到在这里的视频右边加快播放后的动画其实是很别扭的。真实情况下我们提高速度除了迈出的脚步速度会有一些变快以外,更多的情况下,其实是调快了步幅。同样的减慢速度也是这样。所以 Speed Warping 就是做了这么一个效果。那我们是怎么计算的呢?



    简单来讲,原始的动画双脚的位置是这里的红球。我们计算他跟腰部垂线的水平距离并根据加减速的倍率横向扩展。譬如当是 2 倍的时候,调整到绿球的位置。但这个时候两只脚的距离被拉的太长了,因此我们适当的往下调整了屁股的位置,并且将两只脚以刚才绿球所在位置到屁股的连线上挪动一段距离使得脚步的长度保持不变,所以最终计算出来的就是蓝球的位置。



    我再举一些其它的例子。比如引擎中当你对 AnimBP 进行继承的时候,所创建出来的内容叫 Child AnimBP ——它所做的事情是让你重载所有的叶子类结点。举个实用的例子:譬如我有一种敌人,他永远是从初始的出现状态到发现玩家到向玩家攻击这样转化,而这样的怪物在地图上不同的场景下有不同的出现动画,有可能是从地上爬出来的,有可能是从墙上跳出来的。对于这个怪物来说,他的动画切换状态都是一样的,所不同的只是初始状态所需要使用的资源,所以只需要替换初始的动画(某个叶子结点)就可以了。



    再举一个例子,有不少人问过,在《虚幻争霸》中,是怎么做到让角色不滑步的。传统的主机游戏中,为了让脚不滑步很多时候我们都是使用 root motion 来做移动的动画。但是因为《虚幻争霸》是个 MOBA 游戏,策划会希望能够用数据来驱动移动的速度。譬如在有不同的 buff 或者装备的情况下,角色的速度也会发生变化,这用 root motion 就很不好处理。所以我们做了一个叫 Distance Curve 的功能,这也是我刚刚说到的 Curve 数据的一种运用方式。我们可以把 Distance Curve 的方式看成是反向的 root motion。它通过给所有的启动、旋转、站定动画都加入曲线数据,曲线上的数值表示当前这帧动画到达站定点的位置的距离,其中站定点(Marker)是很容易预测的。


    当玩家的输入发生变化,引擎的计算在那一刻就能完成,可预测出最终速度衰减后站定的位置。通过查询曲线中动画到站定的距离可以直接从对应距离的那一帧动画开始混合。当然这些计算都有一些前提,首先,曲线中的数值在靠近站定点的动画中取负值,而远离取正值。这种时候 Piviting 行为也就是你在往左走的时候突然往右,这条曲线是从负值到正值的,这样这条曲线就满足了无论什么情况下都单调递增并且除了0其它的值都不会重复,这就方便我们在O(n)复杂度下找到对应的动画帧数。



    举完了这些例子以后我们来看看动画的优化。优化是个很大的话题,有很多方面。有些是可以在设计上规避掉的,有些是则是在内容上做了优化。虽然今天我不对这些做举例,但其实引擎也有工具可以直接在骨骼结构上右键设置在某一级 LOD 以下不更新这些骨骼,这也算是内容上的优化。那么接下来我主要讲在不希望太大的妥协效果的情况下,两大类优化的手段:

    其中一类就是降低人们低感知部分的采样频率。譬如空间上的 LOD 或者时间上的更新频率 URO,基本思路就是离的远的、占据视频面积小的、或者甚至是看不见的,降低更新的细节层次以及降低更新的频率。另外一类是尽可能提高利用硬件的计算能力,尽可能降低不同动画任务的依赖性来提高并行计算。



    在引擎中,SkeletalMeshComponent 中有一个 Update Flag 选项,默认是 Always Tick Pose。这意味着当 SMC 不被渲染到的时候,动画逻辑还是会 Tick,并且 AnimGraph 里的节点虽然不会计算 BoneMap 也就是没有实际的 Evaluate 计算,不过还是会计算对应节点的 Update,也就是计算这些节点的输入权重之类的数值。这使得在动画对象重新进入视野中进行绘制时,可以很自然的直接更新到最新状态下的姿态。所以大部分时候,不是不得已,都不需要使用 Always Tick Pose and Referesh Bones。而如果你对于一些不太重要的动画对象,甚至不关心他们不被渲染的时候 Pose 逻辑需不需要更新的情况下,可以进一步的选择 Only Tick Pose when Rendered 来进一步减小 CPU 的开销。



    另一个比较重要的设置是 AnimGraph 的各种枝干接点上的 LOD Threshold 选项,大部分这类需要进行 Evaluate Pose 计算的接点上,都会有这个选项,默认数值是 -1,也就是不会起效,如果设定了正整数值的话,就相当于在对应的 LOD 情况下,这个节点以及往下的子树就都不会评估了。对于同屏有大量骨骼动画对象的情况下,仔细调整和设置 AnimGraph 中各个节点的 LOD Threshold 能很有效的降低动画 CPU 的开销。



    再有一个是刚才说道的 RigidBody 接点的 LOD 优化,引擎在创建 RigidBody 加到当前 SCM 中的时候,已经根据所有的 LOD 从最下级到最上级进行了排序,这样一来,切换 LOD 后,自然而然的只要取列表的前几项做计算就可以了。



    再来我们说一下 URO,也就是更新频率的优化。例如,可以根据离 Camera 的距离,调整 Tick 的频率。我这里给了个开启 URO 的例子,甚至我们可以根据不同的 LOD 设置不同的频率,引擎中也有 LODMapForURO 的设置。



    那么我们再来看看怎么提高并行。由于 BP 是在虚拟机上执行的,所以都是在游戏线程进行的,无法进行并发,所以如果有大量的动画对象希望提高并行的话,建议大家不要使用 AnimInstance 的 EventGraph 更新逻辑,而是写到 C++ 中,在自己的 AnimInstance 类中指定自己的 Proxy 继承类,并写到 Proxy 的 UpdateAnimation 中,这样引擎就能把动画的 Update 以及 Evaluate 都放到 Proxy 上通过其他工作线程并行执行。



    大家可能会注意到,在 ACharacter::PostInitializeComponents() 中,对我们的 MeshComponent 的 PrimaryComponentTick 加了一个前提条件,也就是角色的 CharacterMovement 这个 component 的 tick。因为引擎希望当前这帧的动画更新的信息是基于移动后的位置进行的。如果大家不需要这样准确的依赖,还可以在自己的角色继承类中,重新去除依赖,来使得动画的计算能更早的利用工作线程并行计算。



    再有一点,基于 UE4 的网络模型,服务器端在默认情况下也会有不小的动画计算开销,我们其实可以在大部分时候做一些优化,譬如关闭服务器的物理状态计算。如果不需要很精确的在服务器端计算角色的动画变化,可以保证服务端的计算不依赖于骨骼位置,那么可以在服务端完全不评估整个动画(仅使用 Capsule 作角色位置的验证或计算)。如果还能保证所有的动画中触发的事件不会影响到 Gameplay 而只会影响表现,那么还可以关闭整个动画的更新和 tick。一般来说 Montage 是游戏逻辑直接控制的动画状态,那么我们可以把在这些动画中影响游戏逻辑的事件全都加在 Montage 上,所以只有在播放 Montage 的时候才需要 tick。最后,即使进行 tick 也依然可以使用之前说到的 URO 以比较低的频率来 tick。




    这里是初始化的时候设置当进行播放和停止 Montage 的时候进行回调的例子:通过判断 AnimInstance->IsAnyMontagePlaying() 来决定是不是要允许 tick,这里的事例实现了根据当前是否在播放 Montage 在服务端自动调整是不是要 tick。因为服务器端从来不需要渲染,所以当客户端设置成了 OnlyTickPoseWhenRendered 的时候,服务端就可以完全不需要 tick。

    以上就是今天要讲的所有内容,谢谢大家。


    本文章转自http://gad.qq.com/article/detail/27926#

    展开全文
  • Unreal Engine 4简介 一、什么是虚幻引擎(Unreal Engine 4)? 虚幻引擎4是由全球顶级游戏EPIC公司虚幻引擎的最新版本。是一个面向下一代游戏机和DirectX 9个人电脑的完整的游戏开发平台,提供了游戏开发者需要...

    Unreal Engine 4简介

    一、什么是虚幻引擎(Unreal Engine 4)?

    虚幻引擎4是由全球顶级游戏EPIC公司虚幻引擎的最新版本。是一个面向下一代游戏机和DirectX 9个人电脑的完整的游戏开发平台,提供了游戏开发者需要的大量的核心技术、数据生成工具和基础支持。

    二、什么是Unreal Engine编程?

    “用Unreal Engine制作游戏”时,有两大必不可少的部分。


    一是“制作3D游戏场景”。Unreal Engine中,为我们准备了可以高度渲染3D图形的工具,运用这些功能就可以制作逼真唯美的3D游戏场景。但仅凭这个是做不出游戏的。


    制作游戏还有一个必不可少的重要操作,那就是“编程”。Unreal Engine软件包含了显是3D图形和让3D图形动起来的各项功能。

    三、Unreal Engine编程的形式

    Unreal Engine编程可以被分为两部分,分别是C++和蓝图。

    • C++

    C++作为一种规范的编程语言被广泛使用,它以C语言为基础并大大强化了其功能,应用于应用程序开发等这种对编程要求较高的领域。
    很多熟悉C++的程序员可以很快地投入开发,但对于没有编程经验的工作人员来说,直接上手C++恐怕会比较艰难。但不用担心,Unreal Engine还为开发者准备了另一种更直观地编程形式,让使用者能够轻松上手。

    • 蓝图

    蓝图是Unreal Engine中的一种可视化语言。它事先将各种可执行的处理以“节点”的形式创建,然后只需要用鼠标拖拽将其排列、连接就可以实现编程。
    蓝图是从Unreal Engine 4起搭载的一种非常新的功能,Unreal Engine的开发者也将蓝图和C++并列定位为开发的两大支柱。所以,不必抱有“蓝图只能实现简单的内容吧”这样的担心哦。

    展开全文
  • unreal4 源码引言

    2018-11-15 17:59:37
    unreal GIS 模块unreal4 模块与GIS结合unreal4 蓝图介绍与场景搭建 unreal4 模块与GIS结合 unreal4 蓝图介绍与场景搭建 四叉树介绍与系统衍生
  • 介绍Unreal Engine 4Unreal Engine 3的一些不同点。
  • 《学习笔记记录》 新人接触UE4,在此发帖主要用于记录学习内容,同时希望可以帮助其他朋友 在网上看到很多AR的视频,感觉很...插件名称:Unreal4AR 官方网址:http://www.unreal4ar.com/ 打开后出现如下所示界面 此
  • Unreal 4 术语简介

    2015-09-01 23:41:29
    Unreal 4 术语简介标签(空格分隔): unreal4 游戏引擎 游戏开发翻译自ue4官方文档。Unreal 4 术语简介 翻译自ue4官方文档 Objects Actors Components pawns Characters PlayerController AIController Brushes ...
  • Unreal Eegine 4 C Component介绍BrainComponent BrainComponent简介 添加AIModule依赖 继承BrainComponent 使用BrainComponent 定义消息 监听消息 发送消息 Unreal Eegine 4 C++ Component介绍——...
  • Unreal Engine 4 C 插件介绍 创建插件 C静态链接插件 Unreal Engine 4 C++ 插件介绍好记性不如烂笔头啊,还是记录一下!1.创建插件 创建插件的步骤很简单,但是很容易出错: 关闭项目,在项目目录下创建Plugins...
  • Unreal4 入门

    2015-07-16 10:16:39
    使用Unreal4引擎前需要安装 或者编译... 下面就为同学们介绍Unreal4 安装配置。 一. 在Win7下安装Unreal4 在Win7下安装Unreal4需要以下几个步骤: 1. 打开“控制面板”的“程序和功能” 检查是否已
  • 简介:十篇文章介绍虚幻4引擎的入门和基本内容,蓝图、材质、粒子效果、UI界面等 系列目录 准备篇 基本操作 材质入门 初步运行 简易交互门 多种开门方式 相对坐标、绝对坐标、世界坐标的含义 UI 粒子...
  • Unreal Engine 4 的 光和影UE4中的所有光源通过lightmass和直接两种方式作用于物体。同时灯光分直接光和间接光。各种灯光的Movable和Stationary类型都会对物体产生直接光照明。所有Static类型灯光,自发光材质物体...
  • Unreal Engine4(虚幻4)材质
  • unreal4特性介绍网址:https://www.unrealengine.com/products/unreal-engine-4  unreal enginer介绍 我的UE4学习(一) 你曾想过用连线的形式来编写程序么; 你曾想过通过编辑工具就可以来创建类,并在vs中自动...
  • 这本书介绍了如何使用C++编程语言开发Unreal Engine 4游戏
  • Unreal Engine 4 C Component介绍WidgetComponent WidgetComponent简介 添加UMG依赖 UMG控件蓝图 UUserWidget的UMG控件 SWidget的Slate控件 扩展WidgetComponent Unreal Engine 4 C++ Component介绍——...
  • 1、什么是框架,为什么使用框架 什么是框架 可以说,一个框架是一个可复用的设计构件,它规定了应用的体系结构,阐明了整个设计、协作构件之间的依赖关系、责任分配和控制流程,表现为一组抽象类以及其实例之间协作...
1 2 3 4 5 ... 20
收藏数 2,813
精华内容 1,125
关键字:

unreal4 介绍