2016-11-21 23:30:27 u013131744 阅读数 4614
  • 从这里开始虚幻4-Editor介绍 v4.18

    本课程系列取名英译系列,是录制人员参考国外英文原版经典教程,结合中国人的习惯录制而成。希望能够给大家以帮助。从这里开始虚幻4系列教程,是Unreal的官方发布的入门教学,非常经典,是学习Unreal的佳入口。

    2372 人正在学习 去看看 杨石兴

首先要说的是,游戏开发是一项高度复杂的代码开发工作,编程语言只是最基本的知识,它涉及的内容还有计算机图形学、3D数学、物理学等复杂的学科。但是若需要学完这么多知识才能开发游戏,恐怕许多人都已经断气了,更谈不上开发游戏了。所以前人就把各种复杂的代码封装起来,使得一般的游戏开发者可以更加接近游戏的逻辑和功能性方面的代码,而无需接触最底层的知识。

194023hhhqhbpcqpmpltad

所以说游戏引擎,可以是引擎开发者已经写好的一堆代码框架,使得我们可以去调用这些底层代码,也可以是像虚幻4还附带可视化关卡编辑器的工具(Unity3D也是可视化的游戏引擎,后面会谈当今主流游戏引擎的对比)。

为什么选用虚幻4引擎?

首先,现在流行而且出名的商业引擎主要有cocos2dx,Unity3D,UE4,CryEngine等。但是这里选择UE4,也有笔者认为的独特优势。

1) UE4是开源的。开源就是代码是完全开放的,为什么开源如此重要?一方面是因为只有我们看到源代码的实现细节,当出错了我们才能快速准确地判断出错的成因,节省被错误折腾的时间。(你想想像Unity3D这种闭源引擎,要是出错了,你是完全看不到为什么会发生错误的。除了不断盲目Debug,查文档和谷歌之外自己对于错误束手无策。)另一方面,开源可以使得我们深入学习引擎的原理,只知其然不知其所以然必然不能走得太远,而且会走得更痛苦。

2) UE4的画质是世界上数一数二的。游戏的画质往往由游戏引擎来决定的,一个好的游戏引擎它可以模拟出极度逼真或者极具美感的画面。读者可以自己去看看Unity3D制作的游戏和UE4制作的游戏,其精美程度是相差甚远的。(这里并不是完全指责Unity3D,毕竟它们面对的是不同的层次。)作为一名追求极致的游戏程序员,当然要想看看最好的效果是怎么实现的。

3) UE4免费!无需多言,还有比免费更好的事吗?

下图为UE4游戏引擎制作出来的极度逼真游戏画面,你分得清这是不是现实吗?

虚幻4游戏引擎有何强大之处?

第一代虚幻游戏引擎(英文名是Unreal Engine,简写UE)在1998年由Epic Games公司发行。当时Epic Games公司为了适应游戏编程的特殊性需要而专门为虚幻系列游戏引擎创建了一种名为UnrealScript的编程语言,该语言让这个游戏引擎变得非常容易方便,因而这个游戏引擎开始名声大振。

接着,2002年,Epic发布了下一代游戏引擎UE2。这时候,在虚幻引擎提供的关卡编辑工具UnrealEd中,能够对物体的属性进行实时修改。它也支持了当时的次世代游戏机,像PlayStation2,XBox等。

到了2006年,Epic发布了下一代游戏引擎UE3,这可能是最受欢迎和广泛使用的游戏引擎。这时候的UE3又发布了一个极其重要的特性,那就是Kismet可视化脚本工具,Kismet工作的方式就是以用各种各样的节点来连接成一个逻辑流程图。其最牛逼的地方在于,使用Kismet你甚至不需要掌握任何编程知识。你可以借助Kismet使得不需要写一行代码来开发一个完整的游戏。 

到了2014年5月19日,Epic发布了Unreal4,目前最新也是Unreal4。这次版本换代也是有了巨大的改变,它已经完全移除了UnrealScript语言,并且用C++语言来代替它。在之前的版本,如果你想修改这个引擎来开发你自己的游戏,你必须用UnrealScript,也就意味着你要学习一门新的语言。不过现在,如果你要修改这个引擎,你可以用C++来完成。这对于绝大部分习惯于C++的游戏引擎工程师来说,使用自己热爱的C++语言来工作,绝对是一件天大的喜事啊。 

不但如此,游戏引擎的源代码已经可以从Github开源社区下载。这意味着开发者对游戏引擎有着绝对的控制权,实质上你可以修改任何任何东西,包括物理引擎、渲染和图形用户界面。 

它也提供了一些叫热更新的功能。什么叫热更新呢?通常,如果你想对游戏的代码进行一些修改,你必须要停止游戏才能进行修改,然后再次运行看看修改后游戏的效果。然而,使用热更新功能,你可以修改游戏而不需要停止或暂停游戏。任何在游戏代码的改变会即时更新,并且你可以看见它会在游戏中实时反映出来。 

UE4是跨平台的,你可以用来制作Xbox One、PlayStation4(包括索尼的Project Morpheus虚拟现实设备),Windows PC,Linux,Mac OSX,HTML5,iOS和安卓,就连虚拟现实设备Oculus Rift也支持。 

另一个重大的改变是,在2015年初,虚幻4已经可以完全免费下载和使用了,之前的版本是需要支付一定费用的。现在,你可以用来开发游戏,并且发行,而且不需要为UE4游戏引擎支付一分钱。只有在你赚到了3000美元收益之后,你才需要支付5%的技术使用费。 

另一个UE4提供的特性是商城,你可以在商城中购买和上传游戏资源。这些游戏资源可以包括动画,3D建模,材质,声音效果,预制游戏等等。这也是一个令没有游戏资源或者没有人力来开发资源的开发者振奋的消息。它们可以商场购买并直接应用于自己的游戏中。开发者也可以上传自己的工作成果到商城来赚钱。 

这个虚幻4小白系列教程,是面向于没有使用过UE4的新手,但需要一点点C++的知识(但也无需太多,一般读过任何一本C++教材都能看懂本教程)。我们从非常基础的下载安装引擎开始,到更高级的上传作品到谷歌PlayStore,都会涉及。我们会使用UE4来一步一步地制作我们的游戏,Let’s Start From it,你的游戏开发之路!

下图为UE4游戏引擎制作出来的官方示例宣传视频画面:



2016-11-22 13:34:10 u013131744 阅读数 2000
  • 从这里开始虚幻4-Editor介绍 v4.18

    本课程系列取名英译系列,是录制人员参考国外英文原版经典教程,结合中国人的习惯录制而成。希望能够给大家以帮助。从这里开始虚幻4系列教程,是Unreal的官方发布的入门教学,非常经典,是学习Unreal的佳入口。

    2372 人正在学习 去看看 杨石兴

200800nnqmnb5bcb5xc2xt

接下来,我们将会创建一个放置我们的游戏角色的基本场景。

编译UE4编辑器

1) 现在,我们创建一个空白的UE4项目来开始。首先点击桌面的Epic Games Launcher,打开启动器,点击左上角的启动按钮。


2) 接着会运行创建项目的窗口。


接下来:
  • 点击“新建项目”。
  • 选择“C++”选项卡。
  • 然后从可用的项目列表中选择“基础代码”。
  • 在下方点击“...”按钮,设置你的项目位置,我这里是“D:\UE4 Projects”。
  • 接着填写项目名称,我这里是“Demo1”。
  • 点击“创建项目”按钮。

3) 然后UE4会自动打开VS 2015(Visual Studio 2015)编辑器。(注意因为虚幻4是用VS2013生成代码的,所以我们要使用VS2013以上版本的才能正常编译。另外一点是,项目路径和项目名称不要使用中文,否则也无法编译成功。)


4) 在如下图所示的下拉列表中选择Development Editor(开发编辑器)。


5) 按Ctrl+F5进行编译,然后就会运行UE4编辑器界面,如下图所示:

二. 添加物体到场景中

添加物体到场景中的方法很简单,只需要中内容浏览器中将物体拖放到视口中的场景。

1) 在内容浏览器中选择StarterContent文件夹,再选择Props子文件夹,将MaterialSphere拖放到场景中。


2) 按R键,当球体三个轴呈现一个立方体的时候,表示现在是缩放模式。可以通过点击拖动立方体来调整该物体大小。


3) 按F键,使得视口聚焦于球体。然后在StarterContent/Materials文件夹下,拖动M_Tech_Hex_Tile放置到球体中,就完成了材质的更换。什么是材质呢?材质的英文名是Material,是一种定义物体外观的方式,它就像画笔一样,只会影响物体的外表,而不会影响物体的物理属性。通过给球体换上不同的材质,你可以让球体看起来像玻璃球、像钢珠、甚至像纸球。


转自:http://www.52vr.com/article-559-1.html

2016-11-22 13:35:34 u013131744 阅读数 13615
  • 从这里开始虚幻4-Editor介绍 v4.18

    本课程系列取名英译系列,是录制人员参考国外英文原版经典教程,结合中国人的习惯录制而成。希望能够给大家以帮助。从这里开始虚幻4系列教程,是Unreal的官方发布的入门教学,非常经典,是学习Unreal的佳入口。

    2372 人正在学习 去看看 杨石兴

201049jbyub1g2jlnz2dyz

现在我们已经有了一个场景并且运行了,我们需要添加一个角色到场景中。要这样做,我们必须从UE4的GameFramework类继承它。

一. 打开上次创建的关卡

如果你已经关闭了项目,并且保存了上次创建的关卡(假设命名为Untitled),然后你现在打开上次我们的项目,你会发现我们打开的只是Minimal_Default关卡。现在,让我们在内容浏览器中选择过滤器,然后选择关卡,再双击下面的Untitled就可以打开以前创建的关卡了。(其默认保存的位置是StarterContent\Maps文件夹下。)

二. 项目设置

如果你不想每次打开这个项目的时候,都要选择Untitled关卡的话,可以这样设置:

1) 点击编辑 -> 项目设置。


2) 选择地图&模式,在右侧有个Default Maps,这里的Game Default Map是游戏运行的默认关卡,然后Editor Startup Map是编辑器启动也有个默认关卡,你可以点击右边的三角形来选择关卡。


3) 点击右上角关闭窗口就会自动保存设置了。

三. 创建一个从Character类继承的类

从基本框架类继承是很简单的:
1) 在项目中打开你的UE4编辑器。

2) 在文件,选择“新建C++类”。


3) 这里你可以选择从Pawn类(Pawn类从控制器接收输入)继承或从Actor类继承。不过我们可以这里选择从Character类(角色)继承。


4) 点击继续,然后你可以命名这个类。这里我们将其命名为Avatar。

5) 最后点击创建类来使用代码创建这个类。

6) 然后UE4会自动运行你的VS项目。我们在项目解决方案中打开Avatar.h文件:


Avatar.h大致上看起来是这样的:
  1. #pragma once
  2. // Avatar.h code file
  3. #include "GameFramework/Character.h"
  4. #include "Avatar.generated.h"
  5. UCLASS()
  6. class MYPROJECT_API AAvatar : public ACharacter
  7. {
  8. GENERATED_UCLASS_BODY()
  9. };
UCLASS()和GENERATED_UCLASS_BODY()都是UE4定义好的宏,UCLASS()宏使得你的C++代码在UE4编辑器中可用。GENERATED_UCLASS_BODY()会适当处理你的类函数成为一个UE4类。现在你不需要彻彻底底地搞清楚它们的工作原理,你只需要确保它们在正确的位置出现。

四. 为角色创建一个模型

现在我们avatar是继承了角色类,但是还需要给角色赋予一个模型。我们可以从UE4的商城找免费的模型,步骤如下:

1) 点击工具栏的市场,进入UE4的商城。


2) 在类别中选择角色&动画。


3) 找到一个名字叫Animation Starter Pack的免费资源包,点击进去。


4) 点击下图中的免费按钮添加到库里面。


5) 下载完后点击库,点击“添加到工程”。


6) 在新窗口中,选择Demo1,然后点击添加到项目。


7) 现在,我们可以找到刚才添加的资源,在内容浏览器点击选择路径:


8) 选择StarterContent文件夹:

五. 载入网格

通常情况下,如果使用C++代码来指定要载入的资源,这是一种硬编码的坏习惯。在运行程序的时候,如果资源发生了改变,则程序不会做出改变。更好的做法是,可以在运行时改变载入的资源。

下面我们从C++类中创建一个蓝图:
1) 在菜单栏中的窗口-开发者工具-类别查看器。

2) 在类别查看器中,右击Avatar,选择创建蓝图类。(如果找不到Avatar,请关闭UE4编辑器,再重新打开)


3) 在下方输入蓝图类名称(我这里是BP_Avatar),点击保存。然后会来到蓝图编辑器:


4) 在左上角的组件窗口中,选择Mesh:


5) 在右侧的细节面板中,在Mesh选项卡中,选择下拉按钮,然后点击视图选项,点击显示引擎内容,再选择TutorialTPP。


6) 这时候碰撞体看起来是这样的,模型和碰撞体是对不上的:


7) 然后我们通过W、E、R快捷键变换模型,使之近似地包围在碰撞体里面。如果碰撞胶囊体不够大,你可以点击组件的CapsuleComponent,然后在细节面板的Shape调节胶囊体大小:


8) 然后我们可以关闭窗口。在内容浏览器中将BP_Avatar拖放到场景中。

六. 添加动画

你可以看到人物模型是呈T型的,3D建模/动画师通常都会让人物默认状态下摆T型,因为此时这可以使得人物做出各种各样的动作。

1) 双击内容浏览器的BP_Avatar,重新打开蓝图编辑器。


2) 在上方选项卡中点击视口,然后选择Mesh,在右侧的细节面板中的Animation选项中的Anim Blueprint Generated Class中选择UE4ASP_Hero_AnimBlueprint。


这样就完成了一个模型的动画添加了,关于动画的更多细节,我们在后面的教程中会深入探讨。

七. 添加摄像机

为了使得我们有一个第三人称视角,我们给该角色添加上摄像机以追随该角色。

1) 在组件中进行如下的步骤:


2) 移动摄像机并旋转角色到如下状态(注意角色的蓝色箭头是角色的前进方向,所以要使得摄像机和角色自身的朝向都要面对着蓝色箭头):


3) 点击工具栏的保存。

现在的角色还不能被控制,我们下一节继续讲如何编写C++代码来控制角色。


转自:http://www.52vr.com/article-561-1.html

2016-11-22 13:42:26 u013131744 阅读数 3264
  • 从这里开始虚幻4-Editor介绍 v4.18

    本课程系列取名英译系列,是录制人员参考国外英文原版经典教程,结合中国人的习惯录制而成。希望能够给大家以帮助。从这里开始虚幻4系列教程,是Unreal的官方发布的入门教学,非常经典,是学习Unreal的佳入口。

    2372 人正在学习 去看看 杨石兴

202346utv7srasask3esui

为什么使用UE4提供的容器类?

如果你用过C++的STL库,你就知道STL提供了各种各样的容器/数据结构,使得你对处理很多数据的时候非常快捷高效。UE4同样也提供了类似的库,库里面的类型是以T开头的,使用UE4提供的容器库可以更好地实现跨平台。所以在UE4进行开发的时候我们很少去使用STL容器,更多时候是使用UE4提供的容器。

一、TArray<T>是什么

如果你学过C++的模板,你就知道TArray<T>是一个模板类型,T是由我们指定的任意类型。比如你想创建一个数组元素都是int类型的动态数组,那么这个数组类型就是TArray<int>,类似的,你可以创建TArray<double>、TArray<FString>等等,T甚至是可以是你自己创建的C++类。

TArray<T>中所有数据元素都是T类型的,因此不能混合各种不同类型的元素进去这个容器。TArray没有设计成被继承的,所以不应该去继承它。并且new/delete一个TArray是危险的行为。当TArray的生命周期结束时(超出作用域),容器里面的所有元素也会被销毁。当你从另一个TArray创建一个新的TArray会复制所有数据元素到新的变量,而不会共享这些元素的内存。

二、创建动态数组

为了创建一个动态数组,你可以这样写:
TArray<int32> IntArray;
注意,int32是32位整形,而int会根据机器不同而字节不同,所以为了跨平台建议使用int32。
这时候,因为我们没有数据填充到该数组里面,所以还没有内存被分配。

三、填充动态数组

1) TArray::Init

在UE4的官方文档可以看到该函数的声明:
void Init(const ElementType & Element, int32 Number)
该函数用于设置数组为Number个,并且每个元素值的为Element,例如:
IntArray.Init(10, 5);// IntArray == [10,10,10,10,10]

2) TArray::Add

先来看该函数的声明:
int32 Add( const ElementType & Item)
该函数用于添加新元素到动态数组末尾。

3) TArray::Emplace

先来看该函数的声明:
template<typename... ArgsType>int32 Emplace( ArgsType &&... Args)
该函数也是用于添加新元素到动态数组末尾。示例:
TArray<FString> StrArr;StrArr.Add(TEXT("Hello"));StrArr.Emplace(TEXT("World"));// StrArr == ["Hello","World"]
虽然Add和Emplace都是添加新元素到动态数组末尾,不过它们的内部实现是不同的:
  • Add会复制元素到数组容器里面
  • Emplace使用你给的参数来构造一个新的元素类型的实例

在上面的示例中,Add创建了一个FString临时变量,然后传递给数组,在数组内部再次调用拷贝构造函数来复制这个FString临时变量。但是Emplace使用了C++11的右值引用技术,它不会构造临时变量,而是在数组内部使用这个字符串常量来创建FString变量。因此,由于Emplace少了一次拷贝构造函数操作,所以Emplace会比FString高效。但是由于Add比Emplace更具可读性,如果是普通的C++内置类型(不会有拷贝构造函数的巨大开销),建议使用Add。

4) TArray::Push

TArray::Push提供了两个一样功能的重载函数可以分别代替Add和Emplace。所以无论何时使用Push比Add和Emplace更加方便了:
void Push( const ElementType & Item )void Push( ElementType && Item )

四、迭代动态数组

通常迭代都至少有两种方式,一种是使用索引,一种是使用迭代器。

1) 使用索引迭代动态数组

为了练习我们的数组,我们可以在靠近NPC的函数中打印该数组。我们将ANPC::Prox_Implementation修改成如下代码:
  1. void ANPC::Prox_Implementation(
  2. AActor* otherActor,
  3. UPrimitiveComponent* otherComp,
  4. int32 otherBodyIndex,
  5. bool bFromSweep,
  6. const FHitResult & sweepResult
  7. ){
  8. //通过强制转换成AAVatar是否成功来判断是否玩家角色
  9. if (Cast<AAvatar>(otherActor) == nullptr)
  10. {
  11. return;
  12. }
  13. //获得第一人称控制器
  14. APlayerController* PController = GetWorld()->GetFirstPlayerController();
  15. if (PController)
  16. {
  17. //获得HUD界面
  18. AMyHUD* hud = Cast<AMyHUD>(PController->GetHUD());
  19. hud->AddMessage(Message(NpcMessage, 5.f, FColor::White));
  20. //测试数组
  21. TArray<int> array;
  22. array.Push(1);
  23. array.Push(3);
  24. array.Push(7);
  25. for (int index = 0; index < array.Num(); index++)
  26. {
  27. //GEngine是全局引擎变量,我们使用它的AddOnScreenDebugMessage函数来在游戏屏幕上打印调试信息。
  28. //该函数第一个参数是调试输出的位置,填写-1表示总在原来的调试信息上方。
  29. //第二个参数是字体大小,第三个参数是字体颜色,第四个参数是要打印的字符串,这里用FromInt函数将Int转换FString。
  30. GEngine->AddOnScreenDebugMessage(-1, 40, FColor::White, FString::FromInt(array[index]));
  31. }
  32. }
  33. }

注意,每次调试打印的信息都在原来的调试信息上面,所以数组里面的内容依次是1、3、7,而不是7、3、1。

2) 使用迭代器循环数组

  1. void ANPC::Prox_Implementation(
  2. AActor* otherActor,
  3. UPrimitiveComponent* otherComp,
  4. int32 otherBodyIndex,
  5. bool bFromSweep,
  6. const FHitResult & sweepResult
  7. ){
  8. //通过强制转换成AAVatar是否成功来判断是否玩家角色
  9. if (Cast<AAvatar>(otherActor) == nullptr){
  10. return;
  11. }
  12. //获得第一人称控制器
  13. APlayerController* PController = GetWorld()->GetFirstPlayerController();
  14. if (PController)
  15. {
  16. //获得HUD界面
  17. AMyHUD* hud = Cast<AMyHUD>(PController->GetHUD());
  18. hud->AddMessage(Message(NpcMessage, 5.f, FColor::White));
  19. //测试数组
  20. TArray<int> array;
  21. array.Push(1);
  22. array.Push(3);
  23. array.Push(7);
  24. //在使用容器的时候,为了容器的操作一致性,通常都会像下面这样使用迭代器来循环
  25. //所谓的迭代器其实类似于一个指针,当对指针进行++时,就指向后面的元素。
  26. //当超出容器范围的时候,迭代器为空,跳出循环
  27. for (TArray<int>::TIterator it = array.CreateIterator(); it; ++it)
  28. {
  29. //GEngine是全局引擎变量,我们使用它的AddOnScreenDebugMessage函数来在游戏屏幕上打印调试信息。
  30. //该函数第一个参数是调试输出的位置,填写-1就不会覆盖以前的调试信息。
  31. //第二个参数是字体大小,第三个参数是字体颜色,第四个参数是要打印的字符串,这里用FromInt函数将Int转换FString。
  32. GEngine->AddOnScreenDebugMessage(-1, 40, FColor::White, FString::FromInt(*it));
  33. }
  34. }
  35. }

在实际开发中,因为使用迭代器进行迭代更简洁美观,我们通常都会这样进行迭代容器。


转自:http://www.52vr.com/article-566-1.html

2016-11-22 13:40:17 u013131744 阅读数 4107
  • 从这里开始虚幻4-Editor介绍 v4.18

    本课程系列取名英译系列,是录制人员参考国外英文原版经典教程,结合中国人的习惯录制而成。希望能够给大家以帮助。从这里开始虚幻4系列教程,是Unreal的官方发布的入门教学,非常经典,是学习Unreal的佳入口。

    2372 人正在学习 去看看 杨石兴

201856krmoowoh05iy45zf

为了展示对话框,我们需要自定义一个HUD(heads-up display,即平视显示器)。

什么是HUD?
HUD是平面显示界面,就是平时我们玩3D游戏提供给玩家的2D菜单界面。HUD类提供了渲染文字、贴图、矩形和材质的渲染,创建后也可以通过蓝图来编辑。

创建HUD子类

1) 点击文件-新建C++类;

2) 选择从HUD类继承来创建我们自己的类;

3) 给你的类命名,在我这里命名为MyHUD。创建好后就会自动打开VS开发环境。

在VS编辑代码

在MyHUD.h中里面添加如下代码:
  1. UCLASS()
  2. class DEMO1_API AMyHUD : public AHUD
  3. {
  4. GENERATED_BODY()
  5. public:
  6. // 添加字体属性(随后我们在蓝图编辑器中设置字体类型)
  7. UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = HUDFont) UFont* hudFont;
  8. // 下面这个重载函数每帧会被调用一次,在这个函数的定义里面来渲染字体
  9. virtual void DrawHUD() override;
  10. };

在MyHUD.cpp中添加如下代码:
  1. void AMyHUD::DrawHUD()
  2. {
  3. // 先调用父类DrawHUD()函数
  4. Super::DrawHUD();
  5. // 接下来就渲染东西
  6. // 下面是画一条从(200,300)到(400,500)的蓝线:
  7. DrawLine(200, 300, 400, 500, FLinearColor::Blue);
  8. // 下面写一行文字(参数分别为文字、位置、字体、缩放、颜色):
  9. DrawText("UE4 is very interesting!", FVector2D(0, 0), hudFont, FVector2D(1, 1), FColor::White);
  10. }

在蓝图编辑器设置字体

1) 点击工具栏的蓝图-游戏模式-HUD:HUD-创建-MyHUD,来创建一个蓝图类,名字改为BP_MyHUD。

2) 在右侧的细节面板中选择字体:

3) 保存退出,然后打开之前创建的游戏模式的蓝图类:

4) 在HUD class中选择BP_MyHUD作为我们的默认HUD。

最后,你可以运行来看看HUD的效果:


原文转自:http://www.52vr.com/article-564-1.html

没有更多推荐了,返回首页