基于C++代码的UE4学习(三十八)——加载SkeletalMesh与静态加载动画蓝图

 

加载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 }

 

使用动态加载蓝图再次编译,点击开始游戏就会看见模型与动画资源都已经成功加载,也不会出现内存错误。

 

 

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是用UE4 C++编写基于USaveGame的异步加载关卡的基本步骤: 1. 创建一个继承自AActor的C++类,这个类将被用来加载关卡,同时也将用来保存和加载游戏数据。 2. 在.h文件中,添加一个函数声明,用于异步加载关卡。函数原型为:`void LoadLevelAsync(const FString& LevelName);` 3. 在.cpp文件中,实现`LoadLevelAsync`函数。首先,使用`FStreamableManager`类的`LoadLevelAsync`函数来异步加载关卡。这个函数需要两个参数:要加载的关卡名称和一个回调函数,在关卡加载完成后自动调用。 4. 在回调函数中,将加载的关卡传递给一个由你创建的函数,该函数将关卡添加到世界中。同时,保存游戏数据。 5. 在你的游戏中,调用`LoadLevelAsync`函数来异步加载关卡。同时,在加载关卡前,先加载并读取保存的游戏数据。 下面是一个简单的代码示例: ```cpp // MyLevelLoader.h #pragma once #include "CoreMinimal.h" #include "GameFramework/Actor.h" #include "MyLevelLoader.generated.h" UCLASS() class MYGAME_API AMyLevelLoader : public AActor { GENERATED_BODY() public: AMyLevelLoader(); UFUNCTION(BlueprintCallable, Category = "Level Loading") void LoadLevelAsync(const FString& LevelName); private: void OnLevelLoaded(ULevel* LoadedLevel); void LoadGameData(); void SaveGameData(); FStreamableManager LevelLoader; USaveGame* SaveGame; }; // MyLevelLoader.cpp #include "MyLevelLoader.h" #include "Kismet/GameplayStatics.h" AMyLevelLoader::AMyLevelLoader() { PrimaryActorTick.bCanEverTick = false; } void AMyLevelLoader::LoadLevelAsync(const FString& LevelName) { LoadGameData(); LevelLoader.LoadLevelAsync(LevelName, FStreamableDelegate::CreateUObject(this, &AMyLevelLoader::OnLevelLoaded)); } void AMyLevelLoader::OnLevelLoaded(ULevel* LoadedLevel) { if (LoadedLevel) { UWorld* World = GetWorld(); if (World) { World->AddLevelToWorld(LoadedLevel); SaveGameData(); } } } void AMyLevelLoader::LoadGameData() { // Load game data from file SaveGame = Cast<USaveGame>(UGameplayStatics::LoadGameFromSlot("MySaveGame", 0)); if (!SaveGame) { // Create new save game object if it doesn't exist SaveGame = Cast<USaveGame>(UGameplayStatics::CreateSaveGameObject(USaveGame::StaticClass())); } } void AMyLevelLoader::SaveGameData() { // Save game data to file UGameplayStatics::SaveGameToSlot(SaveGame, "MySaveGame", 0); } ``` 在你的游戏中,可以创建AMyLevelLoader实例并调用`LoadLevelAsync`来异步加载关卡。例如: ```cpp AMyLevelLoader* LevelLoader = GetWorld()->SpawnActor<AMyLevelLoader>(); LevelLoader->LoadLevelAsync("MyLevel"); ``` 这里,我们异步加载了名为"MyLevel"的关卡。同时,在加载关卡前,我们先加载并读取保存的游戏数据,并在关卡加载完成后保存游戏数据。 希望这可以帮助你开始编写基于USaveGame的异步加载关卡的代码

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值