unreal怎么指定vs版本

2018-05-10 10:39:45 heneyT 阅读数 1685

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#

2015-09-02 15:17:51 pizi0475 阅读数 9830

设置Visual Studio和虚幻引擎4协同工作有利于提高开发人员使用UE4 的效率和整体用户体验。

推荐设置

以下是为结合使用Visual Studio和虚幻引擎4的开发人员推荐的设置。

  • 关闭 Show Inactive Blocks(显示不活动的代码块) 。如果您不关闭此项,在文本编辑器中,很多代码块会呈现出灰掉 状态。(Options(选项) > Text Editor(文本编辑器) > C/C++ > Formatting(格式)) 。

  • 打开IntelliSense(智能编码)和"squiggles(波浪线提示)"功能,让它们正常运行。(请参照Intellisense(智能编码), Live Errors(实时错误)和Squiggles(波浪线提示)部分)

  • 在Visual Assist X (VAX)中关闭 Format After Paste(粘帖后格式化) 功能。这个功能有时候会导致格式变得混乱。(VAX Options(VAX选项) > Advanced(高级) > Corrections(校正))

  • 在解决方案浏览器中停用 External(外部) 文件夹, 它们会扰乱视图。( 在 Options(选项) > Text Editor(文本编辑器) > C/C++ > Advanced(高级) 中 Disable External Dependencies Folder(禁用外部依赖文件夹) )

  • 如果不需要 Edit & Continue(编辑&继续) 功能,请关闭它们。(Options(选项) > Debugging(调试) > Edit and Continue(编辑并继续))

  • 关闭 Error List(错误列表) 窗口。如果启用该功能,当您的代码中出现合法错误时 Error List(错误列表) 窗口会自动弹出 。但是,当和虚幻引擎结合应用时, Error List(错误列表) 会显示不正确的错误信息。建议您最好 禁用该窗口,并使用 Output(输出) 窗口来查看您的代码错误。这个窗口将仅显示 真正的错误。要想禁用Error List(错误列表)窗口:

    • 如果 Error List(错误列表) 窗口处于打开状态,请关闭它。

    • 从 Tools(工具) 菜单中, 打开 Options(选项) 对话框。

    • 选择 Projects and Solutions(项目和解决方案) 并取消选中 Always show error list if build finishes with error(如果编译中出现错误总是显示错误列表) 选项。

Intellisense(智能编码)、Live Errors(实时错误)和Squiggles(波浪线提示)

虚幻引擎4项目现在可以正常支持 IntelliSense(智能编码)功能,包括实时Error List(错误列表) 和 "squiggles(波浪线提示)"! (请参照以下介绍获得如何启用它的信息。)

VC10的IntelliSense功能可以在您编写代码的过程中重新编译C++。这比仅检查 VAX的语法强大很多: VC10使用完整的C++编译器,可以验证每一行代码。这个功能非常强大并且将会 加快您的工作流程!

VC++ Intellisense Squiggles

当其和波浪线提示功能结合使用时,如果您正在查看的文件有任何IntelliSense 错误,都可以在Error List(错误列表)中看到。 您可以通过Error List(错误列表)的右击菜单来打开或关闭该功能。

VS 2010 Error List

由于Squiggles(波浪线提示)功能不能和虚幻引擎4项目协同工作,您可能已经禁用了它们。请确保点击 C/C++ Advanced(高级)选卡,并使用以下设置。

VC++ Advanced Options

当您打开一个C++文件时,您可以通过查找这个图标来判断IntelliSense编译器是否正在“工作”:

Intellisense Progress Indicator

实现细节

  • 当编写代码时显示波浪线提示有时候要花几秒钟的时间。

    • 这是因为我们有很多包含文件,且IntelliSense目前不使用预编译头文件。

  • 有时候您会看到“误报的”IntelliSense 错误。以下是几种可能的原因。

    • IntelliSense编译器(EDG)比MSVC编译器更严格。

    • 某些针对IntelliSense的#defines设置和正常编译时的设置不同。

    • IntelliSense编译的C++总是被当做32位对待。

  • 如果绝对需要,您可以把代码封装到 #ifdef __INTELLISENSE__ 中,以消除波浪线提示。

  • IntelliSense的错误的表达方式和VC++ 编译器的错误的表达方式略有不同。他们只是表达不同而已。

  • 头文件中的Squiggles(波浪线提示)功能通过编译包含它的已知 .cpp 对应的头文件来进行工作。

    • 有时候IntelliSense把这个功能搞乱了,导致您会在头文件中看到波浪线提示。

  • 如果需要,您可以增大 Max Cached Translation Units(最大缓存变换单元) 设置。

    • 它会使用更多的内存,但可能会提高一点反应速度。

  • 有少量C++文件还不能和IntelliSense相兼容。

  • Unreal Build Tool有一个新的 -IntelliSense 选项。

    • 这将为我们的所有项目文件产生IntelliSense属性表。

    • 当添加了新的模块或者项目包含发生改变时仅需要重新运行它即可。

UnrealVS 插件

Visual Studio的UnrealVS扩展提供了在使用虚幻引擎进行开发时对常见操作的轻松访问。

unrealvs_toolbar_cmd.png

功能包括:

  • 设置启动项目。

  • 编译启动项目的可绑定命令。

  • 设置命令行参数。

  • 批量编译项目。

  • 快速编译项目菜单。

UnrealVS扩展 无法 与 Visual Studio Express 版本 共同运作。它仅与Visual Studio专业版兼容。

UnrealVS插件不能和Visual Studio 2012精简版协同工作。它仅能和Visual Studio 2012 专业版相兼容。

请参照UnrealVS扩展页面 获得设置及使用该插件的信息。

调试

Visual Studio支持通过‘可视化查看器’来扩展调试器,从而轻松地查看常见的虚幻数据类型, 比如对象FNames 和动态数组。根据您所使用的Visual Studio 2010或Visual Studio 2012的不同, 这个功能的设置也有所区别。

针对Visual Studio 2012的可视化查看器设置

您会发现您的安装文件中包含了具备该可视化查看器逻辑的文件:

[ROCKETINSTALL]/Engine/Extras/VisualStudioDebugging/UE4.natvis

复制该文件到以下位置:

[VSINSTALLDIR]/Common7/Packages/Debugger/Visualizers/UE4.natvis
[USERPROFILE]/My Documents/Visual Studio 2012/Visualizers/UE4.natvis

复制该文件到您的Visual Studio安装目录内可能需要管理员权限。

2016-11-30 08:46:12 qq_27481603 阅读数 4659

unreal官网 右上角获取虚幻引擎


安装全程不需要翻墙, 安装完这个样子:


点击unreal engine页  下载引擎的最新版本,全程也不需要翻墙. 安装完就可以启动啦!



unreal开发  分蓝图和c++代码两种形式.蓝图就是可以不用写代码直接用工具的形式构建项目,不过显然代码功能更强 编辑器右上角有个帽子是教程.


新建c++项目时需要安装visual studio 2015  否则可能会报各种错误, 我一开始装完Unity3D自带了vs2015但是可能因为走了默认安装配置所以报错: 缺少windows8.1 sdk 或者缺少32位的vs文件  安装的默认配置中是不勾选c++环境的   要自定义安装  把c++开发环境勾上


安装ue4时有个勾选选项: 用于编辑器的符号显示  很大,有13个g  是编写c++代码时的提示,在崩溃时也会有用,有什么用群里大神没说..

2018-07-14 18:59:36 qq_31788759 阅读数 2709

如果你的电脑有多个版本的Visual Studio,默认会以VS2015版本运行编译器。

那么在UE4引擎里,如何更改自己想要的编译器呢?

 

English Version:Edit-Editor Preferences-General-Source Code

中文版本:编辑-编辑器偏好设置-普通-源代码

2018-06-14 16:10:44 kmyhy 阅读数 35512

原文: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网络架构

阅读数 1610