unreal4入门系列之十

2016-11-22 13:38:55 u013131744 阅读数 2587

201634k66c1j1dejd8l0ez

现在我们来创建一些NPC(non-playable characters,非玩家角色)。在这个游戏中,当我们靠近NPC时,它们会做出相应的反应。

创建C++类

1) 在UE编辑器中,打开文件-新建C++类,选择从Character(角色)类继承,然后命名子类为NPC。

2) 编写代码。打开NPC.h文件:
添加头文件:(注意包含头文件必须在#include "NPC.generated.h"这一行前面加)
#include "UObjectGlobals.h"
在原来的代码基础上添加如下代码:
  1. public:
  2. //在目录Collision下创建球体属性(随处可见,蓝图只读),该属性用作碰撞体
  3. UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Collision) USphereComponent* ProxSphere;
  4. //在目录NPCMessage下创建字符串属性(随处可见,蓝图可读写)
  5. UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = NPCMessage) FString NpcMessage;
说明:FString是UE4的专用字符串类型,当你在UE4中开发游戏中,应该优先使用FString而不是STL里面的String。因为UE4的FString等内置类型保证了跨平台功能。

3) 重新编译UE4项目。

创建蓝图类

1) 在内容浏览器,右击NPC类,然后从这里创建一个蓝图类。注意给每个蓝图类都命名一个独有的名字,因为之后我们给不同的NPC赋予不同的模型网格和不同的消息。

2) 现在打开蓝图编辑器,选择从添加组件中选择Mesh网格,然后在细节面板更改Skeletal Mesh(骨骼网格)为SK_Mannequin。

 


3) 像之前一样调整胶囊碰撞体到适合位置。

4) 在组件面板中选择蓝图自身。然后在默认选项卡,找到NpcMessage属性。这是从我们C++代码中创建的属性并且可以在蓝图中应用。在UPROPERTY()函数里面添加了一个NpcMessage的字符串变量,并且指定了在蓝图类中可读写,所以在细节面板中可以进行编辑了。

 

5) 你可以继续创建一个NPC蓝图类(或者直接从原来的NPC蓝图类中复制一个新的蓝图类),并且可以分别设置不同的NPCMessage。接着将这两个蓝图类拖动到场景中。

 

 

后面我们会讲解如何将每个NPC自身的消息在游戏中显示给玩家看。


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

2016-11-22 13:37:26 u013131744 阅读数 3499

201922rb1l3syoyu1glbys

当你运行我们上次做完的项目,你可能会意识到我们移动的摄像机还是默认的那个摄像机,这个默认的摄像机可以自由飞翔。这一节,我们要使得开始的角色是我们的一个Avatar类的实例对象,并且使用键盘控制我们的角色。

创建游戏模式类

1. 创建游戏模式的步骤如下:
1) 点击文件 --> 新建C++类。
2) 选择Game Mode(游戏模式)。
3) 将其命名为“MyGameMode1”。
4) 点击创建类。

什么是GameMode?GameMode包含了各种各样的游戏规则和让游戏引擎描述这个游戏是怎么玩的。

2. 创建游戏模式的蓝图
UE4会自动启动VS开发环境,然后我们来创建MyGameMode1蓝图:

1) 如图所示操作:

2) 填写蓝图名称,我这里是“BP_GameMode1”,然后点好。

3) 从右侧的细节面板中的Default Pawn Class的下拉选项中选择上次我们创建好的角色蓝图BP_Avatar。

什么是Default Pawn Class?Default Pawn Class就是被角色使用的那一类物体,也就是可以被玩家控制的Actor角色。

4) 点击工具栏的保存,然后退出。

现在运行游戏的话,你可以看到我们使用的摄像头已经是BP_Avatar角色所包含的摄像头了。但是现在还是控制不了角色,因为我们还没设置控制器输入。

设置检测键盘输入

1) 点击工具栏的设置,然后点击项目设置。


2) 接下来,点击左侧面板的输入,然后在Axis Mappings(按键映射)后面点击加号,再点击前面的小三角形展开。输入一个名为Forward(前进)的按键映射,然后下面选择W键。接着再添加一个名为Back(后退)的按键映射,然后下面选择D键。Left(左移)对应A键,Right(右移)对于D键。

3) 直接关闭该窗口以保存设置。

通过C++代码控制角色行走

1) 现在打开你的VS里面的Avatar.h构造器,添加五个成员函数的声明:
  1. //添加如下三个成员函数,用于角色控制:
  2. void SetupPlayerInputComponent(class UInputComponent* InputComponent) override; //覆写虚函数,当有输入的时候被调用以绑定功能
  3. void MoveForward(float amount);
  4. void MoveBack(float amount);
  5. void MoveLeft(float amount);
  6. void MoveRight(float amount);
并删除原有的这一行:
virtual void SetupPlayerInputComponent(class UInputComponent* InputComponent) override;

2) 然后在Avatar.cpp完成函数体定义:
  1. //游戏开始时被调用以绑定设备输入功能
  2. void AAvatar::SetupPlayerInputComponent(class UInputComponent* InputComponent)
  3. {
  4. check(InputComponent); //检查空指针
  5. InputComponent->BindAxis("Forward", this, &AAvatar::MoveForward);
  6. InputComponent->BindAxis("Back", this, &AAvatar::MoveForward);
  7. InputComponent->BindAxis("Left", this, &AAvatar::MoveRight);
  8. InputComponent->BindAxis("Right", this, &AAvatar::MoveRight);
  9. }
上面的InputComponent::BindAxis(...)函数用于将按键信息于函数调用绑定。例如当玩家按下W键,引擎就会检测到有我们之前命名的"Forward"按键信息,然后自动去调用当前类的AAvatar::MoveForward(float amount)函数。其它三个按键也是如此运作。所以接下来定义好这四个函数就可以了,这里的参数amount是设备输入量经过与scale相乘后得出的结果:
  1. void AAvatar::MoveForward(float amount)
  2. {
  3. // Controller控制器当前拥有该actor。例如如果当前角色死了,actor不存在了,此时Controller控制器没有拥有任何一个actor,那么如果我们还想去控制它,就会出错。
  4. // 如果控制器没有拥有actor或者移动量是0,不能进入该函数。
  5. if (Controller && amount)
  6. {
  7. // GetActorForwardVector()取得角色向前的向量
  8. FVector fwd = GetActorForwardVector();
  9. // 我们调用AddMovementInput来在‘fwd’向量的方向上移动角色‘amount’个单位
  10. AddMovementInput(fwd, amount);
  11. }
  12. }
  13. void AAvatar::MoveBack(float amount)
  14. {
  15. if (Controller && amount)
  16. {
  17. // GetActorForwardVector()取得角色向前的向量,加上负号,该向量就向后,所以取得了角色向后的向量
  18. FVector back = -GetActorForwardVector();
  19. AddMovementInput(back, amount);
  20. }
  21. }
  22. // 后面的函数类似前面,很容易懂
  23. void AAvatar::MoveLeft(float amount)
  24. {
  25. if (Controller && amount)
  26. {
  27. FVector left = -GetActorRightVector();
  28. AddMovementInput(left, amount);
  29. }
  30. }
  31. void AAvatar::MoveRight(float amount)
  32. {
  33. if (Controller && amount)
  34. {
  35. FVector right = GetActorRightVector();
  36. AddMovementInput(right, amount);
  37. }
  38. }

设置检测鼠标移动

接下来我们用第二步同样的操作打开项目设置并添加Yaw和Pitch按键信息,分别对应的是鼠标的X坐标和Y坐标。

注意Yaw的意思是绕竖轴旋转,Pitch的意思是绕横向轴旋转。见下图:

通过C++代码控制角色镜头

在Avatar.h你需要添加两个函数声明:
  1. void Yaw(float amount);
  2. void Pitch(float amount);
然后在Avatar.cpp中实现它们:
  1. void AAvatar::Yaw(float amount)
  2. {
  3. if (Controller && amount)
  4. {
  5. // AddControllerYawInput()函数用于改变控制器的Yaw变量,即增加纵向轴旋转量。
  6. // GetWorld()函数取得世界指针UWorld*,通过世界指针调用GetDeltaSeconds()取得每帧耗费的时间。
  7. // 之所以要乘以每帧耗费的时间,是为了使得每一【秒】都增加200.0f * amount的改变量。
  8. // 如果不乘以每帧耗费的时间,那么每一【帧】都会增加200.0f * amount的改变量。(注意由于每秒渲染量不同,所以每秒的帧数不一定是固定的。)
  9. // 通过帧数来控制变量,那么游戏看起来就不那么流畅。试想,机子性能好的时候游戏角色动作就迅速,机子性能差的时候游戏角色动作就慢,这对于玩家公平吗?
  10. AddControllerYawInput(200.f * amount * GetWorld()->GetDeltaSeconds());
  11. }
  12. }
  13. // 下面的函数与上面雷同,不再赘述
  14. void AAvatar::Pitch(float amount)
  15. {
  16. if (Controller && amount)
  17. {
  18. AddControllerPitchInput(200.f * amount * GetWorld()->GetDeltaSeconds());
  19. }
  20. }
在void AAvatar::SetupPlayerInputComponent(class UInputComponent* InputComponent)函数体的下面添加这两条语句将输入信息和函数绑定:
  1. InputComponent->BindAxis("Yaw", this, &AAvatar::Yaw);
  2. InputComponent->BindAxis("Pitch", this, &AAvatar::Pitch);

完整代码贴出

Avatar.h完整代码如下:
  1. #pragma once
  2. #include "GameFramework/Character.h"
  3. #include "Avatar.generated.h"
  4. UCLASS()
  5. class DEMO1_API AAvatar : public ACharacter
  6. {
  7. GENERATED_BODY()
  8. //添加如下五个成员函数,用于角色控制:
  9. void SetupPlayerInputComponent(class UInputComponent* InputComponent) override; //覆写,游戏开始时被调用以绑定设备输入功能
  10. void MoveForward(float amount);
  11. void MoveBack(float amount);
  12. void MoveLeft(float amount);
  13. void MoveRight(float amount);
  14. void Yaw(float amount);
  15. void Pitch(float amount);
  16. public:
  17. // 设置角色属性的默认值
  18. AAvatar();
  19. // 当游戏开始的时候被调用
  20. virtual void BeginPlay() override;
  21. // 每帧被调用
  22. virtual void Tick( float DeltaSeconds ) override;
  23. };

Avatar.cpp完整代码如下:
  1. #include "Demo1.h"
  2. #include "Avatar.h"
  3. // 设置默认值
  4. AAvatar::AAvatar()
  5. {
  6. // 设置这个角色每帧调用Tick()。 如果不需要的话你可以关掉它以提高性能。
  7. PrimaryActorTick.bCanEverTick = true;
  8. }
  9. // 当游戏开始时调用它
  10. void AAvatar::BeginPlay()
  11. {
  12. Super::BeginPlay();
  13. }
  14. // 每帧被调用
  15. void AAvatar::Tick( float DeltaTime )
  16. {
  17. Super::Tick( DeltaTime );
  18. }
  19. //游戏开始时被调用以绑定设备输入功能
  20. void AAvatar::SetupPlayerInputComponent(class UInputComponent* InputComponent)
  21. {
  22. check(InputComponent); //检查空指针
  23. InputComponent->BindAxis("Forward", this, &AAvatar::MoveForward);
  24. InputComponent->BindAxis("Back", this, &AAvatar::MoveForward);
  25. InputComponent->BindAxis("Left", this, &AAvatar::MoveRight);
  26. InputComponent->BindAxis("Right", this, &AAvatar::MoveRight);
  27. InputComponent->BindAxis("Yaw", this, &AAvatar::Yaw);
  28. InputComponent->BindAxis("Pitch", this, &AAvatar::Pitch);
  29. }
  30. void AAvatar::MoveForward(float amount)
  31. {
  32. // Controller控制器当前拥有该actor。例如如果当前角色死了,actor不存在了,此时Controller控制器没有拥有任何一个actor,那么如果我们还想去控制它,就会出错。
  33. // 如果控制器没有拥有actor或者移动量是0,不能进入该函数。
  34. if (Controller && amount)
  35. {
  36. // GetActorForwardVector()取得角色向前的向量
  37. FVector fwd = GetActorForwardVector();
  38. // 我们调用AddMovementInput来在‘fwd’向量的方向上移动角色‘amount’个单位
  39. AddMovementInput(fwd, amount);
  40. }
  41. }
  42. void AAvatar::MoveBack(float amount)
  43. {
  44. if (Controller && amount)
  45. {
  46. // GetActorForwardVector()取得角色向
转自:http://www.52vr.com/article-562-1.html



2016-11-21 23:30:27 u013131744 阅读数 4928

首先要说的是,游戏开发是一项高度复杂的代码开发工作,编程语言只是最基本的知识,它涉及的内容还有计算机图形学、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:32:43 u013131744 阅读数 4614

195828yo4fo0j4svzbsmo8

虚幻4中有一些按键和快捷键很常用,牢记它们并运动到实际的项目开发中,将会大大地提高你的工作效率和使得工作更简便快捷。下面将列举它们出来:

按键 动作
鼠标左键 选择actor
鼠标左键+拖动 前后移动和左右旋转摄像头
鼠标右键 选择actor并打开右键菜单
鼠标右键+拖动 旋转摄像头方向
鼠标左键+鼠标右键+拖动 摄像头上下左右移动
鼠标中键+拖动 摄像头上下左右移动
滑轮向上 摄像机向前移动
滑轮向下 摄像机向后移动
F 聚焦选中的actor
箭头方向键 摄像机前后左右移动
W 选中平移工具
E 选中旋转工具
R 选中缩放工具
W+任何鼠标按键 摄像机向前移动
S+任何鼠标按键 摄像机向后移动
A+任何鼠标按键 摄像机向左移动
D+任何鼠标按键 摄像机向右移动
E+任何鼠标按键 摄相机向上移动
Q+任何鼠标按键 摄像机向下移动
Z+任何鼠标按键 增加视野(鼠标释放后会恢复原状)
C+任何鼠标按键 缩小视野(鼠标释放后会恢复原状)
Ctrl+S 保存场景
Ctrl+N 创建新场景
Ctrl+O 打开一个已有的场景
Ctrl+Alt+S 另存为新场景
Alt+鼠标左键+拖动 复制当前选中的actor
Alt+鼠标右键+拖动 摄像机前后移动
Alt+P 进入Play预览模式
Esc 退出预览模式
F11 进入仿真模式


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

2016-11-22 13:35:34 u013131744 阅读数 14250

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