LearnCppUnreal
学习 UE4 C++ Demo 笔记
1. UE4 工程在使用 Git 时可以忽略的文件
- .vs/
- Binaries/
- Intermediate/
- Saved/
- Content/StarterContent/
2. UE4 C++中几个重要的宏
代码:
UPROPERTY(EditAnywhere, BlueprintReadWrite) //可以有很多参数,详情可以去官网API查找
ATriggerVolume * TriggerArea = nullptr;
解释:
UPROPERTY(EditAnywhere)
可以把代码里的变量暴露到引擎里,可以动态设置
BlueprintReadWrite
C++里的变量只有加了这个属性蓝图才可以访问和修改,还有一个 BlueprintReadOnly
UFUNCTION(BlueprintCallable, Category="XXX")
解释:
UFUNCTION(BlueprintCallable)
可以把C++的函数暴露给蓝图调用
Category
函数的话在蓝图中使用时会看到“XXX”的一个分页为自己的函数,具体可以尝试下看看,文字描述有点难以想象,不过用到了自然就知道了
DECLARE_DYNAMIC_MULTICAST_DELEGATE("XXXX");
解释:
DECLARE_DYNAMIC_MULTICAST_DELEGATE(XXX)
创建了一个委托事件可以用来和蓝图交互使用,详细下面有说
3. 用到的几个头文件
#include "GameFramework/Actor.h"
#include "Engine/World.h" // 获取世界的头文件
#include "DrawDebugHelpers.h" // 绘制线的头文件
#include "Engine/TriggerVolume.h" // 碰撞的头文件
不在多做赘述, 感觉没有什么意义, API官网可以搜
4. 用到的几个 API
GetWorld(); // 获取当前世界
GetFirstPlayerController(); // 获取世界中第一个玩家的Controller
GetPlayerViewPoint(); // 获取玩家的朝向和旋转
xyz.Vector(); // 取这个向量的一个朝向单位向量
DrawDebugLine(); // 画一条线
LineTraceSingleByObjectType(); // 发射一个射线,根据Object的type
HitResult.GetActor(); // 获取射线碰撞的Actor
TriggerArea->IsOverlappingActor(); // 检测区域中是否有Actor
PlayerController->GetPawn(); // 从PlayerController中获取主角Pawn
不在多做赘述, 感觉没有什么意义, API官网可以搜
5. 几个新认识的结构体和类
FVector //向量 X Y Z
FRotator //旋转 Roll Pich Yall
FHitResult //射线的返回值 .....
FCollisionObjectQueryParams // 射线检测的碰撞类型
FCollisionQueryParams // 射线的一些通用参数 碰撞Tag, 碰撞精细度, 无视哪些碰撞
ECollisionChannel // 碰撞类型的枚举
EInputEvent //输入事件的类型 按下抬起等等
UPhysicsHandleComponent //物理手臂组件,可以快速的实现举起物品等等
UInputComponent // 输入事件接受组件 可以绑定是输入事件
6. VS2017配合 ReSharper的关键快捷键
Ctrl+E 快速跳转到别的文件 (貌似只支持最近关闭的文件,未测试大型项目是否可以快速跳转)
Ctrl + Shift + F7 查找鼠标选中的函数名变量名 鼠标必须选中一个东西
Ctrl + Tab 快速选择当前激活的文件切换
Ctrl + Alt + F 整理当前代码
Ctrl + B 代码跳转 可以从使用的地方跳转至定义的地方 (函数,变量或Class) 或从定义的地方跳转至使用的地方 (可能是多个,需要选择)
Alt + Enter ReSharper 的万能神器,可以对代码提出你可能需要的修改
7. UE4C++特别需要注意事项
指针变量使用时一定记得判断不为nullptr在进行使用,不判断后果很严重,直接回让引擎 Crash
8. C++与蓝图相互调用的几个方式
(1.) C++ 调用蓝图
使用CallFunctionByNameWithArguments进行调用,具体使用方法见官方文档API
使用DECLARE_DYNAMIC_MULTICAST_DELEGATE进行委托事件的注册并在想要调用的地方进行调用,蓝图来对该事件进行监听
(2.) 两者调用区别
CallFunctionByNameWithArguments 根据函数名字进行调用,耦合大,并且有局限性,必须在本组件内进行Call,意思就是你C++的代码想调用蓝图里的函数就必须要把函数写在继承当前C++的蓝图中
DECLARE_DYNAMIC_MULTICAST_DELEGATE 没有对函数名的耦合,也没有局限说必须要继承与当前C++来监听当前事件,可以在任意地方拿到c++的对象就可以对该事件监听,C++中可以在任意想要调用的地方进行调用和传参 (推荐)
(3.) 蓝图调用C++
首先在C++里把函数写好
加上UFUNCTION的宏里面传入BlueprintCallable
蓝图拿到对C++的Class的对象即可对函数进行调用