六一的部落格


关关难过关关过,前路漫漫亦灿灿。



Level Preloading


说明

在主菜单选择关卡, 点击 Start Game 后也许会出现程序静止的情况, 这是因为在加载关卡

解决方法有以下几种:

  1. 异步加载
  2. 关卡流送 Level Streaming
  3. 加载关卡前播放加载动画

    加载动画结束后载入关卡

API导航

所有动画结束都会触发该函数

1virtual void OnAnimationFinished_Implementation(const UWidgetAnimation* Animation);

同样也有OnAnimationStarted_Implementation


添加载入动画

  1. 添加载入动画

    protected

    ShootThemUp: Menu/UI/STUMenuWidget.h
    1UPROPERTY(meta = (BindWidgetAnim), Transient)
    2UWidgetAnimation *LoadAnimation;
  2. 点击 StartGame 按钮时播放
     1void USTUMenuWidget::OnStartGame()
     2{
     3    PlayAnimation(LoadAnimation);
     4
     5    /*
     6    const FName LevelName = "DefaultMap";
     7    UGameplayStatics::OpenLevel(GetWorld(), LevelName);
     8    */
     9
    10    /*
    11    if (!GetWorld()) return;
    12
    13    const auto STUGameInstance = GetWorld()->GetGameInstance<USTUGameInstance>();
    14    if (!STUGameInstance) return;
    15
    16    // if (STUGameInstance->GetStartupLevelName().IsNone())
    17    if (STUGameInstance->GetStartupLevel().LevelName.IsNone())
    18    {
    19        UE_LOG(LogSTUMenuWidget, Error, TEXT("StartupLevelName is none"));
    20        return;
    21    }
    22
    23
    24    // UGameplayStatics::OpenLevel(GetWorld(), STUGameInstance->GetStartupLevelName());
    25    UGameplayStatics::OpenLevel(GetWorld(), STUGameInstance->GetStartupLevel().LevelName);
    26    */
    27}
  3. 动画播放结束时载入关卡

    protected

    ShootThemUp: Menu/UI/STUMenuWidget.h
    1virtual void OnAnimationFinished_Implementation(const UWidgetAnimation* Animation) override;
    ShootThemUp: Menu/UI/STUMenuWidget.cpp
     1void USTUMenuWidget::OnAnimationFinished_Implementation(const UWidgetAnimation *Animation)
     2{
     3    if (Animation != LoadAnimation) return;
     4
     5    if (!GetWorld()) return;
     6
     7    const auto STUGameInstance = GetWorld()->GetGameInstance<USTUGameInstance>();
     8    if (!STUGameInstance) return;
     9
    10    if (STUGameInstance->GetStartupLevel().LevelName.IsNone())
    11    {
    12        UE_LOG(LogSTUMenuWidget, Error, TEXT("StartupLevelName is none"));
    13        return;
    14    }
    15
    16    UGameplayStatics::OpenLevel(GetWorld(), STUGameInstance->GetStartupLevel().LevelName);
    17}

实现载入动画


添加3个元素

  1. 载入图片

    可以复用上节的ShowImage

    一开始并未隐藏, 因此需设置不会触发鼠标事件; 设置颜色Alpha通道为0实现隐藏效果


  2. 加载效果

    设置隐藏


  3. 文本

    一开始同样不隐藏


    设置不会触发鼠标事件



实现动画

可适当延长


0-1s: 隐去之前的内容

Alpha通道由0变为1; 设置Visiblity, 屏蔽按钮点击




1-2s: 显示加载状态

  • 加载效果



  • 文本

    Alpha通道由0变为1




在虚幻编辑器中, 从窗口部件去到其定义


加载关卡动画


Level Preloading


说明

在主菜单选择关卡, 点击 Start Game 后也许会出现程序静止的情况, 这是因为在加载关卡

解决方法有以下几种:

  1. 异步加载
  2. 关卡流送 Level Streaming
  3. 加载关卡前播放加载动画

    加载动画结束后载入关卡

API导航

所有动画结束都会触发该函数

1virtual void OnAnimationFinished_Implementation(const UWidgetAnimation* Animation);

同样也有OnAnimationStarted_Implementation


添加载入动画

  1. 添加载入动画

    protected

    ShootThemUp: Menu/UI/STUMenuWidget.h
    1UPROPERTY(meta = (BindWidgetAnim), Transient)
    2UWidgetAnimation *LoadAnimation;
  2. 点击 StartGame 按钮时播放
     1void USTUMenuWidget::OnStartGame()
     2{
     3    PlayAnimation(LoadAnimation);
     4
     5    /*
     6    const FName LevelName = "DefaultMap";
     7    UGameplayStatics::OpenLevel(GetWorld(), LevelName);
     8    */
     9
    10    /*
    11    if (!GetWorld()) return;
    12
    13    const auto STUGameInstance = GetWorld()->GetGameInstance<USTUGameInstance>();
    14    if (!STUGameInstance) return;
    15
    16    // if (STUGameInstance->GetStartupLevelName().IsNone())
    17    if (STUGameInstance->GetStartupLevel().LevelName.IsNone())
    18    {
    19        UE_LOG(LogSTUMenuWidget, Error, TEXT("StartupLevelName is none"));
    20        return;
    21    }
    22
    23
    24    // UGameplayStatics::OpenLevel(GetWorld(), STUGameInstance->GetStartupLevelName());
    25    UGameplayStatics::OpenLevel(GetWorld(), STUGameInstance->GetStartupLevel().LevelName);
    26    */
    27}
  3. 动画播放结束时载入关卡

    protected

    ShootThemUp: Menu/UI/STUMenuWidget.h
    1virtual void OnAnimationFinished_Implementation(const UWidgetAnimation* Animation) override;
    ShootThemUp: Menu/UI/STUMenuWidget.cpp
     1void USTUMenuWidget::OnAnimationFinished_Implementation(const UWidgetAnimation *Animation)
     2{
     3    if (Animation != LoadAnimation) return;
     4
     5    if (!GetWorld()) return;
     6
     7    const auto STUGameInstance = GetWorld()->GetGameInstance<USTUGameInstance>();
     8    if (!STUGameInstance) return;
     9
    10    if (STUGameInstance->GetStartupLevel().LevelName.IsNone())
    11    {
    12        UE_LOG(LogSTUMenuWidget, Error, TEXT("StartupLevelName is none"));
    13        return;
    14    }
    15
    16    UGameplayStatics::OpenLevel(GetWorld(), STUGameInstance->GetStartupLevel().LevelName);
    17}

实现载入动画


添加3个元素

  1. 载入图片

    可以复用上节的ShowImage

    一开始并未隐藏, 因此需设置不会触发鼠标事件; 设置颜色Alpha通道为0实现隐藏效果


  2. 加载效果

    设置隐藏


  3. 文本

    一开始同样不隐藏


    设置不会触发鼠标事件



实现动画

可适当延长


0-1s: 隐去之前的内容

Alpha通道由0变为1; 设置Visiblity, 屏蔽按钮点击




1-2s: 显示加载状态

  • 加载效果



  • 文本

    Alpha通道由0变为1




在虚幻编辑器中, 从窗口部件去到其定义