目录
蓝图中调用c++ actor
c++创建类:
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
// 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
// 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); }