c1.GamePlay|导言
天地除开,诞生了第一缕
UObject
,各自进化成Actor+Component、Level、World、WorldContext、GameInstance等。
有这么一天,UEngine大佬出现自称为帝,掌管所有UObject,还给各种UObject划分职责。有的管理游戏逻辑、有的管理游戏表现、有的管理游戏数据。
导读
UE启动
心血来潮!我要自己搞一个游戏!UE启动!
1. 新建一个CPP工程
2.添加第一个C++类
等待编译并启动项目,初次尝试UECPP先问候一句HelloWorld再说,点击工具-新建一个C++类。
UObject|UE对象
什么是UObject?
UE-GamePlay架构
摘自官方文档:
此流程图演示了这些核心Gameplay类彼此之间的关系。
一个游戏由一个GameMode和一个GameState构成。
加入游戏的人类玩家与PlayerController关联。
这些PlayerController允许玩家持有游戏中的Pawn,以便在关卡中有物理表示。
PlayerController还为玩家提供了输入功能按钮、平视显示器(简称HUD)和用于处理摄像机视图的PlayerCameraManager。
下面会详细介绍每一项
游戏规则: ①-②
3C是指: Character(角色)、Control(控制)和Camera(摄像机) ③-⑤扩展阅读
游戏界面⑥
①GamePlay->GameMode
- AGameModeBase (public AInfo)
- AInfo (public AActor)
- AActor (public UObject)
- AInfo (public AActor)
生成的类打开后
类别 | 类名 | 用途 |
---|---|---|
APawn class | 游戏中的角色 | 代表游戏中的玩家、AI 或者其他角色。控制移动、动画、状态、碰撞等。 |
AHUD class | Heads-Up Display (HUD) | 用于在屏幕上显示游戏信息,如分数、生命值、小地图等。通常负责在画面上绘制 UI 元素。 |
APlayerController class | 玩家控制器 | 处理玩家输入,控制与玩家的交互,例如移动、攻击、交互等。可以操控一个或多个角色。 |
AGameState class | 游戏状态 | 负责跟踪整个游戏的全局状态,例如游戏时间、分数、胜利条件等。用于同步状态给所有客户端。 |
APlayerState class | 玩家状态 | 保存与玩家相关的状态,如分数、生命值、角色类型等。通常由服务器和客户端各自维护一份。 |
ASpectatorPawn class | 观察者角色 | 允许玩家以观察者身份观察游戏,通常用于回放、录像功能或者观察比赛。不与玩家角色相关联,可以自由观察游戏世界。 |
② GameState|游戏状态
- AGameStateBase (public AInfo)
- AInfo (public AActor)
- AActor (public UObject)
- AInfo (public AActor)
③ Camera|游戏相机
④ Character|游戏角色
⑤ Controller|控制器
⑥ GameUI|游戏UI
Component|组件
组件类型 | 功能和用途 |
---|---|
UStaticMeshComponent | 渲染静态网格模型,如墙、地板等 |
USkeletalMeshComponent | 渲染有骨骼的网格模型,适用于角色和生物 |
UCameraComponent | 创建摄像机视图,用于玩家或观察 |
ULightComponentBase | 创建不同类型的光源,如点光源、聚光灯等 |
UParticleSystemComponent | 播放粒子系统,创建特效如火焰、爆炸等 |
UAudioComponent | 播放声音,附加到物体上产生音效 |
UCollisionComponent | 处理碰撞和触发事件,可以是基本碰撞体或区域 |
UInputComponent | 处理玩家输入,如按键和鼠标事件 |
USceneComponent | 在场景中构建组件层次结构,可作为父组件 |
UWidgetComponent | 将2D UI嵌入3D世界,显示UMG部件 |
UWorld|游戏世界
ULevel|游戏关卡
WorldContext|世界上下文
掌权者
GameInstance|游戏实例
大帝
UEngine|虚幻游戏引擎
天地除开,诞生了第一缕UObject
,各自进化成Actor+Component、Level、World、WorldContext、GameInstance等。
有这么一天,UEngine大佬出现自称为帝,掌管所有UObject,还给各种UObject划分职责。有的管理游戏逻辑、有的管理游戏表现、有的管理游戏数据。
Object->Actor+Component->Level->World->WorldContext->GameInstance->Engine
真神
UE-Refection|UE反射
篇幅限制,这里不做反射的深入,具体可以看后续的反射机制篇。
可以先参考官方文档
宏(英语:Macro),是一种批量处理的称谓。 计算机科学里的宏是一种抽象(Abstraction),它根据一系列预定义的规则替换一定的文本模式。 解释器或编译器在遇到宏时会自动进行这一模式替换。——wiki
具体的宏标记请阅读我的
UHT|Unreal Header Tool(虚幻头文件工具)
1. 源代码
- 用户编写包含特定宏和标记的UE4 C++ 代码。
2. UHT扫描
- UHT在构建项目时扫描头文件,寻找特定的宏和标记。
3. 生成反射信息
- UHT使用找到的宏和标记生成反射信息,包括类的成员变量和成员函数。
4. 生成代码框架
- 除了反射信息,UHT也可以根据宏和标记生成一些代码框架,以辅助实现类的功能。
5. 传递给编译器
- 生成的反射信息和代码框架将传递给C++编译器,它们会被合并到最终的编译过程中。
6. 构建项目
- 编译器将所有的源代码和生成的代码一起编译成可执行文件。
7. 运行游戏
- 最终生成的可执行文件可以在UE4引擎中运行,实现用户在代码中定义的功能。
- 通常会在一个类的头文件中包含一个以 .generated.h 结尾的文件, 例如 MyClass.generated.h。
- 这个文件包含了由UHT生成的代码,通常用于实现反射信息、蓝图节点以及其他与类相关的元数据。
- 默认情况下,UE会使用Microsoft Visual C++(MSVC)作为主要的编译工具,这里我们用Rider连接MSVC(IDE自动完成)。
图片截取自图片截取自ARRG从入门到进阶P36
UPK|UE包文件组成
从Unreal Engine 4(UE4)开始,UPK 文件被替代为更先进的Unreal Asset文件格式(.uasset)和Unreal Asset Registry(.uassetregistry)等。 UPK 文件仍然存在于早期版本的Unreal Engine中。
更准确点描述:一个Package是一个文件(.uasset或者.umap),它包含一些可以UE4进行操作和访问的二进制数据文件。
进化
各司其职原本是件好事,随着时间的增加,我们发现这个管理模式会出现很多问题。大帝UEngine忙着管理大局,所有琐碎任务都堆积给我们的Gameinstance这位掌权者身上,导致我们的项目非常难以维护。
如果我们自己重新定义一个管理者Object Manager,又必须非常小心管理这一切。
好钢用在刀刃——显然开发者应该把精力更多的放在游戏性本身。
于是UEngine“东、西厂”出现了!——Subsystem。
Subsystem|子系统
子系统 | 继承自的类 |
---|---|
引擎子系统 | UEngineSubsystem 类 |
编辑器子系统 | UEditorSubsystem 类 |
游戏实例子系统 | UGameInstanceSubsystem 类 |
本地玩家子系统 | ULocalPlayerSubsystem 类 |
当引擎子系统的模块加载时,子系统将在模块的 Startup() 函数返回后执行 Initialize(),子系统将在模块的 Shutdown() 函数返回后执行 Deinitialize()。
3. 选择蓝图函数库类
因为我们只是想打印一条简单的HelloWorld,又不想挂载在Actor上,最终决定先写在蓝图函数库中。
4. 分析系统生成的cpp文件。
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "TEST.generated.h"
/**
*
*/
UCLASS()
class EXORCIST_API UTEST : public UBlueprintFunctionLibrary
{
GENERATED_BODY()
};
打开TEST.generated.h
// 版权归 Epic Games, Inc. 所有。保留所有权利。
/*===========================================================================
从UnrealHeaderTool导出的生成代码。
请勿手动修改!请编辑相应的.h文件!
===========================================================================*/
// IWYU pragma: private, include "TEST.h"
#include "UObject/ObjectMacros.h"
#include "UObject/ScriptMacros.h"
PRAGMA_DISABLE_DEPRECATION_WARNINGS
#ifdef EXORCIST_TEST_generated_h
#error "TEST.generated.h 已经被包含,TEST.h 中缺少 '#pragma once'"
#endif
#define EXORCIST_TEST_generated_h
//后续省略.....
5. 新建一个HelloWorld函数
TEST.h
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "TEST.generated.h"
UCLASS()
class EXORCIST_API UTEST : public UBlueprintFunctionLibrary
{
GENERATED_BODY()
//测试函数打印HelloWorld
//使用UFUNCTION红标记,BlueprintCallable让UE反射系统能够反射成蓝图调用。
UFUNCTION(BlueprintCallable, Category = "TEST")
static void TESTFUNC();
};
6. 对应的函数实现输出HelloWorld
可以借助IDE生成对应函数定义。
TEST.cpp
#include "TEST.h"
void UTEST::TESTFUNC()
{
GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, TEXT("Hello World!"));
}
6. 编译,在关卡蓝图检验。
因为我们的函数中没有加入参数,所以对应生成的蓝图节点也没有输入输出节点。
7.运行查看成果!
参考链接
大佬 |
---|
知乎大钊 |
课程名 | 类型 | 链接 |
---|---|---|
2023最新版C++ | C++基础 | 链接 |
【Cherno C++】 | C++基础 | 链接 |
为游戏编程学习C++ | C++基础 | 链接 |
黑马程序员匠心之作 | C++教程 | 链接 |
字节跳动最新打造的C++教程 | C++基础 | 链接 |
Udemy宝藏数据结构与算法课 | C++算法 | 链接 |