首先我们要写一个Actor,用它来管理一个静态网格资产
Actor的特征:能够被挂载组件(component)
- 在UE中,组件不是类,一个Actor对应一个类
- 坐标与旋转量是一个Scene Component组件,若不需要也可以不挂载
- 希望被渲染,加个静态网格组件
- 希望有骨骼动画,加个骨架网格物体组件
- 希望可以移动,可以在类中实现,也可以加个Movement组件来处理移动
- 总之,需要挂载组件的时候,才应该继承Actor类
载入一个静态网格资产
用于视觉呈现效果
static ConstructorHelpers::FObjectFinder<UStaticMesh>
CubeVisualAsset(TEXT("/Game/StarterContent/Shapes/Shape_Cube.Shape_Cube"));
载入一个测试碰撞的球体组件
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Components")
class USphereComponent* SphereComponent;
- 这些声明中的各个类型前面都冠以
class
关键字。这样,这些声明除了是变量声明之外,还是各自类的前向声明,从而确保各自的类会在头文件中被识别。下一个步骤中,我们会在CPP文件中为它们添加#include
。
此处papalqi大神解释是 前向引用声明,和上面一行没什么关系
就是说在这一行里,先声明有这个类USphereComponent
存在
然后声明了有这样一个变量,类型是这个类的指针
类的前向引用声明示例代码
#include <iostream>
using namespace std;
class A* wtf; //可以看到这里的wtf是类A的指针
A* wtf2; //可以看到这里的wtf2也是类A的指针
#include "A.h"
inline int A::max()
{
return a > b ? a : b;
}
int main()
{
A a(3, 5);
wtf = &a;
cout << a.max() << endl;
return 0;
}
其实就是把class A;
和A* wtf;
写到一起了
Actor的两个接口
游戏开始时或生成时调用
void AFloatingActor::BeginPlay()
逐帧调用
void AFloatingActor::Tick(float DeltaTime)
Actor继承关系
Actor
多人游戏中的Actor
Replicated
说明符在服务器上启用Actor的副本,以在变量值更改时,将该变量值复制到所有连接的客户端。ReplicatedUsing
也有同样的功能,但还能设置 RepNotify
函数,此函数将在客户端成功接收复制数据时触发。将基于此变量的更改,使用 OnRep_CurrentHealth
执行各个客户端的更新。
若已学到本节此处,那么以下应是对Actor施加伤害的流程:
-
外部Actor或函数对角色调用 CauseDamage,而角色又调用其 TakeDamage 函数。
-
TakeDamage 调用 SetCurrentHealth 以在服务器上更改玩家的当前生命值。
-
SetCurrentHealth 在服务器上调用 OnHealthUpdate,导致执行功能,响应玩家生命值的更改。
-
CurrentHealth 复制到所有已连接的客户端的角色副本。
-
各个客户端从服务器收到 CurrentHealth 的新值时,会调用 OnRep_CurrentHealth。
-
OnRep_CurrentHealth 调用 OnHealthUpdate,确保各个客户端以相同方式响应 CurrentHealth 的新值。
20220622 网格体资产引用
我创建了一个第三人称模板,
然后创建了一个自己的继承Charactor的C++类
我并没有在Character中给定骨骼网格体组件的资源路径。
但是项目中却实实在在的出现了一个骨骼网格体。
我尝试把自己写的Character直接拖入项目,发现并没有骨骼网格体出现。
我就思考有没有可能是出生点自己产生的
查看了出生点的参数之后,并没有骨骼网格体资源路径
那么就再思考是不是第三人称模板导致的
果然找到了
那么下一步就是思考,GameMode与骨骼网格体的联系,它们为什么会产生这样的关联。
GameMode是提供给世界设置的配置信息,里面有默认Pawn的选择,第三人称模板指定的默认Pawn就是这个。
查看引用树的小尝试
我复制一个Character,ThirdPersonMPCharacter会自动连接到新的Character模型
我把这个新的Character删掉,ThirdPersonMPCharacter又自动连接回去原来的BP_ThirdPersonCharacter
这个问题之后研究一下文章来源:https://www.toymoban.com/news/detail-415780.html
20220627 跟进上面的问题
AThirdPersonMPGameMode::AThirdPersonMPGameMode()
{
// set default pawn class to our Blueprinted character
static ConstructorHelpers::FClassFinder<APawn> PlayerPawnBPClass(TEXT("/Game/ThirdPerson/Blueprints/ASADVAVA"));
if (PlayerPawnBPClass.Class != NULL)
{
DefaultPawnClass = PlayerPawnBPClass.Class;
}
}
我把GameMode中的路径 指向了一个新的Character,
再次运行,果然模型变成了这个新Character的模型,
把新Character的模型删掉,再运行,报错
说明不会自动重新连接回原来的BP_ThirdPersonCharacter了文章来源地址https://www.toymoban.com/news/detail-415780.html
到了这里,关于【UE5 C++基础 02】网格体API基础的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!