您的位置:首页 > 编程语言 > C语言/C++

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

2017-12-04 17:41 776 查看
-首先说明,我的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<AYouAIController>(GetController());
Con->MoveToLocation(TargetLocation);//TargetLocation在使用之前自行赋值


②AI播放Montage

//播放动画
if (YourMontage!= NULL)
{
UAnimInstance* AnimInstance = MeshCom->GetAnimInstance();
if (AnimInstance != NULL)
{
AnimInstance->Montage_Play(YourMontage, 1.f);//第二个参数为播放时间
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ai ue4
相关文章推荐