加载SkeletalMesh需要在Enemy类中定义一个SkeletalMeshComponent
由于Enemy类是继承自ACharacter类的,所以SkeletalMesh找到的办法是通过FindComponentByClass<T>();
并没有重新声明一个新的。
1 skeletal = this->FindComponentByClass<USkeletalMeshComponent>();
2 if (skeletal) {
3 auto assetSkeletal = ConstructorHelpers::FObjectFinder<USkeletalMesh>(TEXT("SkeletalMesh'/Game/Mannequin/Character/Mesh/SK_Mannequin.SK_Mannequin'"));
4 if (assetSkeletal.Succeeded()) {
5 skeletal->SetSkeletalMesh(assetSkeletal.Object);
6 skeletal->SetRelativeLocation(FVector(0, 0, -95));
7 skeletal->SetRelativeRotation(FRotator(0, -90, 0));
8 }
9 }
10 AIControllerClass = AMyAIController::StaticClass();
11
12
13 auto assetTree = ConstructorHelpers::FObjectFinder<UBehaviorTree>(TEXT("BehaviorTree'/Game/Asset/myTree.myTree'"));
14
15
16 if (assetTree.Succeeded()) {
17 Tree = assetTree.Object;
18 }
19
20 skeletal->SetAnimationMode(EAnimationMode::AnimationBlueprint);
静态加载动画蓝图
静态加载动画蓝图是会报错的,但是在编译的时候是成功的,等再次启动工程就会出问题。
1 //the wrong way!!!!!!! Animation Blueprint cannot load like this way
2 auto assetAaim = ConstructorHelpers::FClassFinder<UAnimInstance>(TEXT("AnimBlueprint'/Game/Mannequin/Animations/ThirdPerson_AnimBP.ThirdPerson_AnimBP_C'"));
3 if (assetAaim.Succeeded()) {
4
5 skeletal->SetAnimInstanceClass(assetAaim.Class);
6 }
加载类型为UAnimInstance,而不是UAnimBlueprint,需要注意。因为是蓝图类,在资源后需要加上“_C”,否则无法加载成功。
最后通过SetAnimInstanceClass(UClass*)加载动画蓝图类,编译成功。但是不建议这样做,会引起内存异常。建议动态加载。
1 void AEnemy::BeginPlay()
2 {
3 Super::BeginPlay();
4 UClass* Anima = LoadClass<UAnimInstance>(NULL,TEXT("AnimBlueprint'/Game/Mannequin/Animations/ThirdPerson_AnimBP.ThirdPerson_AnimBP_C'"));
5 skeletal->SetAnimInstanceClass(Anima);
6
7 //Binding Delegate
8 Sense->OnSeePawn.Add(SightDelegate); //让AI具备视力,视觉回调
9 Sense->OnHearNoise.Add(HearDelegate); //让AI具备听力,听觉回调
10 }
使用动态加载蓝图再次编译,点击开始游戏就会看见模型与动画资源都已经成功加载,也不会出现内存错误。