UE4使用一些简单的控制符.实现移动组件的效果

   日期:2020-09-27     浏览:108    评论:0    
核心提示:本篇文章是我学习UE4的笔记学习地址如下:http://www.sikiedu.com/my/course/518参考地址如下:官方文档因本人才疏学浅,如有错误之处,还请见谅文章目录第一步第二步一些别的限定词的作用代码如下:.h.cpp第一步我们还是要打开代码修改我们设置的蓝图类的代码.h// Fill out your copyright notice in the Description page of Project Settings.#pragma once#inclu

本篇文章是我学习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;

如果这篇文章对你有张帮助的话,可以用你高贵的小手给我点一个免费的赞吗

相信我,你也能变成光.

如果你有任何建议,或者是发现了我的错误,欢迎评论留言指出.

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服