提示:本项目仅为个人练手项目,随笔记下一些自己觉得正确的要点,未经整理,不成体系,如有谬误,欢迎提出探讨。该项目中有很多地方不符合工程学,不适用于真正的项目开发!

  ok让我们开始吧,这大概是一个俯视角射击游戏,我打算尽量用cpp实现所有的逻辑(现在知道为什么不符合工程学了吧)。

  • 首先提一下我的学习和工作流程,这是我学习从零开始学习uecpp一周以来最大的收获了

1. 思考需要的功能。

2. 在蓝图中实现(这步非必须,作用是打个草稿,看看虚幻的框架如何)。

3. 在相对应的头文件中查找调用的function或者变量,看注释去运用。

  然后贴一个大佬的博客,看了感觉受益匪浅,非常牛逼 https://www.cnblogs.com/shiroe/p/14695535.html

  官方文档也可以看,作用和看源码差不多。

  • 下面是一些我对于某些函数和概念的理解

  我打算先从玩家的character开始,创建一个character的子类,然后把一些初始化的东西写进蓝图里

  一些简单的数值类的变量比如int32的初始化无需多言。

1. Component如何定义

  在头文件声明好了以后在构造函数中创建子类对象

  像这样

  GunActor = CreateDefaultSubobject<UChildActorComponent>("Gun");

  即可,对于这个UChildActorComponent类的各种函数,这里不多介绍,想了解的可以自己去Component/ChildActorComponent.h中看,大多数函数都是和蓝图的功能差不多

2. 我需要一个类,怎么办

  如果你需要在构造函数使用某个不是蓝图的资源,而你知道他的引用,那么你可以这样

 

1 static ConstructorHelpers::FObjectFinder<UStaticMesh> paddleMesh(TEXT("StaticMesh'/Game/Demo_Drone/SM/paddle.paddle'"));
2 if (paddleMesh.Succeeded())
3 {
4     paddle1->SetStaticMesh(paddleMesh.Object);
5 }

 

  如果是蓝图类,那么你有两种办法,不过写法也一样

static ConstructorHelpers::FClassFinder<UAnimInstance> AnimFile(TEXT("/Script/Engine.AnimBlueprint'/Game/Characters/Mannequins/Animations/ABP_Quinn.ABP_Quinn_C'"));

if(AnimFile.Succeeded())
{
    ACharacter::GetMesh()->SetAnimClass(AnimFile.Class);
}

  另一种方法差别仅在引用上,把最后的ABP_Quinn.ABP_Quinn_C改为ABP_Quinn也可以,差别不大,对吧

  如果你要你一个cpp的类,那更简单了,把你要的cpp的类的头文件带上

//需要的头文件
#include "Gun.h"

//构造函数或者哪些别的逻辑里
GunActor = CreateDefaultSubobject<UChildActorComponent>("Gun");//比如这里我加一个子Actor组件进来

GunActor -> SetChildActorClass(AGun::StaticClass());

  利用相应的头文件中的StaticClass()函数即可得到该cpp类

3. 一些小感悟

  引擎的源码很多都非常工程学,因此很多子类中常用的变量或者指针不能够直接访问,那么他们通过什么来访问捏?

  父类会提供函数来供子类访问这些变量或者指针,例如ACharacter::GetMesh(),我们可以通过这个去修改ACharacter类中的那个USkeletalmeshComponent。如果引擎后续更新中需要修改增删这些Componentd的代码,那么仅需要替换原来的函数的返回值即可。

参考文章:

https://www.cnblogs.com/shiroe/p/14691199.html

https://docs.unrealengine.com/5.2/en-US/