目录
[蓝图中调用c++ actor](#蓝图中调用c++ actor)
MetahumancharacterHeiXi\MyActor.h
MetahumancharacterHeiXi\MyActor.cpp
蓝图中调用c++ actor
-
打开 Content Drawer
-
找到你这个 C++ 类:
MyActor -
右键 MyActor → Create Blueprint Class Based on MyActor
-
命名:
BP_MyActor
然后把BP_MyActor 拖进关卡,
然后:

c++创建类:
MetahumancharacterHeiXi\MyActor.h
cpp
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "Animation/AnimationAsset.h"
#include "Components/SkeletalMeshComponent.h"
#include "MyActor.generated.h"
UCLASS()
class METAHUMANCHARACTERHEIXI_API AMyActor : public AActor
{
GENERATED_BODY()
public:
// Sets default values for this actor's properties
AMyActor();
UPROPERTY(EditAnywhere, BlueprintReadWrite)
USkeletalMeshComponent* Body_comp;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
UAnimationAsset* TalkAnim;
UFUNCTION(BlueprintCallable, Category = "Talk")
void PlayTalkAnim(USkeletalMeshComponent* TargetMesh);
protected:
// Called when the game starts or when spawned
virtual void BeginPlay() override;
public:
// Called every frame
virtual void Tick(float DeltaTime) override;
};
MetahumancharacterHeiXi\MyActor.cpp
cpp
// Fill out your copyright notice in the Description page of Project Settings.
#include "MyActor.h"
#include "UObject/ConstructorHelpers.h"
// Sets default values
AMyActor::AMyActor()
{
// 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;
static ConstructorHelpers::FObjectFinder<UAnimationAsset> AnimObj(
TEXT("/Game/anim_new/talk03.talk03")
);
UE_LOG(LogTemp, Error, TEXT("load Game/anim_new/talk03.talk03 ok"));
if (AnimObj.Succeeded())
{
TalkAnim = AnimObj.Object;
}
if (!Body_comp)
{
// 找到蓝图里第一个 SkeletalMeshComponent
Body_comp = FindComponentByClass<USkeletalMeshComponent>();
if (!Body_comp)
{
UE_LOG(LogTemp, Warning, TEXT("找不到 BodyMesh!"));
}
}
UE_LOG(LogTemp, Error, TEXT("BodyMesh ok"));
}
void AMyActor::PlayTalkAnim(USkeletalMeshComponent* targetMesh)
{
UE_LOG(LogTemp, Error, TEXT("PlayTalkAnim 111"));
if (!targetMesh || !TalkAnim)
{
UE_LOG(LogTemp, Warning, TEXT("Body or TalkAnim is null"));
return;
}
UE_LOG(LogTemp, Error, TEXT("PlayTalkAnim 222"));
// 对应蓝图:Set Global Anim Rate Scale
targetMesh->GlobalAnimRateScale = 1.f;
// 必须切换到 Single Node
targetMesh->SetAnimationMode(EAnimationMode::AnimationSingleNode);
UE_LOG(LogTemp, Error, TEXT("PlayTalkAnim 333"));
// 对应蓝图:Play Animation
targetMesh->PlayAnimation(TalkAnim, true); // true = Looping
}
// Called when the game starts or when spawned
void AMyActor::BeginPlay()
{
Super::BeginPlay();
}
// Called every frame
void AMyActor::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
}