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