Unity程序员的Unreal 简明教程(一、旋转的BOX)
Unity程序员的Unreal 简明教程(一、旋转的BOX)
注意,Unreal的版本号
写下这行字的时候Unreal发布的最新版本是4.25,4.25版本是比4.5 和 4.8更新的版本。
一、下载安装unreal
略,去epic 官网看看,需要注册账号。
安装好之后你可以看到一个帅气的图标,比U3D的好看多了
二、创建项目
Unreal带了很丰富的模板
但是我们只想要创建一个Game\Black
这些选项都保持默认就好。不用被第一个选项 蓝图 和 c++ 迷惑,他只是模板的一部分,不影响我们在项目里使用蓝图和c++
注意:UnrealEditor 磁盘访问非常零碎,一定要把项目建在SSD盘上,如果你用机械盘,升级吧。
注意:UnrealEditor 对中文路径支持有bug,别用中文,否则c++编译各种奇怪问题
项目创建后你应该能见到这样一个界面
第一件事是切成英文
点击菜单 编辑\编辑器偏好设置
将编辑器语言改为英文。
因为你能找到的资料基本都是基于英文界面的,不要自找麻烦。
三、基本界面
Unreal Editor 和 Unity Editor 一样都提供了基于docking的IDE界面,自己拖拖拽拽就是个人习惯了,
1.视口
我们都知道Unity 提供了 Scene 和 Game 两个视口
而Unreal 的视口没有区分功能,可以打开最多四个视口,每个视口都是独立观察,也支持线框啥的。
Unreal没有专门的Game视口,在点击Play进入运行状态后,当前选中的视口自动切换为游戏相机。
2. 场景结构
Unity中场景结构相关的两个视图是
Hierarchy 视图 和 Inspector 视图
其中Hierarchy视图就是场景的树状结构,而Inspector 就是选中场景中的一个节点后,对应该节点的GameObject的各种选项
Unity如其名,他结构设计上非常的统一,场景图,每个节点对应一个GameObject,所有的组件都挂在GameObject上,Transform既是节点,也是每个GameObject都有的一个位置组件。Transform和GameObject 是一对一关系,多数情况下,并不需要区分Transform和GameObject。
可以说Unity的场景里面只有一种东西,GameObject,所有的功能都挂在GameObject上。
而Unreal这边就要复杂的多了
虽然有看起来相似的Outline视图,但这东西不是场景图,一般翻译作大纲
大纲视图里面你可以看到花花绿绿有很多种不同的东西,Unreal把能够放进场景里的东西称为Actor,一个Actor不对应一个场景节点,他更像Unity的一个预设,一个Actor下面可以放一堆东西,而且这些东西不会显示在大纲视图里
如图,在detail视图中给这把椅子添加一个球组件,一个盒子组件,从大纲视图中选择chair,则椅子球盒子被作为一个整体选中。
这时候就发现另一个区别了,Unity中的Component组件是纯粹的逻辑和数据,除renderer组件之外他不能直接显示内容,而Unreal将Component组件作为实体。Component在Actor之内构成一棵树,有一个组件作为根。
Unreal中最常用的组件是StaticMeshComponent,他表示一个静态物体。一个Actor中可以有任意多个同类组件。
而Unity中把组件作为GameObject的一个属性,组件之间没有层次关系,且每种组件只允许挂在GameObject上一次。Unity种最常用的组件是meshrenderer 和 meshfilter
3. 资源视图
Unreal的资源视图和Unity的Project视图功能含义都差不多,不用多说
注意绿色部分是个独立的按钮,当你开始写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
前面说过 Actor概念相对Unity 更接近预设
双击它就可以进行编程了,如果打开的界面是数据视图,点击下图蓝色文字,就可以变成全功能编辑器
全功能视图老复杂了,让我们一点点来
从Event Graph 视图 找到 Event Tick,他就相当于Unity 脚本的Update()
只不过这里我们不写代码,改拖流程图了
右键,找到这个函数
连一根线,改一个值
好了,我们第一个程序写好了
等等,本来这沙发是个staticMesh 组件,他不会跟着逻辑运动,先如图把他改成可动的。
现在可以运行了,椅子转起来了。
因为Actor和预设差不多,在场景里多摆几个Actor,我们就得到了好几把旋转的椅子
2.可视化编程
椅子的旋转量现在是不可控的,我们把他变成从编辑器里面可以直接修改的。
还是这个视图,加一个变量
主要是这三项,第一个name,第二个type,Rotator 就是一个struct{float yaw pitch roll},一个有特殊变量名的vector3,描述旋转的三个轴。
第三个Instance Editable,表示这个变量可以在UnrealEditor里面编辑
将这个变量拖拽进来,就会问你,你要get 还是 set,我们要get这个变量用
这种只读取数据的函数都是没有进入流程的,他会根据被使用的数据自动调用。如上图连接就好了
如果你改完之后在detail面板里看不到这个属性,重启unreal editor^_^,没错,Unreal bug也不少
正常情况下,你就可以在UnrealEditor里面直接编辑他了
3.用组件来实现这个功能
毕竟给每个Actor写逻辑这太不科学了,我们改为写一个ActorComponent来完成自转,这样所有的Actor都可以套用他了
在content 视图 右键 新建蓝图
选Actor Component
还是一样的套路,加变量,拖流程,这次你需要去掉Context Sensitive 勾选,因为他会帮你判断哪些接口你应该不会调用。而我们偏偏要在ActorComponent里面调用Actor的方法
最终如图,这次多了个GetOwner() 传给了target
上次是在Actor里面调用,target自动为this。这次不在Actor里调用,需要传递target
如果你熟悉面向对象的套路,你会发现,这不就是面向对象?是的。
然后打开椅子蓝图actor
先把他还原(删除之前的tick事件)按住alt键点击删除流程线,其它东西可以选中按del
然后把自转组件拖上去
点上面的Add Component按钮自己选也行
椅子就又可以转了,这次我们就得从detail视图里先选中自转组件,再改他的值
4. 用C++来编程
Content视图,右键新建c++class ,基于ActorComponent
顺利应该自动打开vs,找到我们的class
头文件修改如下
加了两行,和上面蓝图里面自己加的变量等价,Unreal c++用UPROPERTY宏来标记下面的变量是一个特殊的变量
实现里加了一行,和上面蓝图里面拖得流程块等价
这个c++写的组件,可以替代上面蓝图拖的那个。如果你在编辑器里找不到公开的变量,重启UnrealEditor
五、总结
这里通过实现一个简单的功能,来了解一下Unreal,可以发现Unreal比Unity的设计复杂的多。
1. Unreal的基本组织概念和Unity无法对应,不要去套Unity的经验2
2. Unreal的基本编程思路是粘合靠蓝图,c++来扩充组件。
3. UnrealEditor仍然有不少bug,经常需要重启大法。
未完持续