UE4 C++入门

基础内容

Posted by AIaimuti on April 23, 2020

reflection反射机制

就是UE4的各种宏,将程序内容反射到UE4蓝图中 .generated.h里面有反射机制的相关实现, Uneal Header Tool(UHT)会建立一些反射以及代码与蓝图之间的联系。

Garage Collection垃圾回收机制

UE4的机制是被引用的指针不能释放,没有引用的指针可以释放

Object和actor的区别

Object不能挂载组件,而actor可以 创建Pulic和Private文件夹时,头文件出现红线,可以采用如下形式: #include “..\Public\MyObject.h” 包含相对路径,就可以识别

在蓝图中使用UObject

UCLASS(Blueprintable) C++类可继承为蓝图

Actor

construct object from class 为某个类创建一个实例 window–>Developer Tools–>Output Log 开启输出日志 内容管理器里向下的小箭头Import可以导入资源

场景空间

Shift + End 将底部中心对齐到地面 transform里的单位都是厘米 前是红色X轴 上是蓝色Z轴 右是绿色Y轴 FVector设置一个浮点数,就三个轴都是这个 UPROPERTY() edit: EditAnywhere 在任何地方都可以看到和编辑 EditInstanceOnly 只在实例窗口可以看到和编辑 蓝图里看不到不能编辑 EditDefaultsOnly 只能在蓝图窗口里编辑 实例窗口看不到不能编辑 Visible: VisibleAnywhere 任何地方可见 VisibleInstanceOnly 实例中 VisibleDefaultsOnly 蓝图中可见

条件编译指令 #if #else #endif

#if #else #endif 可以用来写分支,没选中的代码会变灰

碰撞相关

UE_LOG

测试输出 UE_LOG(LogTemp, Warning, TEXT("Warning!"));

AddActorLocalOffset

AddActorLocalOffset 向Actor的局部坐标添加位置增量

void AddActorLocalOffset
(
    FVector DeltaLocation,
    bool bSweep,
    FHitResult * OutSweepHitResult,
    ETeleportType Teleport
)

DeltaLocation: FVector变量,Actor局部坐标的增加量 bSweep: 检测Actor运动过程是否发生碰撞重叠 OutSweepHitResult: 碰撞结果,有一系列参数,如碰撞位置 bTeleport: 是否传送物理状态

类似的,还有AddActorWorldOffset 向Actor的世界坐标添加位置增量

AddActorLocalRotation

AddActorLocalRotation 向Actor的局部坐标添加旋转量量

void AddActorLocalRotation
(
    const FQuat & DeltaRotation,
    bool bSweep,
    FHitResult * OutSweepHitResult,
    ETeleportType Teleport
)

DeltaLocation: FVector变量,Actor局部坐标的增加量 bSweep: 检测Actor运动过程是否发生碰撞或重叠 OutSweepHitResult: 碰撞结果,有一系列参数,如碰撞位置 bTeleport: 是否传送物理状态

类似的,还有AddActorWorldRotation 向Actor的世界坐标添加旋转量

信息输出改进

输出碰撞信息:

//直接使用浮点数输出,小数点位数较多
UE_LOG(LogTemp, Warning,
    TEXT("%%f Hit@: x=%f,y=%f,z=%f"),
    HitResult.Location.X, HitResult.Location.Y, HitResult.Location.Z);
//采用字符串输出,小数点后两位
UE_LOG(LogTemp, Warning,
    TEXT("%%s Hit@: x=%s,y=%s,z=%s"),
    *FString::SanitizeFloat(HitResult.Location.X),
    *FString::SanitizeFloat(HitResult.Location.Y),
    *FString::SanitizeFloat(HitResult.Location.Z);

1左边的符号 可以调出cmd进行调控

世界坐标和局部坐标

FVector与FRotator

FVector 位置三维坐标 FRotator 旋转三维坐标

FRotator旋转属性对应

沿着那个轴,哪个轴就不动, 世界坐标系中红色的是Roll,沿着X轴即前后方向旋转,一般来说FPS游戏不用动这个角度 绿色的是pitch,沿着Y轴即左右方向旋转,FPS游戏中可以向上向下瞄准 蓝色的是yaw值,沿着Z轴即上下方向旋转,FPS游戏中可以左右扫射 FORCEINLINE FRotator::FRotator( float InPitch, float InYaw, float InRoll ) FRotator中第一个是沿着Y轴旋转的角度Pitch,第二参数是沿着z轴旋转的角度Roll(FPS很少用),第三个参数是沿着x轴旋转的角度Yaw。

力和扭矩

Force和Torque Force是按一个方向移动的力 Torque是按一个方向旋转的力

如果使用了->来访问类的成员,就需要添加相应的头文件 Physics–>Constrains(约束)–>lock Position/lock Rotation 锁定指定位置X、Y、Z坐标/ 锁定旋转的X、Y、Z值

Sequence 顺序 其实是协程

数学函数

游戏弹道算法–>数学函数插件? 正弦函数

//正弦函数配置
float InitialX = FMath::FRand() * 500;
float InitialY = FMath::FRandRange(100,500);
float InitialZ = 0;
SetActorLocation(FVector(InitialX, InitialY, InitialZ));

初识Pawn(棋子)类

USceneComponent 场景根组件,一般物体都有(很有必要添加,不然后续附着别的组件可能有问题) GamemodeBase–>继承蓝图–>details–>Classes–>Default Pawn Class可以选取我们想默认生成的Pawn 然后再世界场景中选取我们自定义的游戏模式