C++生成AI以及AI默认Animation,AI播放Montage,AIController控制移动的实现

-首先说明,我的AI都是用c++写的,而且AI都是随着游戏进程自动生成的,我的UE4是4.17版本(版本对于默认Animation有影响,后面会提示)!!
-需要提前在蓝图中写好SkeletalMesh以及Montage以及Animation等内容,然后通过c++调用

1.在蓝图中生成一个Character类和一个Controller类,在c++中重新加载,然后在Character的.h中声明组件,变量等

    FVector TargetLocation; //设置移动终点

    UPROPERTY(VisibleAnyWhere, BlueprintReadonly, Category = Mesh)
        class USkeletalMeshComponent *MeshCom; //从蓝图中选择SkeletalMesh

    UPROPERTY(VisibleAnyWhere, BlueprintReadonly, Category = Mesh)
        class UAnimMontage *YourMontage; //从蓝图中选择Montage

    UPROPERTY(EditAnywhere)
        TSubclassOf<class UAnimInstance> BlueprintVar;  //从蓝图中选择默认Animation蓝图

2.完善c++类,先添加头文件

#include "Components/CapsuleComponent.h"
#include "Components/SkeletalMeshComponent.h"
#include "GameFramework/CharacterMovementComponent.h"
#include "UObject/ConstructorHelpers.h"
#include "Engine/CollisionProfile.h"
#include "Engine/World.h"
#include "YouAIController.h"//你的AIController
#include "Tasks/AITask_MoveTo.h"
#include "Animation/AnimMontage.h"

3.构造函数,碰撞类型的相关设置在TraceForObjects和碰撞中提到过,接下来直接使用:

    //初始化CapsuleComponent的大小
    GetCapsuleComponent()->InitCapsuleSize(105.f, 156.0f);  
    //设置CapsuleComponent的碰撞类型,这个碰撞类型是我自己定义的,也可以用现有的碰撞类型
    GetCapsuleComponent()->BodyInstance.SetCollisionProfileName("MyCollisionType");

    /*添加SkeletalMesh相关内容*/
    //找到蓝图中的SkeletalMesh,路径可以通过“Copy Reference”拷贝
    static ConstructorHelpers::FObjectFinder<USkeletalMesh> MeshComAssert(TEXT("/YouPath/YouSkeletalMeshName.YouSkeletalMeshName"));
    //给Character添加SkeletalMesh组件
    MeshCom = CreateDefaultSubobject<USkeletalMeshComponent>(TEXT("Mesh0"));
    //给组件赋值
    MeshCom->SetSkeletalMesh(MeshComAssert.Object);
    //挂在CapsuleComponent上
    MeshCom->SetupAttachment(GetCapsuleComponent());

    GetCharacterMovement()->MaxWalkSpeed = 80;//设置最大移动速度

    /*添加默认Animation相关内容,我的UE4是4.17版本,这个实现方法对于不同的版本有好多,我的版本用这种方法不会报错*/
    //一定要记得路径最后加“_C”
    static ConstructorHelpers::FObjectFinder<UAnimBlueprintGeneratedClass> WalkInstance(TEXT("Animation'/YourPath/YouAnimation.YouAnimation_C'"));
    //设置默认AnimClass
    MeshCom->AnimClass = WalkInstance.Object;

    /*添加Montage相关内容*/
    //找到蓝图中的Montage,路径可以通过“Copy Reference”拷贝”
    static ConstructorHelpers::FObjectFinder<UAnimMontage> YourMontageName(TEXT("/YourPath/MontageName.MontageName"));
    YourMontage= YourMontageName.Object;

    //设置AIController
    AutoPossessAI = EAutoPossessAI::Spawned;
    AIControllerClass = AYouAIController::StaticClass();
}

4.相关函数实现

①AI移动,由AIController控制

    AYouAIController * Con = Cast(GetController());
    Con->MoveToLocation(TargetLocation);//TargetLocation在使用之前自行赋值

②AI播放Montage

    //播放动画
    if (YourMontage!= NULL)
    {
        UAnimInstance* AnimInstance = MeshCom->GetAnimInstance();
        if (AnimInstance != NULL)
        {
            AnimInstance->Montage_Play(YourMontage, 1.f);//第二个参数为播放时间
        }
    }

你可能感兴趣的:(ue4)