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

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

注意,Unreal的版本号

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

一、下载安装unreal

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

wps1

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

二、创建项目

Unreal带了很丰富的模板

wps2

wps3

wps4

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

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

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

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

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

wps5

第一件事是切成英文

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

wps6

将编辑器语言改为英文。

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

三、基本界面

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

1.视口

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

wps7

wps8

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

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

2. 场景结构

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

wps9

Hierarchy 视图 和 Inspector 视图

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

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

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

而Unreal这边就要复杂的多了

wps10

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

wps11

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

wps12

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

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

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

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

3. 资源视图

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

wps13

注意绿色部分是个独立的按钮,当你开始写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

wps14

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

wps15你会在Content视图看到这个Actor

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

wps16

wps17

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

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

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

wps18

右键,找到这个函数

wps19

连一根线,改一个值

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

wps20

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

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

wps21

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

2.可视化编程

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

wps22

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

wps23

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

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

wps24

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

wps25

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

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

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

wps26

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

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

wps27

在content 视图 右键 新建蓝图

选Actor Component

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

wps28

wps29

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

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

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

然后打开椅子蓝图actor

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

wps30

然后把自转组件拖上去

wps31

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

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

wps32

4. 用C++来编程

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

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

头文件修改如下

wps33

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

wps34

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

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

五、总结

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

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

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

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


未完持续

posted @ 2020-08-11 17:48  疯光无线  阅读(1163)  评论(0编辑  收藏  举报