本篇文章是我学习UE4的笔记
学习地址如下:
http://www.sikiedu.com/my/course/518
参考地址如下:
官方文档
因本人才疏学浅,如有错误之处,还请见谅
文章目录
-
- 第一步
- 第二步
- 一些别的限定词的作用
- 代码如下:
-
- .h
- .cpp
- 新的.h
- 新的.cpp
- 代码如下:
第一步
我们还是要打开代码
修改我们设置的蓝图类的代码
.h
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "MyActor.generated.h"
UCLASS()
class SIKI_PROJECT_API AMyActor : public AActor
{
GENERATED_BODY()
public:
// Sets default values for this actor's properties
AMyActor();
//Visble就是设置可见的.
UPROPERTY(VisibleAnywhere,Category="My Actor Components")
UStaticMeshComponent* StaticMesh;
//US就是刚刚设置的那个组件,我们这里设置了一个这个组件的指针.
//Instance就是实例的意思,Only就是只允许.就是只允许在实例上
UPROPERTY(EditInstanceOnly, Category = "My Actor Properties | Vector")
FVector InitLocation;
protected:
//开始的重写函数
// Called when the game starts or when spawned
virtual void BeginPlay() override;
public:
// Called every frame
//每一帧调用的函数
virtual void Tick(float DeltaTime) override;
};
.cpp
// Fill out your copyright notice in the Description page of Project Settings.
#include "MyActor.h"
// Sets default values
AMyActor::AMyActor()
{
//Tick是不是每帧都调用
// Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = true;
//创建了一个对象来调用我们设置的指针.
//Create的那个函数是一个模板函数和vector差不多
StaticMesh
= CreateDefaultSubobject<UStaticMeshComponent>(TEXT("MyStaticMesh"));
InitLocation = FVector(0.0f);
}
// Called when the game starts or when spawned
void AMyActor::BeginPlay()
{
Super::BeginPlay();
//Fvector就是一个空间的向量.如果你想仔细查看的话,就按下F12就OK了
///0.0f就是吧这个0.0分别复制给x,y,z
// 这样的话,不管开始的地方,在哪里.开始游戏之后,都会回到0.0f
SetActorLocation(InitLocation);
}
// Called every frame
void AMyActor::Tick(float DeltaTime)
{
//通过Super调用了父类里面的方法
Super::Tick(DeltaTime);
}
第二步
我们找到蓝图列创建的实例.
实例上,是有我们创建的分类的属性的.
但是我们打开蓝图类就没有.
因为我们设置的关键字就只在实例上生效.
一些别的限定词的作用
EditDefaultsOnly 就是只能在编辑页面,就是材质的编辑页面里面.设置.实例不行
VisibleInstanceOnly 只能设置可视化
代码如下:
.h
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "MyActor.generated.h"
UCLASS()
class SIKI_PROJECT_API AMyActor : public AActor
{
GENERATED_BODY()
public:
// Sets default values for this actor's properties
AMyActor();
//Visble就是设置可见的.
UPROPERTY(VisibleAnywhere,Category="My Actor Components")
UStaticMeshComponent* StaticMesh;
//US就是刚刚设置的那个组件,我们这里设置了一个这个组件的指针.
//Instance就是实例的意思,Only就是只允许.就是只允许在实例上
UPROPERTY(EditInstanceOnly, Category = "My Actor Properties | Vector")
FVector InitLocation;
UPROPERTY(VisibleInstanceOnly, Category = "My Actor Properties | Vector")
FVector PlacedLocation; //就是一个放置的地方
UPROPERTY(EditDefaultsOnly,Category="My Actor Properties|Vector ")
bool bGotoInitLocation; //是否要去我们设置的位置
protected:
//开始的重写函数
// Called when the game starts or when spawned
virtual void BeginPlay() override;
public:
// Called every frame
//每一帧调用的函数
virtual void Tick(float DeltaTime) override;
};
.cpp
// Fill out your copyright notice in the Description page of Project Settings.
#include "MyActor.h"
// Sets default values
AMyActor::AMyActor()
{
//Tick是不是每帧都调用
// Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = true;
//创建了一个对象来调用我们设置的指针.
//Create的那个函数是一个模板函数和vector差不多
StaticMesh
= CreateDefaultSubobject<UStaticMeshComponent>(TEXT("MyStaticMesh"));
InitLocation = FVector(0.0f);
PlacedLocation = FVector(0.0f);
bGotoInitLocation = false; //默认让这个小球不改变位置
}
// Called when the game starts or when spawned
void AMyActor::BeginPlay()
{
Super::BeginPlay();
//Fvector就是一个空间的向量.如果你想仔细查看的话,就按下F12就OK了
///0.0f就是吧这个0.0分别复制给x,y,z
// 这样的话,不管开始的地方,在哪里.开始游戏之后,都会回到0.0f
//获取到PlaceLocation里面.就是保存下一开始的值.
PlacedLocation = GetActorLocation();
if (bGotoInitLocation)
{
//只有当bGotoInitLocation为真的时候,我们才改变InitLocation
//的位置.
SetActorLocation(InitLocation);
}
}
// Called every frame
void AMyActor::Tick(float DeltaTime)
{
//通过Super调用了父类里面的方法
Super::Tick(DeltaTime);
}
然后再VS里面的设置
这个就是那个逻辑的语句.
然后我们在加几个控制符.
今天学的比昨天明白了一点.简单的总结一下控制符.
VisibleAnywhere 字面意思,就是不管在实例还是在原型中都可以看到这个属性
EditInstanceOnly 字面意思, Instance 实例 Edit编辑.
就是只能在实例中编辑.
VisibleInstanceOnly 只能在实例中可以看到这个属性
VisibleDefaultsOnly 只能在原型中看到这个属性
EditAnywhere 最常用的属性,就是不管在实例还是在原型中,都可以修改这个属性.
//Visble就是设置可见的.
UPROPERTY(VisibleAnywhere,Category="My Actor Components")
UStaticMeshComponent* StaticMesh;
//US就是刚刚设置的那个组件,我们这里设置了一个这个组件的指针.
//Instance就是实例的意思,Only就是只允许.就是只允许在实例上
UPROPERTY(EditInstanceOnly, Category = "My Actor Properties | Vector")
FVector InitLocation;
UPROPERTY(VisibleInstanceOnly, Category = "My Actor Properties | Vector")
FVector PlacedLocation; //就是一个放置的地方
UPROPERTY(EditDefaultsOnly,Category="My Actor Properties|Vector ")
bool bGotoInitLocation; //是否要去我们设置的位置
UPROPERTY(VisibleDefaultsOnly, Category = "My Actor Properties|Vector ")
FVector WorldOrigin; //就是用来做参考的世界原点坐标系
//EditAnywhere 就是不管在实例还是原型都可以修改
UPROPERTY(EditAnywhere, Category = "My Actor Properties|Vector ")
FVector TickLocationOffset;
UPROPERTY(EditAnywhere, Category = "My Actor Properties|Vector ")
bool bShouldMove;
然后我们设置不移动.设置一个TickLoationOffset 的值.
在点击开始,组件就会自己动起来乐.
完整的代码如下:
新的.h
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "MyActor.generated.h"
UCLASS()
class SIKI_PROJECT_API AMyActor : public AActor
{
GENERATED_BODY()
public:
// Sets default values for this actor's properties
AMyActor();
//Visble就是设置可见的.
UPROPERTY(VisibleAnywhere,Category="My Actor Components")
UStaticMeshComponent* StaticMesh;
//US就是刚刚设置的那个组件,我们这里设置了一个这个组件的指针.
//Instance就是实例的意思,Only就是只允许.就是只允许在实例上
UPROPERTY(EditInstanceOnly, Category = "My Actor Properties | Vector")
FVector InitLocation;
UPROPERTY(VisibleInstanceOnly, Category = "My Actor Properties | Vector")
FVector PlacedLocation; //就是一个放置的地方
UPROPERTY(EditDefaultsOnly,Category="My Actor Properties|Vector ")
bool bGotoInitLocation; //是否要去我们设置的位置
UPROPERTY(VisibleDefaultsOnly, Category = "My Actor Properties|Vector ")
FVector WorldOrigin; //就是用来做参考的世界原点坐标系
//EditAnywhere 就是不管在实例还是原型都可以修改
UPROPERTY(EditAnywhere, Category = "My Actor Properties|Vector ")
FVector TickLocationOffset;
UPROPERTY(EditAnywhere, Category = "My Actor Properties|Vector ")
bool bShouldMove;
protected:
//开始的重写函数
// Called when the game starts or when spawned
virtual void BeginPlay() override;
public:
// Called every frame
//每一帧调用的函数
virtual void Tick(float DeltaTime) override;
};
新的.cpp
// Fill out your copyright notice in the Description page of Project Settings.
#include "MyActor.h"
// Sets default values
AMyActor::AMyActor()
{
//Tick是不是每帧都调用
// Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = true;
//创建了一个对象来调用我们设置的指针.
//Create的那个函数是一个模板函数和vector差不多
StaticMesh
= CreateDefaultSubobject<UStaticMeshComponent>(TEXT("MyStaticMesh"));
InitLocation = FVector(0.0f);
PlacedLocation = FVector(0.0f);
bGotoInitLocation = false; //默认让这个小球不改变位置
WorldOrigin = FVector(0.0f);
TickLocationOffset = FVector(0.0f);
bShouldMove = false;
}
// Called when the game starts or when spawned
void AMyActor::BeginPlay()
{
Super::BeginPlay();
//Fvector就是一个空间的向量.如果你想仔细查看的话,就按下F12就OK了
///0.0f就是吧这个0.0分别复制给x,y,z
// 这样的话,不管开始的地方,在哪里.开始游戏之后,都会回到0.0f
//获取到PlaceLocation里面.就是保存下一开始的值.
PlacedLocation = GetActorLocation();
if (bGotoInitLocation)
{
//只有当bGotoInitLocation为真的时候,我们才改变InitLocation
//的位置.
SetActorLocation(InitLocation);
}
}
// Called every frame
void AMyActor::Tick(float DeltaTime)
{
//通过Super调用了父类里面的方法
Super::Tick(DeltaTime);
if (bShouldMove) {
AddActorLocalOffset(TickLocationOffset);
}
}
还有一点.就是指针是不可以乱编辑的.
这点懂的都懂(好吧,我并不懂)-只是直到指针不可以乱编辑
然后就是.我们还可以手动的给TickLocationOffset限制范围.
代码如下:
//EditAnywhere 就是不管在实例还是原型都可以修改
//ClampMax就是手动输入最大值的意思.ClampMax就是手动输入最小值的意思.
//UI MAx和Min 就是通过UI改变的最大最小值.
UPROPERTY(EditAnywhere, Category = "My Actor Properties|Vector ",
meta=(ClampMin=-5.0f,ClampMax=5.0f,UIMin=-5.0f,UIMax=5.0f))
FVector TickLocationOffset;
如果这篇文章对你有张帮助的话,可以用你高贵的小手给我点一个免费的赞吗
相信我,你也能变成光.
如果你有任何建议,或者是发现了我的错误,欢迎评论留言指出.