当前位置:首页 > 动态 > UE4开发入门   > UE4常用逻辑关系和说明
内容详情
UE4常用逻辑关系和说明
来源:      发布时间:2018-05-08 01:04      浏览:3133     字体:    

1、World与Level的概念

2Actor的概念

3ActorComponent关系

4PlayerLocalPlayerPlayerController的概念

5CameraManager

6PlayMode

7PlayerInput

8、UMG是什么

 

World(当前游戏世界,可以包含多个level

         LevelGameMoDe)(关,也称为Map

                  Actor(实体,可以被动态添加)

                            Component(隶属于Actor的功能对象体,如staticMeshComponent

                   Pawn(特殊的Actor,表示游戏世界中的生命体)

                   Character(一个类人的Pawn,带胶囊体和人体运动组件)

 

GameMode(定义了游戏规则,不同的游戏有不同的GameMode

GameState(游戏状态,包含玩家列表、得分情况、玩家任务清单等)

PlayerState(玩家的状态,:名字、得分、等级等)

 


LocalPlayer是在Game中提供的一个对象,用于表示真实玩家,而LocalPlayer又通过在World中放置PlayerController来控制玩家的PawnLocalPlayer起到了真实玩家和游戏世界的桥梁作用。 一个游戏实例可以有多个localPlayer,比如同屏2人玩各有自己的分画面(这种游戏现在很少见了(如二人玩俄罗斯方块))

 

术语解释

官方文档GamePlay

官方文档Terminology

 

Level

用户定义的一个游戏区域(上面可以摆放植被、树木、地形、野怪等),并且可以在Level-Blueprint里定义该Level的逻辑处理 。 每个Level在编辑器里制作后保存为umap后缀的文件,所以也被称为Map

 

World

World就是表示当前的游戏世界, 同时可以包含多个Levels,这些Levels拼凑成一个巨大的游戏场景。World可以动态加载这些 Levels(根据玩家在世界的何处),这个技术称为Streaming Level。通过World提供的Spwan()接口,我们可以在游戏进行时动态地添加Actors

 

Actor

Actor是放在Level中的基本的实体,它可以动态地被创建到World中。

 

Component

Component是一个功能对象体, 它隶属于Actor, 通过给Actor添加不同的Component来赋予它不同的功能特性。

StaticMesh-Component就会让Actor能够在场景画面上有视觉表现,

Audio-ComponentActor能够发出声音功能。

RotatingMovement-Component可以让Actor在世界中移动旋转。

 

Pawn

Pawn是一个特殊的Actor,表示游戏世界中的生命体, 它可以被Controller控制,并且可以被设置成可接受用户的Input, 它不局限于表示人类。

 

Character

Character是一个类人的Pawn. 它带有用于碰撞的胶囊体(CapsuleComponent)和人物运动组件(CharacterMovementComponent),它做基本的类人运动。

 

HUD

A HUD is a "heads-up display",用于在屏幕上显示二维的UI信息(如血条、玩家名称等). NOTE: 每个PlayerController只有一个AHUD类对象.

 

Camera

PlayerCameraManager相当于人的眼睛. NOTE: 每个PlayerController只有一个PlayerCameraManager.

Camera工作流程,通过阅读链接中的工作流程可知, 绘制场景时使用的SceneView参数是由PlayerCameraManager决定的,其它的Camera, CameraActor, ViewTarget是用于辅助的。

 

GameMode

定义了游戏的规则. 不用的游戏有不同的GameMode,可以在Project Setting里配置

 

GameState

GameState包含了游戏的状态,:当前游戏中的玩家列表、得分情况、玩家的任务清单完成情况等。

 

PlayerState

玩家的状态,:名字、得分、等级等。


UMG

       Unreal Motion Graphics UI Designer (UMG)
       虚幻动态图形 UI 设计器 (UMG)
       是一款视觉 UI 创作工具,可用于创作想要呈现给用户的 UI 元素,比如游戏内的 HUD、菜单或与界面相关的其他图形。UMG 的核心是控件,即用于构成界面的一系列预先制作的功能(比如按钮、复选框、滑块、进度条等)。

 

对象关系如下图:

 

 

 

谈到UE创建游戏世界的时候(GamePlay架构(一)ActorComponent),简单的介绍了一下UObject的功能:

藉着UObject提供的元数据、反射生成、GC垃圾回收、序列化、编辑器可见、Class Default Object等,UE可以构建一个Object运行的世界。(后续会有一个大长篇深挖UObject

 


 

1.创建关卡类

1.创建C++类继承LevelScriptActor

2.打开关卡蓝图 Class Settings->Parent Class 选择你之前创建好的C++

 

遇到的问题:

1.Tick()不运行 解决方法:BeginPlay() 增加Super::BeginPlay();

2.在主关卡类里面创建UMG

  1.创建C++类继承UUserWidget,例如:UMyUserWidget;

  2.获取PlayerController,方法:GetWorld()->GetFirstPlayerController();

  3.获取UMG蓝图,方法:UClass* widget = LoadClass(nullptr,TEXT("/Game/文件名.文件名_C"));

  4.在关卡里面创建UMG,方法:UMyUserWidget* mainUMG = CreateWidget(GetWorld()->GetFirstPlayerController(),widget); mainUMG->AddToViewport();

  

遇到问题:

  1.路径名一定要加_C;

  2.AddToViewport(参数);参数可以调整UMG之间的层级

 

3.UMG里面控件的使用

  1.获取最外层界面控件,方法:UPanelWidget *RootWidget = Cast(GetRootWidget());

  2.获取里面的控件,方法:Utype* t= (Utype*)GetWidgetFromName(TEXT("控件在UMG蓝图里面的名字"));例如:UButton *btn = (UButton*)GetWidgetFromName(TEXT("Button"));

  3.点击事件,方法:btn->OnClicked.AddDynamic(this, &UMyUserWidget::OnClickButton);

  4.获取UMG里面动画,方法:(有点复杂,暂时没有找到好的方法)

  UProperty *porp = GetClass()->PropertyLink;

  UObjectProperty *objectProp = Cast(porp);

  UObject *object = objectProp->GetObjectPropertyValue_InContainer(this);

  UWidgetAnimation* anim = Cast(object);

 

  播放:PlayAnimation(anim);

  遇到的问题:

  1.OnClickButton方法在头文件里面一定要加 UFUNCTION()

 

4.在主关卡里面增加输入事件(Input

  1.激活输入事件,InputComponent组件已继承,方法:EnableInput(GetWorld()->GetFirstPlayerController());

  2.绑定方法,方法:InputComponent->BindAxis("MoveForward", this, &ALevelScript::方法名);其方法参数为float;

  3.点击屏幕的回调,方法:InputComponent->BindTouch(EInputEvent::IE_Pressed, this, &ALevelScript::方法名);方法参数:const ETouchIndex::Type FingerIndex, const FVector Location

 

5.委托使用

  1.声明一个委托,方法:在头文件里面增加DECLARE_DELEGATE_OneParam(FOnSend,const FString&);这个是代参数的,有多个选择看看自己需求

  2.在头文件定义一个委托,方法:FOnSend onSend

  3.绑定方法,方法:BindUFuntion,BindUObject

  4.Lambda方式处理,方法:class->onSend.BindLambda([&](const FString& str){需要执行的方法或处理});

  5.发送方式,方法:OnSend.ExecuteIfBound(参数);

 

6.定时器 

  FTimerHandle timerHandler;

  GetWorldTimerManager().SetTimer(timerHandler,this,&class::Funtion,0.0001F,true);

 

7.C++调用蓝图  

  1.创建C++类并增加一个函数,在函数上面增加UFUNCTION(BlueprintImplementableEvent, Category = "Test")

2.在蓝图类Functions里面找到函数名重载一下

 

8.蓝图调用C++

  1.创建C++类并增加一个函数,在函数上面增加UFUNCTION(BlueprintCallable, Category = "Test")

2.直接搜索函数名,在Test下面

 

 

 

 

编码规范

 

类名前缀

UE4的类名必须遵从命名规范,需要在类名前面加上正确的前缀,与之对应的C++文件名则不加前缀。否则会编译报错。

派生自 Actor 的类前缀为 A,如 AController

派生自 UObject 的类前缀为 U,如 UComponent

枚举 的前缀为 E,如 EFortificationType

接口 类的前缀通常为 I,如 IAbilitySystemInterface

模板 类的前缀为 T,如 TArray

派生自 SWidget(Slate UI)的类前缀为 S,如 SButton

其余类的前缀均为 字母 F ,如 FVector

其他类型命名

bool类型变量需要加上b前缀,如 bCallable

途联微信号