Unreal Engine4和Unity3D对比
Unreal Engine4和Unity3D对比
文章目录
- Unreal Engine4和Unity3D对比
- 蓝图和C++
- 场景管理
- Gameplay框架
- 物体&组件管理
- 在UE4中对象的常见操作
- UObject 基础宏介绍
- UCLASS
- UPROPERTY
- UFUNCTION
- Actor
- Transform
- Component
- Physics
- Resources
- Pawn
- Controler
- Character
- Jump
- CharacterMovement
- 其他重要的类
- UUserWidget
- TimerManager
- Timeline
- 粒子系统
- 伤害系统
- 数学相关
- GUI图形系统
- 用户输入管理
- 自然环境设计
- 光照系统
- 3D模型管理
- 物理系统
蓝图和C++
UE4 官方推荐使用C++扩展底层框架,在上次使用蓝图类构建游戏逻辑。
建议使用独立进程方式运行游戏,如何在UE4编辑器中运行,很有可能C++无法获得正确的属性。
场景管理
在UE4中,使用Level代替Unity中的Scene
SceneComponent相当于Unity中的Transform,ActorComponent相当于具体的一些功能,SceneComponent继承自ActorComponent,而一个对象,包含多个ActorComponet,该关系来自包含。
Gameplay框架
Gameplay框架是UE4内置从比较成熟的适合多人对战的网络框架,主要包含了如下的思想:
客户端永远是不可靠的,服务端是才是唯一可靠
客户端和服务端通过数据的复制和RPC通信,将玩家的重要的数据和操作交给服务器执行,服务器将数据拷贝到对应玩家。
只有继承AActor的类才具有拷贝数据的特性。
如果客户端和服务器的数据出现不一性,将会强行用服务器的数据覆盖客户端。
对于及时性较高的处理,例如人物的移动,发射子弹等,可以客户端和服务器同时执行,但是最终的伤害判定等重要的处理还是必须由服务器来判定,并且客户端一旦得到服务器的返回,优先使用服务器的数据来覆盖客户端的数据。
RPC在蓝图中使用自定义事件实现,在自定义实现上设置该事件的执行实在“仅服务器”(在客户端调用事件,通知服务器执行)、“仅客户端”(在服务器调用事件,通知客户端执行)、“以广播的方式”(服务器调用并执行,并通知客户端也执行)
GameMode仅在服务器中存在,在客户端中无法获得,而其他的对象基本客户端和服务器都存在,以下是Gameplay框架中的对象存在和意义:
GameMode仅在服务器中存在指的是使用CS模式运行的网络游戏,而单击游戏中GameMode都可以使用。
GameMode仅在服务器存在并非要求所有的和服务器相关的函数都要写在GameMode中,只是说GameMode是用来制定规则的,和具体的游戏对象相关的还是要定义到对应蓝图中,只不过函数的调用地方是在服务器中还是在客户端中由事件的属性来决定。
名称 | 生命周期 | 存在的位置(服务器或客户端) | 服务端和客户端是否能同步 | 使用方式 |
---|---|---|---|---|
GameInstance | 引擎启动时创建,引擎关闭后销毁或更换 | 都存在 | 不能,服务器和客户端时独立的,彼此不通信 | 保存特定类型的持久数据,如用户账户信息 |
GameMode | 关卡加载时生成,销毁时一起销毁 | 仅在服务器 | 无此说法 |
存储客户端不需要明确知道的游戏信息,如: - 出现的玩家和观众数量以及允许的玩家和观众最大数量。 - 玩家进入游戏的方式,可包含选择生成地点和其他生成/重生成行为的规则。 - 游戏是否可以暂停,以及如何处理游戏暂停。 关卡之间的过渡,包括游戏是否以动画模式开场。 |
GameState | 同上 | 都存在 | 可以,服务器可以在GameState上使用复制变量让所有客户端保持最新的游戏数据 |
与所有玩家和旁观者有关、而不是与任何一个特定玩家有关的信息,如 游戏已运行的时间(包括本地玩家加入前的运行时间)。 每个个体玩家加入游戏的时间和玩家的当前状态。 当前 Game Mode 的基类。 游戏是否已开始 |
PlayerState | 同上 | 都存在 | 同上 | 与一个特定玩家有关的信息,如玩家的分数、 |
PlayerController | 同上 | 服务器上每个玩家都有PlayerController,但本地客户端只有本地玩家的PlayerController | 客户端和服务器之间传达信息,而不必将该信息复制到其他客户端 |
监听服务器和专用服务器
- 监听服务器是相当于局域网对战中的房主的位置,监听服务器既作了玩家,又承担了服务器的角色
- 监听服务器除了包含玩家所有的内容,还包含了制定规则的GameMode
- 专用服务器不包含界面,程序发布时需要自己编译UE4引擎。
同步加载场景
- UGameplayStatics::OpenLevel(GWorld, TEXT(“NewMap1”));
物体&组件管理
在UE4中对象的常见操作
Unreal Engine 蓝图 | Unreal Engine C++ | |
---|---|---|
创建物体 |
Construct Object From Class; Spawn Actor from Class; |
UMyObject* object = NewObject() UActor* actor = ApawnActor() |
拷贝对象 |
UWorld* world = ExistingActor->GetWorld(); FActionParameters spawnParameters; spawnParameters.Template = ExistingActor; World->SwpanActor(ExistingActor->GetClass(), SpawnLocation, SpawnRotation, spawnParams); 创建蓝图:UClass* SpawnActor = LoadClass(NULL, TEXT(“Blueprint’/Game/Flags/Stopping/BP_StoppingFlag_Blueprint.BP_StoppingFlag_Blueprint_C’”)); World->SwpanActor(SpawnActor, SpawnLocation, SpawnRotation, spawnParams);< |
|
添加组件 | myCollisionComp = CreateDefaultSubobject(FName(Text(“CollisionComponent”))); | |
获取组件 | Get Component By Class; |
UPrimitiveComponent* primitive = myActior->GetComponentByClass(UPrimitiveComponent::StaticClass()); or USphereComponent* sphereCollider = FindComponentByClass() USphereComponent* sphereCollider = Cast(primitive); |
销毁 | Destory Actor | actor->Destory() |
一秒后销毁 | Set Life Span | actor->SetLifeSpan(1); |
取消激活 |
Set Actor Hidden in Game; Set Actor Enable Collision; Set Actor Tick Enabled; |
actor->SetActorHiddenInGame(false); actor->SetActorEnableCollision(false); actor->SetActorTickEnable(false); |
组件反向获取 GameObject |
Get Owner; | AActor* actor = myComponent->GetOwner(); |
查找GameObject by name |
AActor* actor = FindObject(null, TEXT(“MyNameActor”)); | |
查找GameObject by type |
for(TActorIterator It(GetWorld());It;++It){} for(TObjectIterator It;It;++It){} |
|
查找GameObject by tag |
for(TActorIterator It(GetWorld());It;++It){ AActor* actor = *It; if(actor->ActorHasTag(FName(Text(“MyTag”)))){} } |
|
为GameObject/Actor 添加标签 |
ADDUNIQUE | actor.Tags.AddUnique(Text(“MyTag”)); |
为 MonoBehavious /ActorComponents添加标签 |
mycomponent.ComponentTags.AddUnique(Text(“MyTag”)); | |
比较标签 |
Actor Has Tag Component Has Tag |
myactor->ActorHasTag(FName(Text(“MyTag”))); component->ComponentHasTag(FName(Text(“MyTag”))) |
- 物理:刚体VS元组件
UE4中刚体类为UPrimitiveCompont,常见的刚体类如ShapeComponent, StaticMeshComponent,SkeletalMeshComponent
Unity中使用Layer指定层与层是否相互碰撞,UE4中使用碰撞通道 Collision Channel。
只有根组件是碰撞体的,碰撞属性才会生效。
RayCast vs LineTraceSingle
Transform.forword vs FVector.Vector() / Get Forward Vector
OnTriggerEnter vs OnActorBeginOverlap.AddDynamic(this, &MyActor::OnTriggerEnter)
velocity vs SetPhysicsLinearVelocity
- 输入事件
- Input.GetAxis(“Horizontal”) vs InputComponent->BindAction(“Horizontal”, this, &MyActor::OnHorizontal)
- 其他
- 单位:Unity单位是米,UE4中单位是厘米
- Unity和UE4都使用左手坐标系
- 可以在编辑器中,打开日志窗口,也可以在游戏运行时添加-log命令行参数,在游戏窗口外启动一个日志窗口。
- UE4使用UE_LOG输出日志,当出现严重错误时,使用check(),当不想打断程序时,使用ensure(),可以记录堆栈信息。
UObject 基础宏介绍
UCLASS
- Blueprintable 可用于蓝图
UPROPERTY
- BlueprintReadWrite 蓝图可读写
- EditInstanceOnly 仅仅在实例上可以编辑
- EditDefaultsOnly 仅仅在蓝图类上可编辑
- EditAnywhere 在任何地方都可以编辑
- VisibleAnywhere 是否可见
- VisibleDefaultsOnly 仅仅在蓝图类上可见
- VisibleInstanceOnly 仅仅在实例上可见
- Category 分类
- meta=(ClampMin=-5.0f, ClampMax = 5.0f, UIMin = -5.0f, UIMax = 5.0f) 通过meta限定范围
- meta=(MakeEditWidget=“true”)显示可编辑的框,主要用于FVector,可以在编辑视图中通过拖拽的方式赋值,在蓝图中可以勾选“显示3D控件“
UFUNCTION
BlueprintCallable 蓝图可调用
注意 SceneComponent组件是无法暴露给外部,如果希望在C++代码中获取到Component组件,又不想自己创建,则可使用FindComponentByClass查找组件。
SpringArm = Cast<USpringArmComponent>(FindComponentByClass(USpringArmComponent::StaticClass()));Camere = Cast<UCameraComponent>(FindComponentByClass(UCameraComponent::StaticClass()));
BlueprintNativeEvent 蓝图自定义事件。只需要声明,并实现XXX__Implementation() 函数。
Actor
Transform
- 修改Actor位置:SetActorLocation、AddActorLocalOffset
Component
创建子控件:CreateDefaultSubobject
附加到组件(设置父组件):SetupAttachment
Physics
是否模拟物理效果:Simulate Physics
是否启用重力:Enable Grivity
增加力:AddForce
增加力矩:AddTorque
Resources
加载资源(使用ConstructorHelpers):static ConstructorHelpers::FObjectFinder<UStaticMesh/UMaterialInterface>
加载资源(使用LoadClass和LoadObject): LoadClass(TEXT) LoadObject(nullptr, TEXT)
设置资源
- SetStaticMesh 静态网格
- SetMaterial 材质
- UPaperFlipbook 连续帧动画
Pawn
- Velocity 速度
Controler
使用自带的Controler控制Camera的转向:APawn::AddControllerYawInput
使用Controler控制人物移动 APawn::AddMovementInput(FVector, Vecocity):注意,这里AddMovementInput对Pawn类并不生效,只对Characher生效。
使用Controler控制人物转向 Controller->SetControlRotation(FVector)
Character
Jump
跳跃:Jump
停止跳跃:StopJump
判断是否在控制:IsFalling
CharacterMovement
- StopMovementImmediately
其他重要的类
UUserWidget
- 蓝图初始化组件: virtual bool Initialize() override; C++如果获取,则建议在该函数执行之后查询。
- 创建Widget:CreateWidget
- 添加到视口:AddToViewport
TimerManager
对于蓝图,可以使用Delay延迟某个动作的执行,对于C++,可以使用定时器来实现相同的功能。
GetWorldTimerManager().SetTimer(timeHandle, [&]() {this->bThrow = false;}, 0.833f, false);
Timeline
在UE4蓝图中,可以使用Timeline进行插值的计算,制作简单的补间动画。
粒子系统
- 临时生成一个粒子系统:SpawnEmitterAtLocation
- 临时生成一个2D声音:PlaySound2D
伤害系统
- 生成一个伤害:ApplyDemage
- 伤害回调事件:Event AnyDamage(蓝图),TakeDamage(C++ virtual function)
数学相关
RandomPointInBoundingBox:在一个区域内获取一个随机的点。
VInterpTo:两点之间插值
GUI图形系统
画布
文本
输入框
Toggle
滑动条
滚动视图和布局
边框和阴影:在文字的属性面板中可以设置边框
- UE4支持锚点
- UE4只子窗口布局嵌套
- UE4支持属性绑定和函数绑定
用户输入管理
虚拟轴
BindAxis
BindAction-IE_Pressed&IE_Released
获取键盘事件…
- UE4采用严格的事件驱动,并不存储按键信息
自然环境设计
基础地形编辑
- UE4支持地形编辑
- UE4包含一些对地形材质特殊处理的一些函数,例如地形材质层融合。
光照系统
灯光组件
- 灯光可以分成:方向光、点光、聚光,目前UE4不支持区域光
- UE中天空盒可以使用自带的组件SM_SkySphere
- UE4不支持使用6张图片组件天空盒,只能使用带有UV贴图的球形切图实现,贴图勾选使用双面,Unlit
照明设置
雾
光晕&炫光
UE4可以使用PostProcessVolume实现镜头光晕。后期处理体积(PostProcessVolume) 是可以添加到关卡的一种特殊类型的体积,由于虚幻引擎4不使用后期处理链,因此目前这些体积是操作后期处理参数的唯一方法。
自发光
- 通过材质实现实现自发光
3D模型管理
导入3D模型
换肤功能的实现
- 直接通过SetMaterial来改变材质
物理系统
刚体
恒力、扭矩力
- UE4可以调用AddForce和AddTorque添加恒力或扭矩力
碰撞和触发器
- 碰撞使用OnActorBeginOverlap和OnActorEndOverlap检测
动态摩擦力、静态摩擦力、弹力
- 物体默认可以使用角阻尼和线性阻尼来设定物体的移动和旋转的难易程度。
- 可以创建物理材质的资源,设置摩擦力和静态摩擦力和弹力
- 可以设置使用较小、较大、平均等计算两个物体之间的摩擦力
射线
- 通过LineTraceForObjects或LineTraceByChannel在两个一直点发射射线
Unreal Engine4和Unity3D对比相关推荐
- Unity,UDK,Unreal Engine4或者CryENGINE——我应该选择哪一个游戏引擎
在digital-tutors看到的一篇文章,很多初学者都有这样的疑问,因此翻译到这里. 原文: http://blog.digitaltutors.com/unity-udk-cryengine-g ...
- unreal engine4效果很不错
http://blog.csdn.net/garuda/article/details/7650845 看了unreal engine4的ElementalTech Demo和Featuresand ...
- UE4(unreal engine4)蒙太奇动画删除不想要的帧数
UE4系列文章目录 文章目录 UE4系列文章目录 前言 一.问题原因 二.具体操作步骤 前言 UE4(unreal engine4)蒙太奇动画删除不想要的帧数.当我们在UE4中导入一个fbx骨骼动画. ...
- Unreal Engine4(虚幻4)学习心得-材质
Unreal Engine4(虚幻4)学习心得-材质 材质 制作材质的过程其实就相当于在写shader,只是UE4制作材质使用的是可视化方式在写shader.下面将介绍一些材质属性: Blend Mo ...
- UE4(Unreal Engine4)在蒙太奇动画中添加音频轨道通知
UE4系列文章目录 文章目录 UE4系列文章目录 前言 一.遇到的问题 二.操作步骤 前言 UE4(Unreal Engine4)在蒙太奇动画中添加音频轨道通知,我们想在某一帧动画中添加声音.比如我们 ...
- 【游戏周边】Unity,UDK,Unreal Engine4或者CryENGINE——我应该选择哪一个游戏引擎
在digital-tutors看到的一篇文章,很多初学者都有这样的疑问,因此翻译到这里. 原文:http://blog.digitaltutors.com/unity-udk-cryengine-ga ...
- UE4(Unreal Engine4)虚幻引擎视口布局,并且自定义HDRI
UE4系列文章目录 文章目录 UE4系列文章目录 前言 一.操作步骤 1.准备工作 二.操作步骤 1.UE4中创建第三人称游戏 前言 在UE4中搭建电影级场景.先看下效果 一.操作步骤 1.准备工作 ...
- Unreal Engine4(虚幻4)学习心得-Ambient Cubemap 环境立方体贴图
Unreal Engine4(虚幻4)学习心得-Ambient Cubemap 环境立方体贴图 创建项目 如何创建新的项目在这里就不做过多说明了,打开UE4 Editor,就可以选择是创建bluepr ...
- Unreal Engine4 蓝图入门
微信公众号:UE交流学习 UE4开发群:344602753 蓝图是Unreal Engine的特点,用C++编程固然好,但是效率要低很多,主要是国内资料比较少,所以不太容易学习,用蓝图编程可以节 ...
- Unreal Engine4开篇
笔者第一次在cnblog发布博客.作为开篇就先简单介绍一下笔者自己吧! 笔者目前就职于北京炫睛科技有限公司,担任技术经理一职.研究的技术方向包括Unity.UE4.Vuforia(an AR sdk ...
最新文章
- 阐述一下Mysql事务的四个特性_数据库事务的四个基本性质?
- 智源研究院发布“智能体系架构与芯片”重大研究方向,打造通用智能处理器,突破“算法共性特征”难题...
- 在线转换Postgresql 到Mysql
- WinServer2012中怎样设置静态IP
- CST光源控制卡简单操作C#程序
- 东八区转为0时区_格林尼治时间转换为北京时间
- 搭建远程jupyter服务器并从本地连接,有浏览器的地方就有Python!
- 打开SharePoint 2013 web application显示iis 欢迎页面
- voc数据集转换为txt
- vi测试仪维修成功率高吗?_老客户维护难,转介绍更难,这16个问题你做到了吗?...
- oracle 取表字段,oracle 取多级的表字段
- ai人工智能写歌词app,ai写歌词网站,ai作词软件创作版,作词人的辅助工具,押韵助手
- python实现onvif客户端及问题小结
- 脑虎科技CEO彭雷专访│脑机未来,生命科学的无尽前沿
- 微信小程序云函数使用讲解
- JavaScript 教程+代码(下)
- 布局万花筒:UIColletionview
- 网页能够兼容所有手机浏览器—杂记(2)
- 2019年6月20日工作总结---CSS篇
- 乐吾乐2D可视化绘图引擎
热门文章
- 作为一名基层管理者如何利用情商管理自己和团队(二)
- 机器之心的进化 / 理解 AI 驱动的软件 2.0 智能革命
- python调用pyd失效
- python requests soup_带你了解python爬虫requests模块BeautifulSoup使用方式!
- python基础读后感_《Python基础教程读书笔记》
- manjaro 安装 tim 后无法输入中文
- CIKM 2019 挑战杯「用户行为预测」冠军方案:层次GNN模型在推荐中的应用
- DataFrame切片
- 手机指北针 + Python绘制徒步路线图
- 微信小程序 使用cookie