阿赵UE引擎C++编程学习笔记——查找和控制Actor

  大家好,我是阿赵。
  在使用Unity引擎的时候,经常会用到的一个功能是通过GameObject.Find去查找场景里面的对象。这次变成在UE引擎里面做同样的事情,这篇文章主要做的事情有2个,第一是从场景里面找到特定的Actor,第二件事是控制Actor的Transform。

一、 蓝图方式

1、查找Actor

  蓝图中查找Actor的节点有很多:
[image1]

1.通过类名查找场景中的Actor

  使用GetActorOfClass节点,可以查找场景里面第一个匹配的Actor。在class项搜索自己想要的蓝图的类名:
[image2]
  如果想查找全部指定类名的Actor,可以用GetAllActorsOfClass,这样返回的是一个数组。

  使用GetAllActorsWithInterface节点,可以找到包含某个接口的所有Actor
[image3]

3.通过标签查找Actor

  使用GetAllActorsWithTag,可以找到指定了某个标签的所有Actor。
标签的指定,在细节面板可以指定:
[image4]

2、 控制Actor的坐标

1. 获取和设置坐标

  获得Actor后,可以用GetActorLocation获得Actor的坐标,然后再通过SetActorLocation重新设置坐标:
[image5]
  其他的属性比如旋转或者缩放同理。

2. 结果判空

  这里有一个问题,通过GetActor系列方法查找场景中的Actor时,是会存在找不到的情况,所以要对查找的结果判空。
  在蓝图里面对一个Actor判空,比较诡异,是通过一个!=(不等于)节点,来判空的。把结果连接到不等于,然后再把输出连接到condition上。

[image6]

二、 C++方式

1、 不指定类型获取所有的Actor

  通过获得某个指定的world和level,可以获得这个level上面的所有的actor列表。然后如果需要过滤自己想要的actor,可以在遍历actor列表的时候,判断条件,比如我下面是判断了actor的名字,通过GetName方法可以获得actor的名字,然后筛选。

TArray<AActor*> FoundActors = GetWorld()->GetLevel(0)->Actors;
UE_LOG(LogTemp, Display, TEXT("%d"), FoundActors.Num());
if (FoundActors.Num() > 0)
{
	for (int i = 0;i<FoundActors.Num();i++)
	{
		AActor* actor = FoundActors[i];
		if (actor != nullptr)
		{
			FString fName = actor->GetName();
			UE_LOG(LogTemp, Display, TEXT("%s"), *fName);
			if (fName.Contains(TEXT("TestBallBP")))
			{
				actor->SetActorLocation(actor->GetActorLocation() + FVector(0, 0, 2));
			}
		}
	}
}

2、 指定获取Actor

  和蓝图对应的方法,C++这边也有,通过类名、接口和标签获取Actor

UGameplayStatics::GetAllActorsOfClass
UGameplayStatics::GetAllActorsWithInterface
UGameplayStatics::GetAllActorsWithTag

  比如通过类名获取actor,上面的代码就可以修改成这样:

FString path = TEXT("/Game/BP/TestBallBP.TestBallBP_C");
UClass* bpVar = LoadClass<AActor>(nullptr, *path);
TArray<AActor*> FoundActors;
UGameplayStatics::GetAllActorsOfClass(GetWorld(), bpVar, FoundActors);
if (FoundActors.Num() > 0)
{
	AActor* ball = FoundActors[0];
	ball->SetActorLocation(ball->GetActorLocation() + FVector(0, 0, 2));
}

设置Transform的方法,有以下几个,可以设置坐标、旋转、缩放:

SetActorLocation
SetActorRotation
SetActorScale3D
  • 10
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值