1、World与Level的概念
2、Actor的概念
3、Actor与Component关系
4、Player、LocalPlayer、PlayerController的概念
5、CameraManager
6、PlayMode
7、PlayerInput
8、UMG是什么
World(当前游戏世界,可以包含多个level)
Level(GameMoDe)(关,也称为Map)
Actor(实体,可以被动态添加)
Component(隶属于Actor的功能对象体,如staticMeshComponent)
Pawn(特殊的Actor,表示游戏世界中的生命体)
Character(一个类人的Pawn,带胶囊体和人体运动组件)
GameMode(定义了游戏规则,不同的游戏有不同的GameMode)
GameState(游戏状态,包含玩家列表、得分情况、玩家任务清单等)
PlayerState(玩家的状态,如:名字、得分、等级等)
LocalPlayer是在Game中提供的一个对象,用于表示真实玩家,而LocalPlayer又通过在World中放置PlayerController来控制玩家的Pawn。LocalPlayer起到了真实玩家和游戏世界的桥梁作用。 一个游戏实例可以有多个localPlayer,比如同屏2人玩各有自己的分画面(这种游戏现在很少见了(如二人玩俄罗斯方块))。
术语解释
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-Component让Actor能够发出声音功能。
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架构(一)Actor和Component),简单的介绍了一下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。