1,什么是组件?
继承于Uobject的为了给actor以及其他在场景中显示出来的类增加新的功能的一个东西
2,可以自己创建一个蓝图,然后将蓝图拖到场景中,也可以直接在c++ class中将蓝图拖到场景中
3,创建一个组件:
UStaticMeshComponent * StaticMesh(组件在蓝图中的名字) = CreateDefaultSubobject<UStaticMeshComponent(组件名)>(TEXT("MyStaticMesh(组件标志)"));
4,设置Actor的位置:
SetActorLocation(Vectorxxx);
5,设置偏移量
//第二个参数:去检查移动的轨迹上是否有可以发生碰撞的物体
AddActorLocalOffset(Vectorxxx, true);
6,宏
meta=(ClampMin=-5.0f, ClampMax = 5.0f, UIMin = -5.0f, UIMax = 5.0f)
ClampMin=-5.0f, ClampMax = 5.0f表示输入范围:-5~5
UIMin = -5.0f, UIMax = 5.0f表示鼠标拖动范围:-5~5
7,如何查找函数的头文件,用法等
(1)搜索Unreal doc,点击进入,在搜索框中填入函数,回车
(2)点击c++ API
ps:AddActorLocalOffset这个函数,ue5中木有
8,如何添加头文件
(1)在.cpp文件中添加
(2)在.h文件中添加
要添加在 #include "MyActor.generated.h" 之前
9,如何穿透一个物体(如何不与一个物体发生碰撞)
碰撞是相互的,我们只要使一个物体忽略掉另一个物体的碰撞,碰撞就不会 发生
比如:
物体A: 碰撞 --> 碰撞预设 --> 改为custom
对象类型改为physicsbody(任选一个就行)
物体B: 碰撞 --> 碰撞预设 --> 改为custom
碰撞响应 --> 物体响应 --> 忽略的那竖行勾上physicsbody(物体A的对象类型)
10,如何在不开启模拟重力的情况下,产生碰撞,并且获取碰撞的坐标
FHitResult HitResult; /*第二个参数: * https://www.bilibili.com/video/BV1Ce4y1e7PE?p=35&vd_source=9861d52a3c015d8d0859fa02af9dd6bd *检查移动的轨迹上是否有可以发生碰撞的物体,我测试了, *在设置为TRUE的情况下,无论有没有模拟物理都一样,在物体碰撞之后,就会停住 *如果设置为false,没有模拟物理的情况下,那么就不会发生碰撞 * 有模拟物理的情况下,碰撞了,但是会擦着另一个物体表面继续运动 */ //TickLocationOffset是一个偏移量,类型是vector AddActorLocalOffset(TickLocationOffset, true, &HitResult); UE_LOG(LogTemp, Warning, TEXT("X: %f, Y: %f, Z: %f"), HitResult.Location.X, HitResult.Location.Y, HitResult.Location.Z);
11,创建根组件,并且将静态网格组件附加到其上
RootComponent = CreateDefaultSubobject<USceneComponent>(TEXT("RootCompnent")); StaticMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("MyStaticMesh")); StaticMesh->SetupAttachment(GetRootComponent());
12,在tick函数移动
按键映射函数只是修改值,真正调用移动函数的是tick
这样是为了不同帧率的玩家,在一秒钟移动的位置相同,具体看13条
//只是修改值,真正调用移动函数的是tick void AMyPawn::MoveForward(float Value) { Velocity.X = FMath::Clamp(Value, -1.0f, 1.0f) * MaxSpeed; } void AMyPawn::MoveRight(float Value) { Velocity.Y = FMath::Clamp(Value, -1.0f, 1.0f) * MaxSpeed; }
void AMyPawn::Tick(float DeltaTime) { Super::Tick(DeltaTime); AddActorLocalOffset(Velocity * DeltaTime, true); }
13,为什么移动的时候,要乘deltatime
14,更改附着关系之后,蓝图没有更新怎么办
蓝图右击--->资产操作---->重新加载
15,player start与game mode的作用
玩家出生点PlayerStart 继承于AActor,因此可以被放置到场景中。它的作用就是标记玩家出生的位置,游戏开始后,程序会查找玩家出生点的位置,并生成一个GameMode中配置的APawn,放置到该处,如果关卡里没有PlayerStart ,那么系统会在世界坐标(0,0,0)出产生一个APawn。
PlayerStart
这个设计的初衷其实就是为了让关卡设计师和角色设计师的工作解耦合
16,如何添加映射?
(1),添加轴映射
(2)添加映射函数
pawn.h文件中添加 void MoveForward(float Value); void MoveRight(float Value); pawn.cpp文件中添加 void AMyPawn::MoveForward(float Value) { Velocity.X = FMath::Clamp(Value, -1.0f, 1.0f) * MaxSpeed; } void AMyPawn::MoveRight(float Value) { Velocity.Y = FMath::Clamp(Value, -1.0f, 1.0f) * MaxSpeed; }
(3)注册玩家
AMyPawn::AMyPawn() { // Set this pawn to call Tick() every frame. You can turn this off to improve performance if you don't need it. PrimaryActorTick.bCanEverTick = true; AutoPossessPlayer = EAutoReceiveInput::Player0; MaxSpeed = 100.0f; Velocity = FVector::ZeroVector; }
(4)绑定映射函数
// Called to bind functionality to input void AMyPawn::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent) { Super::SetupPlayerInputComponent(PlayerInputComponent); //玩家没有按下对应的键的时候,也会每一帧都调用以下映射函数 PlayerInputComponent->BindAxis(TEXT("MoveForward"), this, &AMyPawn::MoveForward); PlayerInputComponent->BindAxis(TEXT("MoveRight"), this, &AMyPawn::MoveRight); }
17,对象的创建和销毁
UE4对象的创建与销毁(UObject,Actor,ActorComponent)_ue4 删除一个uobject_张悟基的博客-CSDN博客
18,创建一个线程: