【UE5 C++基础 02】网格体API基础

首先我们要写一个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

这个问题之后研究一下

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了

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>