虚幻3引擎引擎4 为什么我的和别人的不一样 细节差了一些东西

虚幻4引擎吧-百度贴吧--3D游戏引擎之最--虚幻4引擎(Unreal Engine 4)又称虚幻引擎4,是一套DirectX10.x/11 PC、Xbox 360、PlayStation 3平台准备的完
签到排名:今日本吧第个签到,
本吧因你更精彩,明天继续来努力!
本吧排名:
本吧签到人数:10
可签7级以上的吧50个
本月漏签0次!
成为超级会员,赠送8张补签卡
连续签到:天&&累计签到:天
超级会员单次开通12个月以上,赠送连续签到卡3张
3D游戏引擎之最
坐标北京,找一个程序合伙人创业(占股)。 要做的游戏是3D横版射击,但是操作稍微重度一点,主要是
我下完了UE4,启动是却出现了这个情况。。。
为什么下载的虚幻4引擎里面没有任何植物模型呢!
安装时卡在这个界面很久了。没有提示,也没有进度,是正常的吗?
1楼中文官网地址: 虚幻4引擎现在可以免费下载使用了,在下载前需要先注册一个账号。传送门: https://www.unrealengine.com/zh-CN/what-is-unreal-en
如果不能,那虚幻3好使吗
This error is generally caused by one of two things. The first is a prompt requesting administrator access. If you ignore, don't see, or den
各位大神 有没有推荐的虚幻4的自学网站啊
各位大神这个是缺了点什么
各位前辈好。
大神为什么我的ue4虚幻引擎一直无法打开试了好多次了
在官网上下载的时候遇到错误:502 Bad Gateway 后来搞到了:Epic Games Launcher ,结果在下载安装时,出现连接
这是咋回事啊 下载 15% 就开始 无限初始化,再然后就是 安装失败 咋回事啊
刚开始接触UE4 创建一个基础代码的项目 结果编译有问题 有没有人遇到过啊
求虚幻4中文版资源
空间里面的说说
求高手 给个虚幻的的下载链接 要中文版的 谢谢啊
为了解决这个问题,今天弄了一整天了,网上一些常见的解决方法都试了个遍,实在没辙了,有没有人和
在官网上点击下载后提示:502 Bad Gateway
到这之后咋办?重启了还是英文的呢,求帮助啊
如题,求给一个下载地址,还有32位系统能使用吗?
虚4引擎用gtx750 cpu3.40能运行吗,期待
我在语言栏已经设置了中文,可界面还是英文的,是没保存还是什么的?哪里也没有保存键~
RT 许多人都在用UE4,这个贴吧怎么还没有火。
现在虚幻4的免费版还没出吧。。。 现在UDK最新版也只是虚幻3 2013 7月的
发贴红色标题
签到六倍经验
兑换本吧会员
赠送补签卡1张,获得
助攻总额: 43W
发表后自动分享本贴
使用签名档&虚幻引擎4——VR开发入门
现在人们围绕虚幻现实的话题越来越热,同时每天越来越多的人加入到VR开发中来。本指南特别适用于那些使用虚幻引擎4开发VR的人使用,来自包括Epic Games的官方文档不同资源的整理,涵盖了蓝图和C++两部分内容。本文,我使用HTCVive和虚幻引擎4.11Preview版本进行开发。请注意,VR仍然是一个相当新的主题而虚幻引擎每一个新版本中都会增加一些新功能,所以强烈建议尽可能使用最新版本。
有几个不错的地方值得去看看:、以及。
如果您正在寻找VR模板让你立即开始,可以去my 。这些模板是目前正在制作摄像机以及运动控制器的各种功能,并且同时支持C++和蓝图。现在这个项目还在制作过程中,以后将会作为编辑器的内部模板进行使用。
设置你的VR设备
在本指南中,我假设你已经成功地安装了选择的头戴显示器设备。如果你在使用Vive过程中出现问题,我想这篇是会有帮助的。
虚幻引擎4支持所有主流的设备,因此您没有任何去麻烦设置你的VR项目。只要确保你的头戴显示器的插件在Edit & Plugins目录中被正确加载就行。
在您启动编辑器之前确保您的VR软件已经运行,如果使用的是Vive,其应用程序是SteamVR。
特别在Vive中: 当你启动编辑器的时候,SteamVR或许会显示“Not Ready”,则表示有某些重叠使得VR的混合屏分辨率不超过60FPS导致出现抖动和动作不连贯。关于这个问题的更多解决方法可以在上找到。在这些Vive设备使用直接模式再启动设备的时候就不会出现这个问题了。
启动VR预览
测试你的VR设备非常简单,只需要选择PLAY中下拉按钮中的“VR Preview”就可以。默认情况下,不需要改变你已有的项目或模板,头部移动跟踪效果也会即刻生效。我会在接下来的指南中讲到更多关于如何添加像运动控制器和原点设置这些扩展功能。
VR最佳实践
VR仍然是相当新兴的领域,随着每天的发展我们不断学习新的东西。 和 都提供了最佳实践指南,我建议你最好通读一遍并在开发VR游戏的过程中细细体会。
使用蓝图开发VR
使用蓝图开发VR是非常简单的,你不需要大量设置工作可以开始。
你会需要一个CameraComponent(摄像机组件)和一到两个Motion Controllers Components(运动控制器组件)。默认情况下,你的摄像机已经添加了HMD支持,如果你希望关闭HMD转向变化效果,可以在组件的属性设置中找到“Lock to HMD”进行关闭。更多关于运动控制器的信息,你可以跳至指南后面的部分进行了解,或者马上查看官方文档 。
以下是不完全的蓝图可用节点列表
重置你的偷窥位置或方向(可选择设置偏移量)
当你在使用VR需要选择一些功能时你可以容易的检查HMD是否工作。
SteamVR Chaperone
Chaperone组件是专属于SteamVR的组件,可以很方便去访问软边界。软边界是以HMD为原点(0,0,0)校准的向量数组。其Z轴向量值始终为0。如下图所示,你可以添加这些组件像添加ActorComponent到Blueprint一样。
设置运动控制器
官方文档对于介绍的很清楚,如果你的VR设备支持运动控制器我建议你照着其官方文档一步一步去设置。你可以在my 找到实际的例子。
如果你在使用相机校准运动控制器的过程中遇到麻烦,只需要把一个(场景组件)SceneComponen当做“VR原点”,在根组件处于一个意外的坐标点,象是(封装组件)CapsuleCompoent在角色蓝图中的时候,这种方法尤其管用。
用C++实现VR
由于4.11版本并没有把所有功能都在蓝图中提供,所以如果你尝试实现些高级定制功能,你需要深入C++去进行一些设置。找到IHeadMountedDisplay.h看下文件里一些能有效利用的函数。某些插件如SteamVRChaperoneComponent增加一些额外功能只能针对单个设备。
必要的模块和包含文件
如果你想通过C++访问HMD,你需要在ProjectName.Build.cs文件包含“HeadMountedDisplay”模块,这些你可以在你的Visual Studio解决方案资源管理器中找到。以下使用的是构建文件的例子
要使用HMD功能或运动控制器组件,请确保您包括下列头文件。
性能注意事项
为了VR体验全程更舒适,你的游戏需要维持在在75赫兹(Oculus DK2)或甚至90赫兹刷新率(HTC VIVE和Oculus CV1)运行,这取决于你的设备。在运行游戏的时候你可以在控制台输入“stat fps”或“stat unit”(更详细的分类)去了解当前的帧率。
你的游戏会受限CPU和GPU性能,你需要找出那些你需要测量的数据。(一个快速的方法是用“statunit”)。基于游戏以及引擎的复杂,现有信息是几乎不可能去很好预测你的性能瓶颈,所以你需要使用合适的工具。写了一篇使用虚幻引擎4时的CPU分析的博文,那是个不错的入门。
按下Ctrl+ Shift + ,或在控制台输入“profilegpu”可以获得每一帧的GPU时序图。该命令可以准确测量GPU时序,在使用VR的过程中,你会发现某些处理进程会对帧率造成很大的负担(AmbientOcclusion就是一个很常见的例子)
GPU分析和性能分析都是了解如何分析你游戏的好方法。
尽管进行了性能分析,你也许还是会栽在场景或项目中里那些耗费性能的其他特性上面去。比如Translucent LightingVolume,你可能不需要它,但是即使不实用它,它也会在你的场景中增加静态成本。查看这篇文章获得更多信息来学会如何禁用这个功能。所有这一切都需要你来测量和测试,没有任何一个的配置能是适合所有项目。
FATED的开发人员列出了一连串,他们提到了几点,比如禁用HZB遮挡剔除(r.HZBOcclusion0),运动模糊(r.DefaultFeature.MotionBlur= FALSE)和镜头眩光(r.DefaultFeature.LensFlare= FALSE)。这些命令不能在多重会话中维持状态,所以你应该增加(或搜索和替换)设置它们在你的/Config/DefaultEngine.ini配置文件。虽然大多数这些设置都可以通过Edit & Project Settings… & Rendering.
另一个显著的优化那就要提到立体渲染实例化,我们接下将讨论它
实例化渲染
(Ryan Vance说:“基本上,我们可以利用硬件实例化,通过单一绘制以及渲染循环来绘制双眼。这明显减少了CPU渲染线程时间,同时提升了GPU性能。在渲染线程上,Bullet Train可以实现CPU在渲染线程15-20%的提升,GPU性能7 – 10%的提升。”
4.11以上版本启用此功能,要进入项目设置然后在“渲染类别”下找到“Instanced Stereo”
禁止消耗性能的后期处理器
某些后期处理效果在VR计算成本很高,比如Ambient Occlusion。在VR可能还有其他像镜头眩光造成打断沉溺场景呈现后,不得不去使用摄像机替代,这样令人讨厌的体验。这些是非常简单的例子去开始查看这些是如何影响你的游戏和画面表现的。
要在项目层面禁用某些后期处理功能,可以按照Edit & Project Settings & Rendering。你可以在调整后期处理量中做同样的事情。请记住,调整后期处理量可以覆盖以下指定的项目范围的设置。
减少场景复杂性
如果目前硬件很难去让你达到FPS90的效果,您可能需要重新检查以前的设置限制,并查看场景的复杂性,比如动态阴影,大气烟雾效果和网格多边形数。
最大限度地减少透支是非常重要的减少开支的方法。许多半透明表面和/或粒子效果很容易使你的帧率出问题。可以按Alt+8的视口让当前着色器复杂度/透支变得可视化(按Alt+4,返回到默认视图)。从Elemental Demo底部图片可以了解环境对你帧率影响多少(绿色=好,红=坏,白热化=极坏像素约2000着色器指令)
动态阴影和灯光对性能有着很大的影响了。尽量多的使用光线烘培,让你每帧的成本尽可能的低。
绘制命令列表
出色的 一文中包含了用于VR GPU优化的一系列渲染命令,你可以在下面找到这些命令列表,我通常建议你观看他们讨论的时候跳过那些关于虚拟现实的大量基础技术。
为了测试这些命令打?(波浪号)打开命令控制台,将命令设置到你的项目中,你可以将他们一次到你的配置文件中,添加它们/Config/DefaultEngine.ini 中[//Engine.RendererSettings].下面。提示:确保这些命令在你添加之前是否已经存在
§ r.SeparateTranslucency=0
§ r.HZBOcclusion=0
§ r.FinishCurrentFrame=1
§ r.MotionBlurQuality=0
§ r.PostProcessAAQuality=3
§ r.BloomQuality=1
§ r.EyeAdaptionQuality=0
§ r.AmbientOcclusionLevels=0
§ r.DepthOfFieldQuality=0
§ r.SceneColorFormat=2
§ r.TranslucencyVolumeBlur=0
§ r.TranslucencyLightingVolumeDim=4
§ r.MaxAnisotropy=8
§ r.LensFlareQuality=0
§ r.SceneColorFringeQuality=0
§ r.FastBlurThreshold=0
§ showflag.decals=0
§ r.SSR.MaxRoughness=0
§ r.SSR.Quality=0
§ r.rhicmdbypass=0
§ r.TiledReflectionEnvironmentMinimumCount=10
立即阅读相关好文章
责任编辑:
声明:该文观点仅代表作者本人,搜狐号系信息发布平台,搜狐仅提供信息存储空间服务。
专业游戏开发社区
服务广大游戏开发者,为开发者们解决游戏开发中的难题
今日搜狐热点您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
虚幻引擎4.doc.doc 33页
本文档一共被下载:
次 ,您可全文免费在线阅读后下载本文档。
下载提示
1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。
2.该文档所得收入(下载+内容+预览三)归上传者、原创者。
3.登录后可充值,立即自动返金币,充值渠道很便利
虚幻引擎4.doc.doc
你可能关注的文档:
··········
··········
该版本为虚幻引擎 4 带来数百项更新,包括由 GitHub 上的虚幻引擎开发人员社区提交的 53 项改进!感谢虚幻引擎 4.10 的所有贡献者:
Andreas Axelsson (judgeaxl), Andrew Scheidecker (AndrewScheidecker), Artem (umerov1999), Artem V. Navrotskiy (bozaro), Cengiz Terzibas (yaakuro), Christopher P. Yarger (cpyarger), Clay Chai (chaiyuntian), Cliff Jolly (ExpiredPopsicle), Coherent UI (CoherentUE4), Derek van Vliet (derekvanvliet), Frugality, Guillaume Buisson (monsieurgustav), Ian Fox (MaideCa), Jay Mattis (braindx), Jeff Rous (JeffRous), Joshua Olson (MrMormon), Kacper Kowalczuk (Ogniok), Marat Radchenko (slonopotamus), Markus Breyer (pluranium), Michael Allar (Allar), ondys, Piotr B?k (Pierdek), Rama (EverNewJoy), Ren Wilson (rwils), Rene Rivera (grafikrobot), Robert Khalikov (nbjk667), Robert Williams (Rottbott), Ryan Luck (overlawled), Salamanderrake, Sébastien Rombauts (Srombauts), Sergey Vikhirev (BorMor), Shaijan, ssoria, Sylvain Rochette (labidus), Tam Armstrong (tamarmstrong), TheSoeldner, x414e54
欢迎来到虚幻引擎 4.10!该版本包含大量绝妙的新功能,但我们的关注点是提高引擎的稳定性,并修复悬而未决的问题。解决了大家报告的数百个错误,对品质进行了大量改进,并且几乎每个所支持的平台都收到了更新。虚幻引擎旨在打造不可思议的虚拟现实体验,每个版本都会变得更好。在该版本中,Epic 的“子弹头列车”虚拟现实演示使用了新功能,有专为头戴式显示器设计的全新渲染优化。该版本也对移动设备进行了升级,带有全新的可扩展性功能,并支持折射。对程序员来说,最后但同样好的消息是:现在,你们能在 Windows 上使用 Visual Studio 2015 进行开发了。而在 Mac 上,我们修改了 Xcode 项目,以便让你们更高效地工作。我们还更新了目标平台,增加了对最新版 SDK 的支持。
更新:移动设备的折射效果
现支持移动平台上的折射效果。在该版本中,带折射的现有着色器会自动在移动设备上运行,无需额外步骤!
已在 iPhone 5S 和更高版本,以及 Android 设备(如,Nexus 5、Galaxy Note 4 和 Galaxy S6)上启用
可以通过在相应设备配置文件中设置 r.RefractionQuality 渲染变量而在其它设备上启用
更新:优化的虚拟现实渲染
在该版本中,你的虚拟现实游戏的速度会更快,这归功于为头戴式显示器设计的全新渲染优化项。我们采用了全新“隐藏和可见网格优化”(Hidden and Visible Mesh optimization),以减少虚拟现实渲染的 GPU 开销。Bullet Train VR Demo, by Epic Games由于透镜失真,这两个优化项确保我们不花费 GPU 时间处理不会显示在实际设备中的像素。隐藏区网格充当 prepass,我们采用代表隐藏区的网格,摈弃网格背后的一切。接着,在后处理阶段,我们使用该网格的反转(代表可见像素),然后只对其进行后处理。通过使用这两种技术,你将获得“自由”的性能!对于“子弹头列车”,在 PC 上节省了约 0.25 毫秒,总帧周期仅为 11 毫秒。在游戏机平台上,你有望看到更大的性能提升!
更新:支持 VISUAL STUDIO 2015
已对 Windows 平台上的 Visual Studio 2015 进行了虚幻引擎更新!Visual Studio 2015 包括诸如统一初始值设定项和委托构造函数的
C++ 语言功能。新的编译器也与标准非常兼容,
正在加载中,请稍后...为 Unity 开发者准备的虚幻引擎 4
本页面的内容:
本指南从一个 Unity 的用户视角来整体看待虚幻 4,并帮助将 Unity 的开发经验应用到虚幻 4 的世界中。
下面是 Unity 编辑器和虚幻编辑器的图片,用颜色标识了同类的区块。每个区块也添加了标签,对应于虚幻术语表。虚幻编辑器完全可以通过对各个区块的拖拽做到窗口布局的自定义。
编辑资源素材
在 Unity 中,Inspector 分页时用来编辑当前项目中选中的素材。在虚幻 4 中,细节 面板则用来展示并修改当前选中物体的属性,然后大量的编辑修改则需要专用的窗口或分页。编辑每种类型的资源时都会打开分页窗口,类似于网页浏览器。当然这些分页窗口也可以任意拖拽,并悬浮在其他窗口之上作为独立窗口显示。
快速词汇查找表
下表左侧包含了常见的 Unity 术语,右侧是对应的(或差不多的)虚幻 4 术语。虚幻 4 的关键词直接链接到更进一步的虚幻在线文档中。
游戏内容类型
GameObject
编辑器界面
Hierarchy Panel
Project Browser
Scene View
Skinned Mesh
Particle Effect
Sprite Editor
Rigid Body
iOS Player, Web Player
项目文件和文件
那么目录和文件时怎么回事
和 Unity 的项目一样,虚幻的项目也存在于自有的目录,并有自己的项目文件。可以通过 双击 一个 .uproject 文件打开虚幻编辑器并加载该项目,或者 右键 来查看更多选项。项目目录中包含不同的子目录,保存了游戏的资源内容和源代码,以及各种配置文件和二进制文件。最重要的就是 Content 子目录和 Source 子目录。
我的资源素材应该放在哪里?
在虚幻 4 中,每个项目都有一个 Content 文件夹。类似于 Unity 项目的 Asset 目录,这里就是游戏资源素材保存的地方。要向游戏中导入素材的话,只需要将素材文件拷贝到 Content 目录,它们便会自动导入并出现在 内容浏览器 中。当使用外部程序修改这些资源时,编辑器中的资源也会自动的被更新。
支持哪些通用资源文件格式?
Unity 支持很多文件格式。虚幻 4 也支持最通用的文件格式,如下表:
支持的格式
.fbx, .obj
.png, .jpeg, .bmp ,.tga, .dds, .exr, .psd, .hdr
.ttf, .otf
.mov, .mp4, .wmv
场景是如何保存的?
在 Unity 中,GameObjects 被放置在场景中,并保存为一个场景资源文件。虚幻有一个地图文件,对应于 Unity 场景。地图文件保存了 关卡 的数据以及其中的物件,以及光照数据和某些关卡特定的设置。
如果修改项目的设置?
所有的项目设置都可以在主菜单的 Edit / Project Settings 中找到。类似于 Unity 的设置,能够对项目设定所需要的信息(比如项目的名称和图标),配置游戏输入的绑定,并定义运行项目时引擎的行为。可以在
了解更多单独项目的设置。Unity 还有被称为 “玩家设置” 的部分,在虚幻中,我们叫 “平台设置”,并且可以在项目设置的 “平台” 分类里找到。
源文件在哪里?
在 Unity 中,人们习惯于将 C# 的源文件放在资源目录中。
虚幻 4 工作机制有点不同。对那些拥有 C++ 代码的项目,可以在项目目录中找到一个 Source 的子目录包含多种文件,包括 C++ 源文件(.cpp)和头文件(.h),以及编译链接的脚本(.Build.cs,.Target.cs)。然后,只有的项目则不会有 Source 目录。
在虚幻 4 中开始使用 C++ 最方便的做法是用编辑器的菜单项来 Add Code To Project(在主菜单的文件菜单中),或应用某个模板来新建一个 C++ 的项目。可以直接在 内容浏览器 中直接看到 C++ 类,并通过双击它们便能直接在 Visual Studio 或 Xcode 中打开该文件。
从 GameObjects 到 Actors
GameObject 去哪里了?
在 Unity 中,一个 GameObject 是可以被放置在世界中的一个 “东西”。在虚幻 4 中对应的是一个 Actor。在虚幻编辑器中,可以从物体面板中直接拖一个空的 Actor 放置到场景中:
Youtube 视频
虽然可以通过搭建并扩展空的 Actor 来制作游戏,但虚幻 4 提供了各种特殊类型的 Actor 并预制了它们的特性,比如 Pawn(用于作为玩家或者 AI 的角色),或者 Character(用于会做动作的生物)。和空的 Actor 一样,可以直接将它们拖拽至场景中,并给它们添加组件,或自定义属性。之后可以学习到更多相关内容,这里只需要了解虚幻 4 有个 (Gameplay 框架)[(Gameplay/Framework)] 来协同各种特殊的 Actor 一起工作。
虚幻 4 中的 Actor 还是和 Unity 中的 GameObjects 有不同之处。在 Unity 中,GameObject 是 C# 的类并且无法直接扩展。在虚幻 4 中,Actor 是 C++ 类,可以很容易的被继承或扩展来自定义。我们之后将会谈论更多!
组件在哪里?
在 Unity 中,可以通过为一个 GameObject 添加组件来达到给予一定的功能。
在虚幻 4 中,也可以为 Actor 添加组件。在向关卡中放置了一个空的 Actor 后,点击添加组件按钮(在 细节 面板中),并选择一个组件来添加。这里我们通过放置一个空的 Actor 来创建一个火炬,并为它添加一个网格物体组件作为基座,以及一个光源和粒子系统作为它的火焰。
Youtube 视频
在 Unity 中,一个 GameObject 保存了组件的简单列表,但在虚幻 4 中,一个 Actor 保存了属于它的组件以及它们的继承结构关系。可以在上面的例子中看到,光源和粒子是连接到网格模型的。之后在
中会有重要的描述讨论。
从 Unity 的 prefabs 到虚幻 4 的类
Unity 的工作流程是基于 prefabs 的。在 Unity 中,创建一系列 GameObjects 以及它们的组件,并为它们创建 prefab。然后便可以在世界中放置 prefab 的实例,或者在运行时创建它们。
虚幻 4 则是基于类来协同工作。在虚幻 4 中,创建一个 Actor 以及它的组件,选择它并点击 蓝图 / 添加脚本 按钮(在 细节 面板中)。然后选择保存蓝图类的地方,并点击 创建蓝图 来保存新建的蓝图!
Youtube 视频
新建的类可以在 内容浏览器 中找到。可以直接 双击 打开编辑它们,也可以将它们拖拽到任意场景关卡中。
脚本组件和 MonoBehaviour 在哪里?
在 Unity 中,GameObject 有脚本组件,并可以添加 C# 脚本。可以创建 MonoBehavior 子类并定义那个组件做什么。
虚幻 4 也有类似的内容。可以自由创建全新的组件类并将它应用于任意 Actor。组件类可以使用脚本创建,也可以用 C++ 创建。
那么在虚幻 4 中如何创建自己的组件类呢?在 细节 面板中,添加组件(Add Component)的下拉框中,可以看到创建新组件,或者选择已经存在的组件:
在 Unity 中,当创建新的 MonoBahaviour 时,将会有一个框架类文件,并有 Start() 函数和 Update() 函数。
在虚幻 4 中,也会有一个框架类,有一个 InitializeComponent() 函数和一个 TickComponent() 函数,它们和 Start、Update 具有类似的行为。
如果创建一个脚本组件,则会有可视化节点来表示类似的函数:
可编辑脚本 Actor 类
这是个很酷的虚幻 4 功能:新建的 Actor 类可以拥有自己的可视化蓝图脚本编辑!这样能够为整个物体添加逻辑,而不仅仅是每个组件。结合继承结构关系(稍后下文解释),这将会提供游戏制作很多灵活性。
In addition to
Classes supporting visual scripting,
also supports C++ Classes implemented with code.
Here are both, side-by-side.
除了支持可视化脚本编辑,虚幻 4 还支持通过代码 C++ 类来实现。这里是双方的一个对照:
虚幻 4 C++
using UnityE
using System.C
public class MyComponent : MonoBehaviour
// Use this for initialization.
void Start ()
Count = 0;
// Update is called once per frame.
void Update ()
Count = Count + 1;
Debug.Log(Count);
#pragma once
#include "GameFramework/Actor.h"
#include "MyActor.generated.h"
class AMyActor : public AActor
GENERATED_BODY()
// Sets default values for this actor's properties.
AMyActor()
// Allows Tick() to be called
PrimaryActorTick.bCanEverTick =
// Called when the game starts or when spawned.
void BeginPlay()
Super::BeginPlay();
Count = 0;
// Called every frame.
void Tick(float DeltaSeconds)
Super::Tick(DeltaSeconds);
Count = Count + 1;
GLog-&Log(FString::FromInt(Count));
虚幻 4 类的扩展性
Unity 的 prefabs 和虚幻 4 的类在游戏中类似的实例化。然后 Unity 在 prefabs 之间的关系上有并发的问题,这限制了创作的扩展性。
在虚幻 4 中,可以通过扩展已有的蓝图类来创建新的蓝图类,并定义新的属性,组件功能及可视化脚本功能。
比如,在虚幻 4 中,可以创建一个蓝图类叫做 Monster,实现基本的怪物功能,比如追击人类。然后可以创建一个叫做 Dragon 的蓝图类来扩展它(某种特定的怪物,添加了火焰吐息的功能),再有一个 Grue(一种当它变黑是就有可能吃人的怪物),以及其他 8 种类型。这样一些 Monster 的子类都继承了基础的 Monster 类的功能,并在此基础上添加新的能力。
在 Unity 中,则需要创建很多不同的 GameObject 的 prefabs:为 Dragon 创建一个,为 Grue 创建一个,等等。假设这时希望为所有的怪物添加某个功能,比如使用一个 Speak 组件来说话,在 Unity 中则需要更新所有的 10 个 prefabs,拷贝粘贴到每个中。
在虚幻 4 中,只需简单的修改 Monster 的类,并为它添加新的 Speak 的能力,便做完了!Dragon,Grue 以及其他 8 种 Monster 的子类都会自动的继承这个说话的新功能,并不需要去修改这些子类。
但还有更多!我们关于类所说的一切,都同样适用于 C++ 的类,也同样对 Actors 和 组件 适用。我们的体系设计时考虑支持各种不同程度的开发形式,具有功能上的可扩展性,可以为 10 个开发人员的项目服务,也可以为 100 个人的项目人员服务。
那么应该用蓝图脚本还是 C++ 代码呢?或者同时使用?
可视化蓝图脚本是对游戏实时逻辑和序列型的事件的理想制作手段。这个系统对策划、美术以及面向可视化编程的程序员是非常好用的,它能够可视化的管理游戏内的物体,并且容易访问。完全可以通过蓝图就完成一个游戏的制作。请参考 Tappy Chicken 示例,它是一个完整的范例。
C++ 编程可以为更大体量的任务工作,比如构建一个游戏体系,制作复杂的 AI 行为,或者新增引擎功能。对于已有 C++ 技能的开发人员而言,可以翻阅一下
大部分的项目都将是混合使用和 C++。很多开发者使用蓝图来创作游戏原型,因为这个过程容易且有趣,但会在之后的性能调整和更严格的引擎使用时将部分蓝图或全部蓝图脚本转移至 C++。
类也能扩展 C++ 类
虚幻 4 的游戏开发中很多令人着迷的过程来存在于程序员用 C++ 实现新的功能,而策划和美术在蓝图中使用这些功能,并提出更多要求!下图是针对一个虚幻 4 的射击游戏项目中实现拾取物品过程时,团队的一种形式,混合了 C++ 类的编程实现,以及蓝图类用于处理行为和表现。
在 Unity 中,每个 GameObject 都有一个转换组件(Transform Component),赋予该 GameObject 在世界中的位置、角度以及缩放比例。
在 虚幻 4 中类似,Actor 有一个 Root Component,能够作为场景组件的任意子类,场景组件 赋予 Actor 在世界中的位置、角度及缩放比例,这些参数会费赋予该 Actor 的组件关系结构中在它之下的所有组件。很多有用的组件都是场景组件的子类,因此让它们具有位置信息是非常有用的!
即便只放置一个空的 Actor,虚幻 4 也会为它创建一个“默认场景 Root 组件”,这是一个最简单的场景组件。当放置一个新的场景组件时,默认场景 Root 则会被替换掉。
在 Unity 中,可以构建 GameObject 之间的关系并将他们的转换组件绑定,来创建复合物体。
在虚幻 4 中,通过整洁的组件继承便能创建复合游戏物体。
从上图可以看到,一个整洁的继承关系可以通过将场景组件互相附加来得到,由于他们有转换功能,类似于 Unity 中的转换的绑定。Actor 的各个组件(所有组件的基类)只能直接依附到 Actor 自己身上。
我是否应该用组件来创造其他一切?
其实这完全取决于你自己,大部分情况下应该结合 Actor 的类和自定义组件。我们先前已经提到过,虚幻 4 中已经提供了一些特殊类型的 Actor 用于某种能力并总是附带某些组件。比如一个 Character 总是会包含一个 Character Movement 组件。
有一些在引擎中常见的 Actor 类型,并且大部分种类的游戏都会用到它们。这里是我们已经制作的最常见类型 Actor 的列表:
- Actor 的一种类型,用于表现一个可供控制的游戏物体,比如是玩家的角色。Pawn 通常都是被玩家或者 AI 通过 Controller 控制并移动。
Character - 一种特殊类型的 ,用于双足类型的角色,并具备一些复杂的功能。
Controller - 依附并控制一个 。通过将 Pawn 和 Controller 的分离,我们可以编写 AI Controller,用于控制 Pawn,并且和玩家控制 Pawn 采用相同的接口。
Player Controller - 一个更为特殊的 Controller,用于从玩家的手柄中获得输入信息,或者鼠标键盘中获得殊瑞星纳西,并将这些信息驱动它所控制的 Pawn 或者 Character 的行为。
那么所有的东西都是 Actor 咯?
并不是所有的。Actor 是虚幻 4 中最常见的用于游戏的类,并是唯一能够在 世界 中被 创建生成 Spawn 的类。因此任何被放置在关卡中的东西都将是一个 Actor。
另外一个需要知道的重要类型是 Object。Object 实际上是所有虚幻引擎的类的基类,包括 Actor 以及一些其他的类。这是一个比 Actor 更加底层的类,具备一些作为虚幻引擎类的可预料的功能,比如 反射 和 序列化。Object 是一个非常基础的类,当我们需要定义一个新的类但又并非 Actor 的时候会使用它。比如 Actor Component 是所有组件的基类,而它则是继承 Object 而非 Actor。
在虚幻 4 中 Gameplay 框架是什么东西?
好吧,这里开始事情变得一点点疯狂(酷炫的方向)。Unity 提供了一个干净的石板用于设计游戏,虚幻也做了同样的事情。在 Unity 中可以基于 GameObjects 和组件来创建所有的东西,而在虚幻中则是基于 Actor 和组件来创建。
然后,虚幻在顶层提供了叫做
的部分,而 Unity 中并没有这块内容。虽然做一款游戏并不是一定要用到它,但如果用的话会非常酷!基本上来说,它提供了一些基础功能,如果遵循它的逻辑,您将能够很容易的获得一些很赞的功能,否则可能花费很多时间,并且实现也很困难,或者很难改造。(比如完整的多人游戏支持!)
已有大量的酷炫游戏基于虚幻的 Gameplay 框架之上制作,花点时间来了解该框架的机制是很值得的。没错,最终您将具有您自己的框架形式,如果想要这么做当然完全没问题!但虚幻 4 当前已有数以百计的炫酷开发者在使用它,因此我们花点时间来了解一下。
要使用 Gameplay 框架,只需要了解一些预制的 Actor 类,比如 ,Character,和 Player Controller,并逐步了解虚幻的网络复制和网络其他功能。现在我们先回到最基本的部分。
如何在虚幻 4 中编写代码
我曾习惯于在 MonoDevelop 中写代码
对于脚本,只需要虚幻编辑器——所有的东西都已经包括了!要编写 C++ 代码,在 Windows 平台下载 Visual Studio 的免费版本,如果是 Mac 的话则需要安装 Xcode。当第一次创建一个新项目(或者为已有项目添加代码)时,虚幻 4 将会自动的创建 Visual Studio 的项目文件。您只需要在 内容浏览器 中双击一个 C++ 的类便能在 Visual Studio 中打开它,或者在主菜单的文件菜单中点击 Open Visual Studio。
在虚幻 4 中有个重要的不同:有时必须要手动的更新 Visual Studio 的项目文件(比如,下载了
的新版本,或者对源代码文件的磁盘存放位置做了人为改变)。可以通过在主菜单中点击 Refresh Visual Studio Project 或者在项目目录中 右键点击 .uproject 文件 并选择 Generate Visual Studio project files 便可。
如果您曾用 MonoBehaviors 工作,那一定熟悉诸如 Start,Update 和 OnDestroy 等方法。以下是对 Unity 的行为和对应的虚幻 4 的 Actor 和组件的比较。
在 Unity 中,我们可能有一个简单的组件,类似下面的代码:
public class MyComponent : MonoBehaviour
void Start() {}
void OnDestroy() {}
void Update() {}
请记住,在虚幻 4 中,您可以直接为 Actor 写代码而无需创建新的组件来添加代码。这其实是很常见并有意义的。
类似于 Unity 的 Start,OnDestroy 和 Update 函数,虚幻 4 在 Actor 中有类似的方法:
class AMyActor : public AActor
GENERATED_BODY()
// Called at start of game.
void BeginPlay();
// Called when destroyed.
void EndPlay(const EEndPlayReason::Type EndPlayReason);
// Called every frame to update this actor.
void Tick(float DeltaSeconds);
在虚幻 4 中,组件具有不同的函数。以下是示例:
class UMyComponent : public UActorComponent
GENERATED_BODY()
// Called after the owning Actor was created
void InitializeComponent();
// Called when the component or the owning Actor is being destroyed
void UninitializeComponent();
// Component version of Tick
void TickComponent(float DeltaTime, enum ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction);
请记住,在虚幻 4 中调用基类的方法很重要。
比如,在 Unity C# 中可能是调用 base.Update(),但在虚幻 4 的 C++ 中我们使用 Super::TickComponent():
void UMyComponent::TickComponent(float DeltaTime, enum ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction)
// Custom tick stuff here
Super::TickComponent(DeltaTime, TickType, ThisTickFunction);
You may have noticed some things begin with "A" and others with "U" in C++.
The prefix "A" indicates an Actor sub-class.
Where as the prefix "U" indicates an Object sub-class.
There are some other prefixes too, for example "F" is used for most plain data structures or non-UObject classes.
您也许已经注意到 C++ 中有些以 “A” 开头,而其他一些以 “U” 开头。前缀 “A” 代表它是一个 Actor 的子类,而前缀 “U” 代表它是一个 Object 的子类。还有其他一些前缀,比如 “F” 用于代表一个平铺的数据结构体,或者其他非 Uboject 的类。
在虚幻 4 中编写游戏逻辑代码
好了,现在开始稍微深入一些。我们将谈论一下创建游戏所需要的编程话题。因为您了解 Unity,我们来面向 C# 的用户解释 C++ 的功能,当然您也可以使用来完成几乎所有的事情!我们尽可能的为范例提供 C++ 的同时也提供蓝图。
先说一下一些通用的游戏逻辑编程模式,以及如何在虚幻中实现。许多在 Unity 中的函数在虚幻中都有类似的函数。我们先从最常见的开始。
Instantiating GameObject / Spawning Actor
在 Unity 中,我们使用 Instantiate 函数来新建物体的实例。
该函数使用任意的 UnityEngine.Object 类型(GameObject,MonoBehaviour 等),并创建它的拷贝。
public GameObject EnemyP
public Vector3 SpawnP
public Quaternion SpawnR
void Start()
GameObject NewGO = (GameObject)Instantiate(EnemyPrefab, SpawnPosition, SpawnRotation);
NewGO.name = "MyNewGameObject";
在虚幻 4 中,根据不同的需要,有一些不同的函数用于创建物体。NewObject 用于创建新的 UObject 类型实例,而 SpawnActor 用于创建新的 AActor 类型实例。
首先我们总体说一下 UObject 和 NewObject。在虚幻中 UObject 的子类很像 Unity 中 ScriptableObject 的子类。对于游戏过程中,它们是那些不需要在游戏世界中创建并看见的存在。
在 Unity 中,如果要创建自己的 ScriptableObject 子类,可能会像下面这样的初始化:
MyScriptableObject NewSO = ScriptableObject.CreateInstance&MyScriptableObject&();
在虚幻中,如果要创建 UObject 的继承类,是像下面这样的初始化:
UMyObject* NewObj = NewObject&UMyObject&();
那么 Actor 呢?Actor 的在世界(C++ 中的 UWorld)中生成是通过 SpawnActor 方法。如何获取 World 对象?有些 UObject 会提供一个 GetWorld 的方法,所有的 Actor 则都具有这个方法。
您可能已经注意到,并没有传递一个 Actor,我们传递了一个 Actor 的 “class” 来作为生成 Actor 的参数。在我们的范例中,是一个 AMyEnemy 类的任意子类。
但如果想要创建某个东西的“拷贝”,就像 Unity 的 Instantiate 函数那样,该怎么做呢?
NewObject 和 SpawnActor 函数也能通过给一个 “模板” 对象来工作。虚幻引擎会创建该一个对象的拷贝,而不是从零创建一个新的对象。这将会拷贝该对象的所有属性(UPROPERTY)和组件。
AMyActor* CreateCloneOfMyActor(AMyActor* ExistingActor, FVector SpawnLocation, FRotator SpawnRotation)
UWorld* World = ExistingActor-&GetWorld();
FActorSpawnParameters SpawnP
SpawnParams.Template = ExistingA
World-&SpawnActor&AMyActor&(ExistingActor-&GetClass(), SpawnLocation, SpawnRotation, SpawnParams);
您也许想知道“从零开始创建”在这里具体是什么意思。每个对象类在创建时都有一个默认模板,包含了它的默认属性和组件。在创建时如果您并不像修改这些默认属性,并没有提供你自己的模板,虚幻将使用这些默认值来创建该对象。为了更好的说明这个,我们先来看一下 MonoBehaviour 的例子:
public class MyComponent : MonoBehaviour
public int MyIntProp = 42;
public SphereCollider MyCollisionComp =
void Start()
// Create the collision component if we don't already have one
if (MyCollisionComp == null)
MyCollisionComp = gameObject.AddComponent&SphereCollider&();
MyCollisionComp.center = Vector3.
MyCollisionComp.radius = 20.0f;
在上面这个例子中,有一个 int 属性,默认是 42,并有一个 SphereCollider 组件默认半径是 20。
在虚幻 4 中,利用对象的构造函数也能达到同样的效果。
class AMyActor : public AActor
GENERATED_BODY()
UPROPERTY()
int32 MyIntP
UPROPERTY()
USphereComponent* MyCollisionC
AMyActor()
MyIntProp = 42;
MyCollisionComp = CreateDefaultSubobject&USphereComponent&(FName(TEXT("CollisionComponent"));
MyCollisionComp-&RelativeLocation = FVector::ZeroV
MyCollisionComp-&SphereRadius = 20.0f;
在 AMyActor 的构造函数中,我们为这个类设置了属性的默认值。请注意 CreateDefaultSubobject 函数。我们可以用它来创建组件并赋予组件默认值。所有子对象都将使用这个函数作为默认模板来创建,也可以在子类或者蓝图中对它进行修改。
在这个例子中,获取了一个已知的组件,并将它转换为一个特定类型并有条件的做一些事情。
Collider collider = gameObject.GetComponent&Collider&;
SphereCollider sphereCollider = collider as SphereC
if (sphereCollider != null)
虚幻 4 C++:
UPrimitiveComponent* Primitive = MyActor-&GetComponentByClass(UPrimitiveComponent::StaticClass());
USphereComponent* SphereCollider = Cast&USphereComponent&(Primitive);
if (SphereCollider != nullptr)
销毁 GameObject / Actor
Destroy(MyGameObject);
MyActor-&Destroy();
销毁 GameObject / Actor (1 秒延迟)
Destroy(MyGameObject, 1);
MyActor-&SetLifeSpan(1);
点击查看大图。
禁用 GameObjects / Actors
MyGameObject.SetActive(false);
// Hides visible components
MyActor-&SetActorHiddenInGame(true);
// Disables collision components
MyActor-&SetActorEnableCollision(false);
// Stops the Actor from ticking
MyActor-&SetActorTickEnabled(false);
点击查看大图。
通过组件访问 GameObject / Actor
GameObject ParentGO =
MyComponent.gameO
AActor* ParentActor =
MyComponent-&GetOwner();
点击查看大图。
通过 GameObject / Actor 访问组件
MyComponent MyComp = gameObject.GetComponent&MyComponent&();
UMyComponent* MyComp = MyActor-&FindComponentByClass&UMyComponent&();
查找 GameObjects / Actors
// Find GameObject by name
GameObject MyGO = GameObject.Find("MyNamedGameObject");
// Find Objects by type
MyComponent[] Components = Object.FindObjectsOfType(typeof(MyComponent)) as MyComponent[];
foreach (MyComponent Component in Components)
// Find GameObjects by tag
GameObject[] GameObjects = GameObject.FindGameObjectsWithTag("MyTag");
foreach (GameObject GO in GameObjects)
// Find Actor by name (also works on UObjects)
AActor* MyActor = FindObject&AActor&(nullptr, TEXT("MyNamedActor"));
// Find Actors by type (needs a UWorld object)
for (TActorIterator&AMyActor& It(GetWorld()); It; ++It)
AMyActor* MyActor = *It;
// Find UObjects by type
for (TObjectIterator&UMyObject& It; It; ++it)
UMyObject* MyObject = *It;
// Find Actors by tag (also works on ActorComponents, use TObjectIterator instead)
for (TActorIterator&AActor& It(GetWorld()); It; ++It)
AActor* Actor = *It;
if (Actor-&ActorHasTag(FName(TEXT("Mytag"))))
为 GameObjects / Actors 添加标签
MyGameObject.tag = "MyTag";
// Actors can have multiple tags
MyActor.Tags.AddUnique(TEXT("MyTag"));
为 MonoBehaviours / ActorComponents 添加标签
// This changes the tag on the GameObject it is attached to
MyComponent.tag = "MyTag";
// Components have their own array of tags
MyComponent.ComponentTags.AddUnique(TEXT("MyTag"));
比较 GameObjects / Actors 和 MonoBehaviours / ActorComponents 的标签
if (MyGameObject.CompareTag("MyTag"))
// Checks the tag on the GameObject it is attached to
if (MyComponent.CompareTag("MyTag"))
// Checks if an Actor has this tag
if (MyActor-&ActorHasTag(FName(TEXT("MyTag"))))
// Checks if an ActorComponent has this tag
if (MyComponent-&ComponentHasTag(FName(TEXT("MyTag"))))
物理:刚体 vs. 元组件
在 Unity 中药给一个 GameObject 物理特性,需要给它一个刚体组件。在虚幻中,任何元组件(C++ 中为 UPrimitiveComponent)都可以是物理对象。一些通用的元组件,比如 ShapeComponent(胶囊形,球形,盒形),StaticMeshComponent,以及 SkeletalMeshComponent。
和 Unity 不同,Unity 将碰撞体和可视物体分列到不同的组件中。而虚幻则将潜在的物理碰撞和潜在的可视效果组合到了 PrimitiveComponent 中。任何在世界中具有形状的物体,要么就是能够被渲染显示,要么就是能作物理交互,它们都继承于 PrimitiveComponent。
层 vs 通道
在 Unity 中,它们被称为“层(Layer)”。虚幻使用碰撞通道(Collision Channel)来描述,这是类似的概念。可以在
读到更多。
RayCast vs RayTrace
Unity C#:
GameObject FindGOCameraIsLookingAt()
Vector3 Start = Camera.main.transform.
Vector3 Direction = Camera.main.transform.
float Distance = 100.0f;
int LayerBitMask = 1 && LayerMask.NameToLayer("Pawn");
RaycastHit H
bool bHit = Physics.Raycast(Start, Direction, out Hit, Distance, LayerBitMask);
return Hit.collider.gameO
虚幻 4 C++:
APawn* AMyPlayerController::FindPawnCameraIsLookingAt()
// You can use this to customize various properties about the trace
FCollisionQueryParams P
// Ignore the player's pawn
Params.AddIgnoredActor(GetPawn());
// The hit result gets populated by the line trace
FHitResult H
// Raycast out from the camera, only collide with pawns (they are on the ECC_Pawn collision channel)
FVector Start = PlayerCameraManager-&GetCameraLocation();
FVector End = Start + (PlayerCameraManager-&GetCameraRotation().Vector() * 1000.0f);
bool bHit = GetWorld()-&LineTraceSingle(Hit, Start, End, ECC_Pawn, Params);
// Hit.Actor contains a weak pointer to the Actor that the trace hit
return Cast&APawn&(Hit.Actor.Get());
点击查看大图。
Unity C#:
public class MyComponent : MonoBehaviour
void Start()
collider.isTrigger =
void OnTriggerEnter(Collider Other)
void OnTriggerExit(Collider Other)
虚幻 4 C++:
class AMyActor : public AActor
GENERATED_BODY()
// My trigger component
UPROPERTY()
UPrimitiveComponent* T
AMyActor()
Trigger = CreateDefaultSubobject&USphereComponent&(TEXT("TriggerCollider"));
// Both colliders need to have this set to true for events to fire
Trigger.bGenerateOverlapEvents =
// Set the collision mode for the collider
// This mode will only enable the collider for raycasts, sweeps, and overlaps
Trigger.SetCollisionEnabled(ECollisionEnabled::QueryOnly);
void BeginPlay()
// Register to find out when an overlap occurs
OnActorBeginOverlap.AddDynamic(this, &AMyActor::OnTriggerEnter);
OnActorEndOverlap.AddDynamic(this, &AMyActor::OnTriggerExit);
Super::BeginPlay();
void EndPlay(const EEndPlayReason::Type EndPlayReason)
OnActorBeginOverlap.RemoveDynamic(this, &AMyActor::OnTriggerEnter);
OnActorEndOverlap.RemoveDynamic(this, &AMyActor::OnTriggerExit);
Super:EndPlay(EndPlayReason);
UFUNCTION()
void OnTriggerEnter(AActor* Other);
UFUNCTION()
void OnTriggerExit(AActor* Other);
读到更多关于设置碰撞的响应。
public class MyComponent : MonoBehaviour
void Start()
rigidbody.isKinimatic =
rigidbody.velocity = transform.forward * 10.0f;
在虚幻 4 中,碰撞组件和刚体组件是同一个组件,它的基类是 UPrimitiveComponent,它也有不同的子类(USphereComponent,UCapsuleComponent 等)来配合不同的需求。
虚幻 4 C++:
class AMyActor : public AActor
GENERATED_BODY()
UPROPERTY()
UPrimitiveComponent* PhysicalC
AMyActor()
PhysicalComp = CreateDefaultSubobject&USphereComponent&(TEXT("CollisionAndPhysics"));
PhysicalComp-&SetSimulatePhysics(false);
PhysicalComp-&SetPhysicsLinearVelocity(GetActorRotation().Vector() * 100.0f);
Unity C#:
public class MyPlayerController : MonoBehaviour
void Update()
if (Input.GetButtonDown("Fire"))
float Horiz = Input.GetAxis("Horizontal");
float Vert = Input.GetAxis("Vertical");
虚幻 4 C++:
class AMyPlayerController : public APlayerController
GENERATED_BODY()
void SetupInputComponent()
Super::SetupInputComponent();
InputComponent-&BindAction("Fire", IE_Pressed, this, &AMyPlayerController::HandleFireInputEvent);
InputComponent-&BindAxis("Horizontal", this, &AMyPlayerController::HandleHorizontalAxisInputEvent);
InputComponent-&BindAxis("Vertical", this, &AMyPlayerController::HandleVerticalAxisInputEvent);
void HandleFireInputEvent();
void HandleHorizontalAxisInputEvent(float Value);
void HandleVerticalAxisInputEvent(float Value);
这里是在项目设置中输入属性的设置界面:
关于如何设置输入可以从在
如何自动加载最后一个项目?
如果您习惯于 Unity 会自动加载上次工作的最后一个项目,在虚幻 4 中也一样可以做到。要开启这个功能的话,当打开项目时勾选“启动时总是加载最后一个项目”的选项。可以在任意时刻通过编辑器的主菜单的 编辑/编辑器首选项/加载和保存/启动 的部分来修改。
哪里可以设置游戏的输入绑定?
在 Unity 中,如果您习惯于为项目用 Input Manager 来设置默认的输入的话,虚幻 4 也一样。您可以打开项目设置,并选择 Input 的分类。然后就可以添加不同的案件(Action)或者摇杆控制(Axe)。给每一种控制一个名称和默认绑定。然后,在游戏中的 Pawn 中当该输入事件发生时就能获取回调函数。查看
来了解详情。
如何修改项目的初始场景?
可以在项目设置的分页中为项目设定初始场景。从主菜单中选择 编辑/项目设置->地图和模式 便能进行修改。
如何运行游戏?
运行游戏最简单的方式是点击编辑器的主工具栏上的“运行”按钮,这将会直接在编辑器窗口中运行游戏。如果想要作为单独的程序运行,点击“运行”按钮边上的下拉箭头,并选择“Standalone Game”。如果想要在移动设备或者网页浏览器中运行游戏,那需要使用工具栏中的“启动”按钮(相应的平台需要预先安装所需软件)。
单位是什么?
在 Unity 中,主要的测量单位是米,在虚幻 4 中,主要的测量单位是厘米。
因此在 Unity 中移动一个单位(一米)相当于在虚幻 4 中移动 100 个单位(厘米)。
如果想要在 Unity 中移动 2 英尺,那么相当于 0.61 个单位,而在虚幻 4 中则是 61 个单位。
坐标系是怎么回事?那个方向朝上?
Unity 和虚幻 4 都使用左手坐标系,但坐标轴则需要轮换一下。在虚幻 4 中,X 的正方向是“前”,Y 的正方向是“右”,Z 的正方向是“上”。
如何查看游戏的输出日志?
在虚幻 4 编辑器中,可以从“窗口->开发人员工具”的菜单中打开“输出日志”。也可以在运行游戏时增加 “-log” 命令行参数,在游戏窗口以外启动一个专用的日志窗口,这非常有用!
说道日志输出,Debug.log 在哪里?
在虚幻 4 中做日志高度的可定制化。阅读
了解如何记录信息。
如何抛出异常?
在 Unity 中,您可能习惯于当发生问题是抛出异常。虚幻 4 则并不处理异常。取而代之的做法是,使用 “check()” 函数来触发严重的错误。可以传入一个错误信息提示。如果只是想报告一个错误,但并不希望打断整个程序,可以使用 “ensure()”。这将会记录一个完整堆栈的日志信息,但程序会继续执行。如果当前附加了调试器,那么这两个函数都会暂定并进入调试器。
.NET Framework 去哪里了?
和 Unity 不同,虚幻 4 并不使用 .NET Framework。虚幻 4 自有一套容器类和库。常见的容器来对照:
.Net Framework
Dictionary
可以阅读到更多虚幻 4 的容器。
代码改变时虚幻会自动重新加载吗?
是的!您可以在编写代码是保持编辑器开启的状态。要在编写完成后直接从 Visual Studio 中编译代码,编辑器则会“热加载”您刚刚做的改动。也可以点击编辑器主工具栏上的 编译 按钮。当您在 Visual Studio 调试器连接的状态下这也很有用。
感谢阅读本篇指引!这篇文章的创建时为了帮助各地的虚幻社区和虚幻开发者,我们很希望能收到您的反馈意见或者纠错意见。在我们不断了解如何能帮助大家过渡到虚幻 4 的过程中,我们将会保持改进这篇文档。
我们还有很多虚幻 4 的学习资料!
开始虚幻之旅 -}

我要回帖

更多关于 虚幻引擎素材商店 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信