UE4蓝图:自由控制Actor移动

之前一直是简单的输出,不免有些乏味,这篇开始就可以操作物体的移动.我们利用关卡蓝图让Box跟着我们的操作去动起来.首先我们创建好一个默认的关卡,然后拖动出一个Box.

这里写图片描述

然后我们在内容区域,右键点击Material,重命名后双击它.进入材质编辑器.

这里写图片描述

进入材质编辑器后,右键输入vector parameter,获得VectorParameter节点,进行如下设置用来改变Box的基础颜色.

这里写图片描述

白线连接后,保存.这就是所谓的材质编程.

这里写图片描述

我们可以在初学者内容找到材质文件夹,然后双击一个材质进去看看.
这里写图片描述

这里写图片描述

然后我们左键点击Box的一个面,然后点击Shift+B,用来选中所有的面.然后把刚刚通过材质编辑器编辑好的材质,拖动进去.

这里写图片描述

然后我们需要在这个Box的属性面板中去修改它.把它修改为静态网格物体.

这里写图片描述

还要把它设置为可移动的,因为默认是静态的话,还是不能被移动的.
这里写图片描述

然后我们就可以打开关卡蓝图去设置了.可以看到关卡蓝图中默认有两个事件节点,Event BeginPlay是指关卡运行起来的时候执行的节点,而Event Tick是指每帧调用的事件节点,一般来说每秒60帧是人眼最适合的帧数.Event Tick

这里写图片描述

我们可以利用Event Tick节点,定时每一秒输出一次.

这里写图片描述

编译后执行.

这里写图片描述

我们回到关卡中,左键选中Box,然后到关卡蓝图中右键,发现可以获得选中的Box的引用.

这里写图片描述

接下来从蓝点左键拖拽出去到空的地方释放,然后输出add actor local.获得AddActorLoaclRotation节点,它是根据当前的情况进行旋转.把X,Y,Z三个方向的数值设置为1,1,1.

这里写图片描述

可以看到这个Box在不停的旋转.

这里写图片描述

下面我们要自己按键去控制Box的移动.右键找到Input目录下,Keyboard Events,中找到Up,Down,Left,Right四个按键节点.分别对应键盘上的上下左右四个键.

这里写图片描述

然后四个方向键分别去连接一个移动Box的节点,修改好具体的偏移量.

这里写图片描述

编译后运行就可以发现每次按下一个方向键的时候,都会偏移一点距离,但是一直按住方向键,却不能一直移动,而只是移动一次.所以这样很麻烦,也很不友好.所以我们可以在帧事件中去判断,用户是否按下了某个键,然后去执行相应的节点.
关闭右上角的情景关联,输入is input key,获得Is Input Key Down节点,这个节点用于判断指定的键是否被按下.返回一个bool值.

这里写图片描述

然后我们输入get player control获得Get Player Control节点,用来获得控制器.然后连接节点.判断是否按下了Up键,如果按下了则向前移动.

这里写图片描述

然后我们可以复制这些节点.可以选中要复制的节点,然后把鼠标移动你要复制到的地方,按下Ctrl+W.就可以发现成功复制出来了.

完成四个节点,编译后执行,发现按下一个键后,可以一直执行某一个节点.

这里写图片描述

这里有个问题,当你通过Event Tick节点判断某个键是否被按下的时候,最好不要与已有的按键事件节点冲突.
当已经有按键N的事件时,再从Event Tick去执行按下N的节点.

这里写图片描述

可以发现先打印的是按键N的事件节点,然后才是Event Tick的帧事件节点.
这里写图片描述

  • 5
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是一个简单的UE4 C++生成Actor的例子,假设你已经创建了一个新的C++项目: 1. 创建一个新的C++类,继承自AActor。例如,我们创建一个名为MyActor的类: ```cpp UCLASS() class MYPROJECT_API AMyActor : public AActor { GENERATED_BODY() public: AMyActor(); virtual void BeginPlay() override; virtual void Tick(float DeltaTime) override; }; ``` 2. 在MyActor.cpp文件中实现构造函数和BeginPlay函数: ```cpp AMyActor::AMyActor() { // 设置Actor的根组件 RootComponent = CreateDefaultSubobject<USceneComponent>(TEXT("RootComponent")); // 创建一个静态网格组件 UStaticMeshComponent* MeshComponent = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("MeshComponent")); MeshComponent->SetupAttachment(RootComponent); // 加载静态网格 constructorHelpers::FObjectFinder<UStaticMesh> Mesh(TEXT("/Game/StarterContent/Shapes/Shape_Cube.Shape_Cube")); if (Mesh.Succeeded()) { MeshComponent->SetStaticMesh(Mesh.Object); } } void AMyActor::BeginPlay() { Super::BeginPlay(); // 在控制台输出Actor位置 UE_LOG(LogTemp, Warning, TEXT("MyActor is at %s"), *GetActorLocation().ToString()); } ``` 3. 在MyActor.cpp文件中实现Tick函数,使Actor在每帧旋转: ```cpp void AMyActor::Tick(float DeltaTime) { Super::Tick(DeltaTime); // 每帧旋转Actor FRotator Rotation = GetActorRotation(); Rotation.Yaw += DeltaTime * 100.f; SetActorRotation(Rotation); } ``` 4. 在MyActor.h文件中添加头文件和构造函数声明: ```cpp #pragma once #include "CoreMinimal.h" #include "GameFramework/Actor.h" #include "Engine/StaticMesh.h" #include "Components/StaticMeshComponent.h" #include "MyActor.generated.h" UCLASS() class MYPROJECT_API AMyActor : public AActor { GENERATED_BODY() public: AMyActor(); virtual void BeginPlay() override; virtual void Tick(float DeltaTime) override; private: UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Components", meta = (AllowPrivateAccess = "true")) UStaticMeshComponent* MeshComponent; }; ``` 5. 在你的场景中添加一个MyActor,例如在GameMode的BeginPlay函数中: ```cpp void AMyProjectGameModeBase::BeginPlay() { Super::BeginPlay(); // 创建一个新的MyActor AMyActor* MyActor = GetWorld()->SpawnActor<AMyActor>(AMyActor::StaticClass(), FVector(0.f, 0.f, 0.f), FRotator(0.f, 0.f, 0.f)); } ``` 6. 运行游戏,你应该可以看到一个旋转的立方体Actor。 希望这个例子能够帮助你理解如何使用UE4 C++生成Actor
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值