|
@@ -1,7 +1,7 @@
|
|
|
<!--
|
|
<!--
|
|
|
* @Author: lc
|
|
* @Author: lc
|
|
|
* @Date: 2021-09-03 21:41:18
|
|
* @Date: 2021-09-03 21:41:18
|
|
|
- * @LastEditTime: 2021-09-29 18:10:00
|
|
|
|
|
|
|
+ * @LastEditTime: 2021-12-15 22:13:10
|
|
|
* @LastEditors: Please set LastEditors
|
|
* @LastEditors: Please set LastEditors
|
|
|
* @Description: 虚幻学习
|
|
* @Description: 虚幻学习
|
|
|
* @FilePath: D:\Projects\markdown\虚幻.md
|
|
* @FilePath: D:\Projects\markdown\虚幻.md
|
|
@@ -33,13 +33,13 @@
|
|
|
|
|
|
|
|
- 虚幻支持的文件内容
|
|
- 虚幻支持的文件内容
|
|
|
|
|
|
|
|
-| 分类 | 类型 |
|
|
|
|
|
-| --- | --- |
|
|
|
|
|
-| 3D | fbx/obj |
|
|
|
|
|
|
|
+| 分类 | 类型 |
|
|
|
|
|
+| ---- | -------------------------------- |
|
|
|
|
|
+| 3D | fbx/obj |
|
|
|
| 贴图 | png/jpge/bmp/tga/dds/exr/psd/hdr |
|
|
| 贴图 | png/jpge/bmp/tga/dds/exr/psd/hdr |
|
|
|
-| 声音 | wav |
|
|
|
|
|
-| 字体 | ttf/otf |
|
|
|
|
|
-| 视频 | mov/mp4/wmv/avi |
|
|
|
|
|
|
|
+| 声音 | wav |
|
|
|
|
|
+| 字体 | ttf/otf |
|
|
|
|
|
+| 视频 | mov/mp4/wmv/avi |
|
|
|
|
|
|
|
|
> 常规使用的文件格式一般都支持
|
|
> 常规使用的文件格式一般都支持
|
|
|
|
|
|
|
@@ -698,22 +698,22 @@ With Tag 通过给定的标签将场景中与之匹配的对象进行查找,
|
|
|
|
|
|
|
|
> 查看数组的API方法的小提示
|
|
> 查看数组的API方法的小提示
|
|
|
|
|
|
|
|
-| 方法名 | 作用 |
|
|
|
|
|
-| --- | --- |
|
|
|
|
|
-| Add | 添加单个数据到数组末尾 |
|
|
|
|
|
-| Add Unique | 如果数组中没有与数据相同的值,则加入到数组中,否则不加入 |
|
|
|
|
|
-| Append Array | 将另一个数组添加到数组中(不考虑重复性) |
|
|
|
|
|
-| Clear | 清空数组并清除内存空间 |
|
|
|
|
|
-| Contains | 检查数组中是否存在给定值 |
|
|
|
|
|
-| Find | 查找数组中是否包含某一个元素,包含返回对应位置索引index,不包含返回-1 |
|
|
|
|
|
-| Insert | 插入值到数组中(指定位置) |
|
|
|
|
|
-| Last Index | 获得最后元素的值 |
|
|
|
|
|
-| Length | 获得数组长度,常用来判断获取index是否合法 |
|
|
|
|
|
-| Remove Index | 提供一个有效下标index,删除该index |
|
|
|
|
|
-| Remove Item | 提供一个数组中包含的数据,删除该值 |
|
|
|
|
|
-| Resize | 设定数组长度,超过填充默认值,小于删除多余值 |
|
|
|
|
|
-| Shuffle | 随机数组中的值(洗牌) |
|
|
|
|
|
-| Swap | 将数组中已有的两个位置的值进行交换 |
|
|
|
|
|
|
|
+| 方法名 | 作用 |
|
|
|
|
|
+| ------------ | --------------------------------------------------------------------- |
|
|
|
|
|
+| Add | 添加单个数据到数组末尾 |
|
|
|
|
|
+| Add Unique | 如果数组中没有与数据相同的值,则加入到数组中,否则不加入 |
|
|
|
|
|
+| Append Array | 将另一个数组添加到数组中(不考虑重复性) |
|
|
|
|
|
+| Clear | 清空数组并清除内存空间 |
|
|
|
|
|
+| Contains | 检查数组中是否存在给定值 |
|
|
|
|
|
+| Find | 查找数组中是否包含某一个元素,包含返回对应位置索引index,不包含返回-1 |
|
|
|
|
|
+| Insert | 插入值到数组中(指定位置) |
|
|
|
|
|
+| Last Index | 获得最后元素的值 |
|
|
|
|
|
+| Length | 获得数组长度,常用来判断获取index是否合法 |
|
|
|
|
|
+| Remove Index | 提供一个有效下标index,删除该index |
|
|
|
|
|
+| Remove Item | 提供一个数组中包含的数据,删除该值 |
|
|
|
|
|
+| Resize | 设定数组长度,超过填充默认值,小于删除多余值 |
|
|
|
|
|
+| Shuffle | 随机数组中的值(洗牌) |
|
|
|
|
|
+| Swap | 将数组中已有的两个位置的值进行交换 |
|
|
|
|
|
|
|
|
**使用`Make Array`可以在运行过程中动态创建数组**
|
|
**使用`Make Array`可以在运行过程中动态创建数组**
|
|
|
|
|
|
|
@@ -1225,16 +1225,16 @@ K-DOP是包围体的一种,是K离散导向多面体(K discrete oriented polyt
|
|
|
|
|
|
|
|

|
|

|
|
|
|
|
|
|
|
-| 位置 | 功能 |
|
|
|
|
|
-| --- | --- |
|
|
|
|
|
-| Component | 功能、能力 |
|
|
|
|
|
-| Actor | 个体本身的逻辑 |
|
|
|
|
|
-| APawn-APlayerController-APlayerState | 主角肉体-灵魂-状态 |
|
|
|
|
|
-| APawn-AAIController-APlayerState | AI肉体-灵魂-状态 |
|
|
|
|
|
-| AAIController-BehaviorTree-Blackboard | AI灵魂-行为树-数据 |
|
|
|
|
|
-| AGameMode-AGametate | 游戏规则-游戏状态 |
|
|
|
|
|
-| UGameInstance-USaveSame | 全局游戏实例-游戏存档 |
|
|
|
|
|
-| USubsystem | 游戏逻辑组件 |
|
|
|
|
|
|
|
+| 位置 | 功能 |
|
|
|
|
|
+| ------------------------------------- | --------------------- |
|
|
|
|
|
+| Component | 功能、能力 |
|
|
|
|
|
+| Actor | 个体本身的逻辑 |
|
|
|
|
|
+| APawn-APlayerController-APlayerState | 主角肉体-灵魂-状态 |
|
|
|
|
|
+| APawn-AAIController-APlayerState | AI肉体-灵魂-状态 |
|
|
|
|
|
+| AAIController-BehaviorTree-Blackboard | AI灵魂-行为树-数据 |
|
|
|
|
|
+| AGameMode-AGametate | 游戏规则-游戏状态 |
|
|
|
|
|
+| UGameInstance-USaveSame | 全局游戏实例-游戏存档 |
|
|
|
|
|
+| USubsystem | 游戏逻辑组件 |
|
|
|
|
|
|
|
|
- 输入事件的处理
|
|
- 输入事件的处理
|
|
|
|
|
|
|
@@ -1709,19 +1709,19 @@ HUD默认自身是不接受键盘输入事件的,本身HUD就不应直接响
|
|
|
2. Games项目工程文件(主要编写逻辑文件),代码需要在此工程中编写。虚幻中采用了编译模块方式进行引擎构建,所以对于引擎来说,编写的内容只是一个模块,模块会被动态编译为库文件,加载到引擎中使用。Target.cs文件就是模块配置文件
|
|
2. Games项目工程文件(主要编写逻辑文件),代码需要在此工程中编写。虚幻中采用了编译模块方式进行引擎构建,所以对于引擎来说,编写的内容只是一个模块,模块会被动态编译为库文件,加载到引擎中使用。Target.cs文件就是模块配置文件
|
|
|
3. Visualizers虚幻4.21加入的文件,Vs配置器配置文件
|
|
3. Visualizers虚幻4.21加入的文件,Vs配置器配置文件
|
|
|
|
|
|
|
|
-| 状态 | Engine | Game | 其他 |
|
|
|
|
|
-| --- | --- | --- | --- |
|
|
|
|
|
-| Debug(调试) | Debug | Debug | 必须在编译器上加-debug参数才能反射查看代码更改 |
|
|
|
|
|
-| DebugGame(调试游戏) | Release | Debug | 适合只调试游戏代码 |
|
|
|
|
|
-| Development(开发) | Release | Release | 运行编辑器发射查看代码更改 |
|
|
|
|
|
-| Shipping(发行) | Release | Release | 无控制台命令,统计数据和性能分析 |
|
|
|
|
|
-| Test(测试) | Release | Release | 启用了一些控制台命令,统计数据和性能分析 |
|
|
|
|
|
-
|
|
|
|
|
-| 目标 | |
|
|
|
|
|
-| --- | --- |
|
|
|
|
|
-| 空白 | 不带编辑器的一个独立可执行版本,需要提前打包烘焙内容资源 |
|
|
|
|
|
-| Editor(编辑器) | 直接在编辑器里打开游戏项目 |
|
|
|
|
|
-| Client(客户端) | 多人联机项目,生成客户端版本,需要提供<Game>Client.Target.cs文件 |
|
|
|
|
|
|
|
+| 状态 | Engine | Game | 其他 |
|
|
|
|
|
+| --------------------- | ------- | ------- | ---------------------------------------------- |
|
|
|
|
|
+| Debug(调试) | Debug | Debug | 必须在编译器上加-debug参数才能反射查看代码更改 |
|
|
|
|
|
+| DebugGame(调试游戏) | Release | Debug | 适合只调试游戏代码 |
|
|
|
|
|
+| Development(开发) | Release | Release | 运行编辑器发射查看代码更改 |
|
|
|
|
|
+| Shipping(发行) | Release | Release | 无控制台命令,统计数据和性能分析 |
|
|
|
|
|
+| Test(测试) | Release | Release | 启用了一些控制台命令,统计数据和性能分析 |
|
|
|
|
|
+
|
|
|
|
|
+| 目标 | |
|
|
|
|
|
+| ----------------- | ---------------------------------------------------------------- |
|
|
|
|
|
+| 空白 | 不带编辑器的一个独立可执行版本,需要提前打包烘焙内容资源 |
|
|
|
|
|
+| Editor(编辑器) | 直接在编辑器里打开游戏项目 |
|
|
|
|
|
+| Client(客户端) | 多人联机项目,生成客户端版本,需要提供<Game>Client.Target.cs文件 |
|
|
|
| Service(服务器) | 有人联机项目,生成服务器版本,需要提供<Game>Server.Target.cs文件 |
|
|
| Service(服务器) | 有人联机项目,生成服务器版本,需要提供<Game>Server.Target.cs文件 |
|
|
|
|
|
|
|
|
### 命名规则
|
|
### 命名规则
|
|
@@ -1739,21 +1739,21 @@ HUD默认自身是不接受键盘输入事件的,本身HUD就不应直接响
|
|
|
11. 再编辑器里和C#里,类型名是去掉前缀过的
|
|
11. 再编辑器里和C#里,类型名是去掉前缀过的
|
|
|
12. UHT再工作的时候需要提供正确的前缀,所以是约定也是规则
|
|
12. UHT再工作的时候需要提供正确的前缀,所以是约定也是规则
|
|
|
|
|
|
|
|
-| 类型 | 前缀 | 说明 |
|
|
|
|
|
-| --- | --- | --- |
|
|
|
|
|
-| Level/Map | L_ | 关卡 |
|
|
|
|
|
-| Buleprint | BP_ | 常规蓝图 |
|
|
|
|
|
-| Material | M_ | 材质 |
|
|
|
|
|
-| StaticMesh | S_ | 静态网格 |
|
|
|
|
|
-| Skeletal Mesh | SK_ | 骨骼网络 |
|
|
|
|
|
-| Texture | T_ | 纹理 |
|
|
|
|
|
-| Particle System | PS_ | 粒子系统 |
|
|
|
|
|
|
|
+| 类型 | 前缀 | 说明 |
|
|
|
|
|
+| ---------------- | ---- | -------- |
|
|
|
|
|
+| Level/Map | L_ | 关卡 |
|
|
|
|
|
+| Buleprint | BP_ | 常规蓝图 |
|
|
|
|
|
+| Material | M_ | 材质 |
|
|
|
|
|
+| StaticMesh | S_ | 静态网格 |
|
|
|
|
|
+| Skeletal Mesh | SK_ | 骨骼网络 |
|
|
|
|
|
+| Texture | T_ | 纹理 |
|
|
|
|
|
+| Particle System | PS_ | 粒子系统 |
|
|
|
| Widget Blueprint | WBP_ | 组件蓝图 |
|
|
| Widget Blueprint | WBP_ | 组件蓝图 |
|
|
|
-| ... | ... | ... |
|
|
|
|
|
|
|
+| ... | ... | ... |
|
|
|
|
|
|
|
|
[更多命名规则](https://github.com/uejoy/ue4-style-guide)
|
|
[更多命名规则](https://github.com/uejoy/ue4-style-guide)
|
|
|
|
|
|
|
|
-### 创建Actor
|
|
|
|
|
|
|
+### Actor
|
|
|
|
|
|
|
|
```cpp
|
|
```cpp
|
|
|
void ADemoGameModeBase::BeginPlay()
|
|
void ADemoGameModeBase::BeginPlay()
|
|
@@ -1784,6 +1784,7 @@ Actor的创建分为三种方式,三种方式创建的Actor生命流程有细
|
|
|
|
|
|
|
|
> 组件是在BeginPlay方法之前构建的
|
|
> 组件是在BeginPlay方法之前构建的
|
|
|
|
|
|
|
|
|
|
+<<<<<<< Updated upstream
|
|
|
<!--
|
|
<!--
|
|
|
* @Version:
|
|
* @Version:
|
|
|
* @Autor: LC
|
|
* @Autor: LC
|
|
@@ -1911,3 +1912,123 @@ GEngine->AddOnScreenDebugMessage(-1, 5, FColor::Red, n1.ToString());
|
|
|
#### FText
|
|
#### FText
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+=======
|
|
|
|
|
+`Destroy()`,调用自身的`Destroy`进行强制消亡操作
|
|
|
|
|
+
|
|
|
|
|
+```cpp
|
|
|
|
|
+/**
|
|
|
|
|
+ * bNetForce 是否强制网络同步删除
|
|
|
|
|
+ * bShouldModifyLevel 主要是用来控制先删除actor再修改关卡,还是先修改关卡再删除actor,默认是true即先修改关卡(修改关卡指吧actor移除出场景)
|
|
|
|
|
+ */
|
|
|
|
|
+bool AActor::Destroy( bool bNetForce, bool bShouldModifyLevel )
|
|
|
|
|
+{
|
|
|
|
|
+ // It's already pending kill or in DestroyActor(), no need to beat the corpse
|
|
|
|
|
+ if (!IsPendingKillPending())
|
|
|
|
|
+ {
|
|
|
|
|
+ UWorld* World = GetWorld();
|
|
|
|
|
+ if (World)
|
|
|
|
|
+ {
|
|
|
|
|
+ World->DestroyActor( this, bNetForce, bShouldModifyLevel );
|
|
|
|
|
+ }
|
|
|
|
|
+ else
|
|
|
|
|
+ {
|
|
|
|
|
+ UE_LOG(LogSpawn, Warning, TEXT("Destroying %s, which doesn't have a valid world pointer"), *GetPathName());
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return IsPendingKillPending();
|
|
|
|
|
+}
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+> bNetForce 是否强制网络同步删除
|
|
|
|
|
+> bShouldModifyLevel 主要是用来控制先删除actor在修改关卡,还是先修改关卡在删除actor,默认是true即先修改关卡(修改关卡指吧actor移除出场景)
|
|
|
|
|
+
|
|
|
|
|
+执行`Destroy()`只是标记该对象在场景中不存在,并不是从内存中删除。所有对象都是托管的,所以并不是说调用了之后对象就从内存删除
|
|
|
|
|
+
|
|
|
|
|
+```cpp
|
|
|
|
|
+// InLifespan 延迟删除时间 单位秒
|
|
|
|
|
+void AActor::SetLifeSpan( float InLifespan )
|
|
|
|
|
+{
|
|
|
|
|
+ // Store the new value
|
|
|
|
|
+ InitialLifeSpan = InLifespan;
|
|
|
|
|
+ // Initialize a timer for the actors lifespan if there is one. Otherwise clear any existing timer
|
|
|
|
|
+ if ((GetLocalRole() == ROLE_Authority || GetTearOff()) && !IsPendingKill())
|
|
|
|
|
+ {
|
|
|
|
|
+ if( InLifespan > 0.0f)
|
|
|
|
|
+ {
|
|
|
|
|
+ GetWorldTimerManager().SetTimer( TimerHandle_LifeSpanExpired, this, &AActor::LifeSpanExpired, InLifespan );
|
|
|
|
|
+ }
|
|
|
|
|
+ else
|
|
|
|
|
+ {
|
|
|
|
|
+ GetWorldTimerManager().ClearTimer( TimerHandle_LifeSpanExpired );
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+> 设置延迟删除
|
|
|
|
|
+
|
|
|
|
|
+```cpp
|
|
|
|
|
+// 虚函数
|
|
|
|
|
+virtual void Destroyed();
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+> 当对象被删除时(非内存删除)进行回调函数
|
|
|
|
|
+> 子类重写overide该函数,来完成自定义事件
|
|
|
|
|
+
|
|
|
|
|
+```cpp
|
|
|
|
|
+virtual void EndPlay(const EEndPlayReason::Type EndPlayReason);
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+> 对象被彻底清除时回调,回调会进行删除类型通知,子类重写之后定义自己需要做的事即可
|
|
|
|
|
+
|
|
|
|
|
+- 删除类型介绍
|
|
|
|
|
+ - Destroyed 当前actor或是component彻底被删除时(内存中)
|
|
|
|
|
+ - LevelTrasition 关卡切换时删除回调(非关卡流)
|
|
|
|
|
+ - EndPlayInEditor 编辑器关闭时,回调通知
|
|
|
|
|
+ - RemovedFromWorld 关卡流切换被释放时调用
|
|
|
|
|
+ - Quit 游戏推出时被删除回调
|
|
|
|
|
+
|
|
|
|
|
+### 打印输出
|
|
|
|
|
+
|
|
|
|
|
+- **屏幕日志输出**
|
|
|
|
|
+
|
|
|
|
|
+借助全局变量GEngine子还真调用函数`AddOnScreenDebugMessage`即可完成输出
|
|
|
|
|
+
|
|
|
|
|
+```cpp
|
|
|
|
|
+void UEngine::AddOnScreenDebugMessage(
|
|
|
|
|
+ uint64 Key,
|
|
|
|
|
+ float TimeToDisplay,
|
|
|
|
|
+ FColor DisplayColor,
|
|
|
|
|
+ const FString& DebugMessage,
|
|
|
|
|
+ bool bNewerOnTop,
|
|
|
|
|
+ const FVector2D& TextScale);
|
|
|
|
|
+
|
|
|
|
|
+// 该代码会直接在屏幕上输出一个红色的test文本
|
|
|
|
|
+GEngine->AddOnScreenDebugMessage(-1, 2.0f, FColor::Red, TEXT("test"));
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+消息从上到下(一般而言)key值从0开始,依次增加。如果key值为-1则添加文本消息,如果不为-1就修改对应key值的文本消息
|
|
|
|
|
+
|
|
|
|
|
+> 如果key为-1,则添加新的信息,不会覆盖旧的信息
|
|
|
|
|
+> 如果key部位-1,则更新现有信息,该方法效率更高
|
|
|
|
|
+> bNewerOnTop当key为-1时有效,直接添加到队列最上层
|
|
|
|
|
+
|
|
|
|
|
+```cpp
|
|
|
|
|
+// If we don't have a platform-specific define for the TEXT macro, define it now.
|
|
|
|
|
+#if !defined(TEXT) && !UE_BUILD_DOCS
|
|
|
|
|
+ #if PLATFORM_TCHAR_IS_CHAR16
|
|
|
|
|
+ #define TEXT_PASTE(x) u ## x
|
|
|
|
|
+ #else
|
|
|
|
|
+ #define TEXT_PASTE(x) L ## x
|
|
|
|
|
+ #endif
|
|
|
|
|
+ #define TEXT(x) TEXT_PASTE(x)
|
|
|
|
|
+#endif
|
|
|
|
|
+
|
|
|
|
|
+TEXT("test")
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+这里的`TEXT`是虚幻中用来构建非对象型字符串的关键宏,构建结果是与平台无关的宽字符串,借助对象`FString`带参构造函数`TCHAR`类型指针来构建`FString`对象字符串
|
|
|
|
|
+0330
|
|
|
|
|
+- **控制台日志输出**
|
|
|
|
|
+>>>>>>> Stashed changes
|