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内置从比较成熟的适合多人对战的网络框架,主要包含了如下的思想:

  1. 客户端永远是不可靠的,服务端是才是唯一可靠

  2. 客户端和服务端通过数据的复制和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”)))
  1. 物理:刚体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

  1. 输入事件
  • Input.GetAxis(“Horizontal”) vs InputComponent->BindAction(“Horizontal”, this, &MyActor::OnHorizontal)
  1. 其他
  • 单位: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(FindComponentByClass(USpringArmComponent::StaticClass()));
    	Camere = Cast(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

  • 加载资源(使用LoadClass和LoadObject): LoadClass(TEXT) LoadObject(nullptr, TEXT)

  • 设置资源

    1. SetStaticMesh 静态网格
    2. SetMaterial 材质
    3. 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图形系统

  1. 画布

  2. 文本

  3. 输入框

  4. Toggle

  5. 滑动条

  6. 滚动视图和布局

  7. 边框和阴影:在文字的属性面板中可以设置边框

    • 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在两个一直点发射射线

你可能感兴趣的:(游戏开发,游戏开发)