Unity程序员的Unreal 简明教程(一、旋转的BOX)

注意,Unreal的版本号

写下这行字的时候Unreal发布的最新版本是4.25,4.25版本是比4.5 和 4.8更新的版本。

一、下载安装unreal

略,去epic 官网看看,需要注册账号。

unreal工程结构 unreal工程师_重启

安装好之后你可以看到一个帅气的图标,比U3D的好看多了

二、创建项目

Unreal带了很丰富的模板

unreal工程结构 unreal工程师_c++_02

unreal工程结构 unreal工程师_Game_03

unreal工程结构 unreal工程师_重启_04

但是我们只想要创建一个Game\Black

这些选项都保持默认就好。不用被第一个选项 蓝图 和 c++ 迷惑,他只是模板的一部分,不影响我们在项目里使用蓝图和c++

注意:UnrealEditor 磁盘访问非常零碎,一定要把项目建在SSD盘上,如果你用机械盘,升级吧。

注意:UnrealEditor 对中文路径支持有bug,别用中文,否则c++编译各种奇怪问题

项目创建后你应该能见到这样一个界面

unreal工程结构 unreal工程师_Game_05

第一件事是切成英文

点击菜单 编辑\编辑器偏好设置

unreal工程结构 unreal工程师_unreal工程结构_06

将编辑器语言改为英文。

因为你能找到的资料基本都是基于英文界面的,不要自找麻烦。

三、基本界面

Unreal Editor 和 Unity Editor 一样都提供了基于docking的IDE界面,自己拖拖拽拽就是个人习惯了,

1.视口

我们都知道Unity 提供了 Scene 和 Game 两个视口

unreal工程结构 unreal工程师_c++_07

unreal工程结构 unreal工程师_Game_08

而Unreal 的视口没有区分功能,可以打开最多四个视口,每个视口都是独立观察,也支持线框啥的。

Unreal没有专门的Game视口,在点击Play进入运行状态后,当前选中的视口自动切换为游戏相机。

2. 场景结构

Unity中场景结构相关的两个视图是

unreal工程结构 unreal工程师_c++_09

Hierarchy 视图 和 Inspector 视图

其中Hierarchy视图就是场景的树状结构,而Inspector 就是选中场景中的一个节点后,对应该节点的GameObject的各种选项

Unity如其名,他结构设计上非常的统一,场景图,每个节点对应一个GameObject,所有的组件都挂在GameObject上,Transform既是节点,也是每个GameObject都有的一个位置组件。Transform和GameObject 是一对一关系,多数情况下,并不需要区分Transform和GameObject。

可以说Unity的场景里面只有一种东西,GameObject,所有的功能都挂在GameObject上。

而Unreal这边就要复杂的多了

unreal工程结构 unreal工程师_unreal工程结构_10

虽然有看起来相似的Outline视图,但这东西不是场景图,一般翻译作大纲

unreal工程结构 unreal工程师_c++_11

大纲视图里面你可以看到花花绿绿有很多种不同的东西,Unreal把能够放进场景里的东西称为Actor,一个Actor不对应一个场景节点,他更像Unity的一个预设,一个Actor下面可以放一堆东西,而且这些东西不会显示在大纲视图里

unreal工程结构 unreal工程师_重启_12

如图,在detail视图中给这把椅子添加一个球组件,一个盒子组件,从大纲视图中选择chair,则椅子球盒子被作为一个整体选中。

这时候就发现另一个区别了,Unity中的Component组件是纯粹的逻辑和数据,除renderer组件之外他不能直接显示内容,而Unreal将Component组件作为实体。Component在Actor之内构成一棵树,有一个组件作为根。

Unreal中最常用的组件是StaticMeshComponent,他表示一个静态物体。一个Actor中可以有任意多个同类组件。

而Unity中把组件作为GameObject的一个属性,组件之间没有层次关系,且每种组件只允许挂在GameObject上一次。Unity种最常用的组件是meshrenderer 和 meshfilter

3. 资源视图

Unreal的资源视图和Unity的Project视图功能含义都差不多,不用多说

unreal工程结构 unreal工程师_Game_13

注意绿色部分是个独立的按钮,当你开始写c++代码的时候,可以通过这里进行切换,c++Actor 是单独放置的。

四、编程

Unreal的编程和Unity有相似的地方,需要在场景里组织各种组件

Unreal的场景称为 Level,概念和Unity差不多。

此处又得讲一下,Unity的结构非常简单,除了挂在场景里的组件,就只有

[InitializeOnLoad]属性修饰的函数。一共就两处

而Unreal这里埋藏的设置就比较多

1. 场景里Actor上可以有逻辑

2. Actor下挂的ActorComponent可以有逻辑

3. 每个level有一个LevelBluePrint可以有逻辑

4. Unreal还有一种脚本叫Gamemode,也有逻辑

Unity的编程全部用c#写脚本

Unreal的编程是用蓝图驱动,c++作为蓝图的补充。

1. 旋转的椅子

选中椅子,从detail视图点蓝色按钮,把他转换成一个蓝图actor

unreal工程结构 unreal工程师_c++_14

前面说过 Actor概念相对Unity 更接近预设

unreal工程结构 unreal工程师_unreal工程结构_15

你会在Content视图看到这个Actor

双击它就可以进行编程了,如果打开的界面是数据视图,点击下图蓝色文字,就可以变成全功能编辑器

unreal工程结构 unreal工程师_重启_16

unreal工程结构 unreal工程师_unreal工程结构_17

全功能视图老复杂了,让我们一点点来

从Event Graph 视图 找到 Event Tick,他就相当于Unity 脚本的Update()

只不过这里我们不写代码,改拖流程图了

unreal工程结构 unreal工程师_Game_18

右键,找到这个函数

unreal工程结构 unreal工程师_unreal工程结构_19

连一根线,改一个值

好了,我们第一个程序写好了

unreal工程结构 unreal工程师_unreal工程结构_20

等等,本来这沙发是个staticMesh 组件,他不会跟着逻辑运动,先如图把他改成可动的。

现在可以运行了,椅子转起来了。

unreal工程结构 unreal工程师_c++_21

因为Actor和预设差不多,在场景里多摆几个Actor,我们就得到了好几把旋转的椅子

2.可视化编程

椅子的旋转量现在是不可控的,我们把他变成从编辑器里面可以直接修改的。

unreal工程结构 unreal工程师_Game_22

还是这个视图,加一个变量

unreal工程结构 unreal工程师_Game_23

主要是这三项,第一个name,第二个type,Rotator 就是一个struct{float yaw pitch roll},一个有特殊变量名的vector3,描述旋转的三个轴。

第三个Instance Editable,表示这个变量可以在UnrealEditor里面编辑

unreal工程结构 unreal工程师_c++_24

将这个变量拖拽进来,就会问你,你要get 还是 set,我们要get这个变量用

unreal工程结构 unreal工程师_重启_25

这种只读取数据的函数都是没有进入流程的,他会根据被使用的数据自动调用。如上图连接就好了

如果你改完之后在detail面板里看不到这个属性,重启unreal editor^_^,没错,Unreal bug也不少

正常情况下,你就可以在UnrealEditor里面直接编辑他了

unreal工程结构 unreal工程师_unreal工程结构_26

3.用组件来实现这个功能

毕竟给每个Actor写逻辑这太不科学了,我们改为写一个ActorComponent来完成自转,这样所有的Actor都可以套用他了

unreal工程结构 unreal工程师_重启_27

在content 视图 右键 新建蓝图

选Actor Component

还是一样的套路,加变量,拖流程,这次你需要去掉Context Sensitive 勾选,因为他会帮你判断哪些接口你应该不会调用。而我们偏偏要在ActorComponent里面调用Actor的方法

unreal工程结构 unreal工程师_重启_28

unreal工程结构 unreal工程师_c++_29

最终如图,这次多了个GetOwner() 传给了target

上次是在Actor里面调用,target自动为this。这次不在Actor里调用,需要传递target

如果你熟悉面向对象的套路,你会发现,这不就是面向对象?是的。

然后打开椅子蓝图actor

先把他还原(删除之前的tick事件)按住alt键点击删除流程线,其它东西可以选中按del

unreal工程结构 unreal工程师_Game_30

然后把自转组件拖上去

unreal工程结构 unreal工程师_Game_31

点上面的Add Component按钮自己选也行

椅子就又可以转了,这次我们就得从detail视图里先选中自转组件,再改他的值

unreal工程结构 unreal工程师_c++_32

4. 用C++来编程

Content视图,右键新建c++class ,基于ActorComponent

顺利应该自动打开vs,找到我们的class

头文件修改如下

unreal工程结构 unreal工程师_重启_33

加了两行,和上面蓝图里面自己加的变量等价,Unreal c++用UPROPERTY宏来标记下面的变量是一个特殊的变量

unreal工程结构 unreal工程师_重启_34

实现里加了一行,和上面蓝图里面拖得流程块等价

这个c++写的组件,可以替代上面蓝图拖的那个。如果你在编辑器里找不到公开的变量,重启UnrealEditor

五、总结

这里通过实现一个简单的功能,来了解一下Unreal,可以发现Unreal比Unity的设计复杂的多。

1. Unreal的基本组织概念和Unity无法对应,不要去套Unity的经验2

2. Unreal的基本编程思路是粘合靠蓝图,c++来扩充组件。

3. UnrealEditor仍然有不少bug,经常需要重启大法。


未完持续