🌌

[UE5] LyraのアニメーションBP群を自分のプロジェクトに移行する

2022/10/13に公開

前置き

  • C++未経験 or よくわかんない人向け
  • 下記の動画に盛り込めなかった、特にコードまわりの移行・修正手順です
  • 上手くいかない!こうすると良い!などあればコメントください

https://www.youtube.com/watch?v=yziT6p-mmtQ

やりたいこと

  1. LyraStarterGameのアニメーションBP群を自分のプロジェクトに移行
  2. その中でメインとなる"ABP_Mannequin_Base"は、C++クラス"LyraAnimInstance"を親クラスとしているためこちらも移行
  3. "LyraAnimInstance"は、"LyraCharacter"および"LyraCharacterMovementComponent"と依存関係があるためこれらも移行[1][2]
  4. GameplayAbilitySystem(通称GAS)の処理が含まれるため"GameplayAbilities"プラグインを有効化
    • ただし今回AbilitySystemComponentやAttributeSetの実装は行いません[3]
    • 自分がよくわかっていないこともあり、特にGameplayEffectやGameplayCue関連のコードはコンパイルエラーを避けるためコメントアウトしています

参考サイト

作業の前提

  • UE5を想定[4]
  • VisualStudio(以下VS)がインストールされていること
  • 移行先プロジェクトがBlueprintプロジェクトの場合は"ツール>新規 C++クラス"から適当なクラスを1つ作成[5]してVSプロジェクトを作成しておくこと
  • 手順およびソースコード内の"MyProject"や"MYPROJECT"は、すべて移行先の自分のプロジェクト名に置き換えて作業してください

手順

C++クラス移行

ヘッダーファイルとソースファイルをコピー

  1. エクスプローラー上で移行元プロジェクトのフォルダから移行先プロジェクトのフォルダにファイルをコピー[6]

    コピー元ファイルのパス
    # LyraAnimInstance
    LyraStarterGame\Source\LyraGame\Animation\LyraAnimInstance.h
    LyraStarterGame\Source\LyraGame\Animation\LyraAnimInstance.cpp
    
    # LyraCharacter
    LyraStarterGame\Source\LyraGame\Character\LyraCharacter.h
    LyraStarterGame\Source\LyraGame\Character\LyraCharacter.cpp
    
    # LyraCharacterMovementComponent
    LyraStarterGame\Source\LyraGame\Character\LyraCharacterMovementComponent.h
    LyraStarterGame\Source\LyraGame\Character\LyraCharacterMovementComponent.cpp
    
    コピー先の例
    # LyraAnimInstance
    MyProject\Source\MyProject\Animation\LyraAnimInstance.h
    MyProject\Source\MyProject\Animation\LyraAnimInstance.cpp
    
    # LyraCharacter
    MyProject\Source\MyProject\Character\LyraCharacter.h
    MyProject\Source\MyProject\Character\LyraCharacter.cpp
    
    # LyraCharacterMovementComponent
    MyProject\Source\MyProject\Character\LyraCharacterMovementComponent.h
    MyProject\Source\MyProject\Character\LyraCharacterMovementComponent.cpp
    

プラグインを有効化

  1. UE5エディタで移行先のプロジェクトを開く
  2. UE5エディタの"編集>プラグイン"から"GameplayAbilities","AnimationLocomotionLibrary","Animation Warping"を有効化
  3. UE5エディタ再起動
  4. 再起動したら、"ツール>Visual Studioを開く"などでVSプロジェクトを開く
    • 項目がない場合は"ツール>Visual Studioプロジェクトを作成"をクリック

コード修正

  • VSプロジェクトでコードを修正していきます

MyProject.Build.cs

  1. 下記の通り、GameplayAbilities関連のモジュールを追加し保存

    Games\MyProject\Source\MyProject\MyProject.Build.cs
    // Fill out your copyright notice in the Description page of Project Settings.
    
    using UnrealBuildTool;
    
    public class MyProject : ModuleRules
    {
    	public MyProject(ReadOnlyTargetRules Target) : base(Target)
    	{
    		PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
    
    -		PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore" });
    +		PublicDependencyModuleNames.AddRange(
    +			new string[] {
    +				"Core", 
    +				"CoreUObject", 
    +				"Engine", 
    +				"InputCore",
    +				"GameplayTags",
    +				"GameplayTasks",
    +				"GameplayAbilities" 
    +			}
    +		);	
    
    		PrivateDependencyModuleNames.AddRange(new string[] {  });
    
    		// Uncomment if you are using Slate UI
    		// PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" });
    
    		// Uncomment if you are using online features
    		// PrivateDependencyModuleNames.Add("OnlineSubsystem");
    
    		// To include OnlineSubsystemSteam, add it to the plugins section in your uproject file with the Enabled attribute set to true
    	}
    }
    
    
  2. UE5エディタの"ツール>Visual Studioプロジェクトを更新"をクリック[7]

DefaultEngine.ini

  1. 末尾に下記の通りCoreRedirects[8]を追加
    Games\MyProject\Config\DefaultEngine.ini
    [CoreRedirects]
    +ClassRedirects=(MatchSubstring=True,OldName="/Script/LyraGame",NewName="/Script/MyProject")
    +EnumRedirects=(MatchSubstring=True,OldName="/Script/LyraGame",NewName="/Script/MyProject")
    +FunctionRedirects=(MatchSubstring=True,OldName="/Script/LyraGame",NewName="/Script/MyProject")
    +StructRedirects=(MatchSubstring=True,OldName="/Script/LyraGame",NewName="/Script/MyProject")
    +PackageRedirects=(OldName="/Script/LyraGame",NewName="/Script/MyProject")
    

LyraAnimInstance.h

  • 修正不要

LyraAnimInstance.cpp

  1. include文を修正[9]
    Games\MyProject\Source\MyProject\Animation\LyraAnimInstance.cpp
    // Copyright Epic Games, Inc. All Rights Reserved.
    
    #include "LyraAnimInstance.h"
    #include "AbilitySystemComponent.h"
    #include "AbilitySystemGlobals.h"
    -#include "Character/LyraCharacter.h"
    -#include "Character/LyraCharacterMovementComponent.h"
    +//#include "Character/LyraCharacter.h"
    +//#include "Character/LyraCharacterMovementComponent.h"
    +#include "MyProject/Character/LyraCharacter.h"
    +#include "MyProject/Character/LyraCharacterMovementComponent.h"
    
    
    ULyraAnimInstance::ULyraAnimInstance(const FObjectInitializer& ObjectInitializer)
    	: Super(ObjectInitializer)
    {
    }
    

LyraCharacter.h

  1. Include文を修正

    Games\MyProject\Source\MyProject\Animation\LyraCharacter.h
    // Copyright Epic Games, Inc. All Rights Reserved.
    
    #pragma once
    
    #include "CoreMinimal.h"
    -#include "ModularCharacter.h"
    -#include "Teams/LyraTeamAgentInterface.h"
    +//#include "ModularCharacter.h"
    +//#include "Teams/LyraTeamAgentInterface.h"
    +#include "GameFramework/Character.h"
    #include "AbilitySystemInterface.h"
    -#include "GameplayCueInterface.h"
    -#include "GameplayTagAssetInterface.h"
    +//#include "GameplayCueInterface.h"
    +//#include "GameplayTagAssetInterface.h"
    
    #include "LyraCharacter.generated.h"
    
  2. 不完全クラス宣言をすべてコメントアウト

    Games\MyProject\Source\MyProject\Animation\LyraCharacter.h
    //class ALyraPlayerController;
    //class ALyraPlayerState;
    //class ULyraAbilitySystemComponent;
    //class UAbilitySystemComponent;
    //class ULyraPawnExtensionComponent;
    //class ULyraHealthComponent;
    //class ULyraCameraComponent;
    
  3. クラス宣言を修正

    Games\MyProject\Source\MyProject\Animation\LyraCharacter.h
    UCLASS(Config = Game, Meta = (ShortTooltip = "The base character pawn class used by this project."))
    -class ALyraCharacter : public AModularCharacter, public IAbilitySystemInterface, public IGameplayCueInterface, public IGameplayTagAssetInterface, public ILyraTeamAgentInterface
    +//class ALyraCharacter : public AModularCharacter, public IAbilitySystemInterface, public IGameplayCueInterface, public IGameplayTagAssetInterface, public ILyraTeamAgentInterface
    +class ALyraCharacter : public ACharacter
    
  4. 下記以外のメンバ関数をコメントアウト

    Games\MyProject\Source\MyProject\Animation\LyraCharacter.h
    ALyraCharacter(const FObjectInitializer& ObjectInitializer = FObjectInitializer::Get());
    
    virtual void PreInitializeComponents() override;
    virtual void GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const override;
    virtual void PreReplication(IRepChangedPropertyTracker& ChangedPropertyTracker) override;
    
    UPROPERTY(Transient, ReplicatedUsing = OnRep_ReplicatedAcceleration)
    FLyraReplicatedAcceleration ReplicatedAcceleration;
    
    UFUNCTION()
    void OnRep_ReplicatedAcceleration();
    

LyraCharacter.cpp

  1. Include文とフィールドを修正

    Games\MyProject\Source\MyProject\Animation\LyraCharacter.cpp
    // Copyright Epic Games, Inc. All Rights Reserved.
    
    #include "LyraCharacter.h"
    #include "LyraCharacterMovementComponent.h"
    -#include "LyraLogChannels.h"
    -#include "LyraGameplayTags.h"
    -#include "Character/LyraPawnExtensionComponent.h"
    -#include "Components/CapsuleComponent.h"
    -#include "Components/SkeletalMeshComponent.h"
    +//#include "LyraLogChannels.h"
    +//#include "LyraGameplayTags.h"
    +//#include "Character/LyraPawnExtensionComponent.h"
    +//#include "Components/CapsuleComponent.h"
    +//#include "Components/SkeletalMeshComponent.h"
    #include "Components/InputComponent.h"
    -#include "Camera/LyraCameraComponent.h"
    -#include "AbilitySystem/LyraAbilitySystemComponent.h"
    -#include "Character/LyraHealthComponent.h"
    -#include "Player/LyraPlayerController.h"
    -#include "Player/LyraPlayerState.h"
    -#include "System/LyraSignificanceManager.h"
    +//#include "Camera/LyraCameraComponent.h"
    +//#include "AbilitySystem/LyraAbilitySystemComponent.h"
    +//#include "Character/LyraHealthComponent.h"
    +//#include "Player/LyraPlayerController.h"
    +//#include "Player/LyraPlayerState.h"
    +//#include "System/LyraSignificanceManager.h"
    #include "Net/UnrealNetwork.h"
    -#include "TimerManager.h"
    +//#include "TimerManager.h"
    
    -static FName NAME_LyraCharacterCollisionProfile_Capsule(TEXT("LyraPawnCapsule"));
    -static FName NAME_LyraCharacterCollisionProfile_Mesh(TEXT("LyraPawnMesh"));
    +//static FName NAME_LyraCharacterCollisionProfile_Capsule(TEXT("LyraPawnCapsule"));
    +//static FName NAME_LyraCharacterCollisionProfile_Mesh(TEXT("LyraPawnMesh"));
    
  2. コンストラクタ内の下記以外の部分をコメントアウト

    Games\MyProject\Source\MyProject\Animation\LyraCharacter.cpp
    ALyraCharacter::ALyraCharacter(const FObjectInitializer& ObjectInitializer)
    	: Super(ObjectInitializer.SetDefaultSubobjectClass<ULyraCharacterMovementComponent>(ACharacter::CharacterMovementComponentName))
    {		
    	ULyraCharacterMovementComponent* LyraMoveComp = CastChecked<ULyraCharacterMovementComponent>(GetCharacterMovement());
    	LyraMoveComp->GravityScale = 1.0f;
    	LyraMoveComp->MaxAcceleration = 2400.0f;
    	LyraMoveComp->BrakingFrictionFactor = 1.0f;
    	LyraMoveComp->BrakingFriction = 6.0f;
    	LyraMoveComp->GroundFriction = 8.0f;
    	LyraMoveComp->BrakingDecelerationWalking = 1400.0f;
    	LyraMoveComp->bUseControllerDesiredRotation = false;
    	LyraMoveComp->bOrientRotationToMovement = false;
    	LyraMoveComp->RotationRate = FRotator(0.0f, 720.0f, 0.0f);
    	LyraMoveComp->bAllowPhysicsRotationDuringAnimRootMotion = false;
    	LyraMoveComp->GetNavAgentPropertiesRef().bCanCrouch = true;
    	LyraMoveComp->bCanWalkOffLedgesWhenCrouching = true;
    	LyraMoveComp->SetCrouchedHalfHeight(65.0f);
    }
    
    • LyraCharacterでTickを使わせたくない場合は下記2行をアンコメントしてください
    Games\MyProject\Source\MyProject\Animation\LyraCharacter.cpp
    //PrimaryActorTick.bCanEverTick = false;
    //PrimaryActorTick.bStartWithTickEnabled = false;
    
  3. メンバ関数"GetLifetimeReplicatedProps"の"DOREPLIFETIME(ThisClass, MyTeamID)"をコメントアウト

    Games\MyProject\Source\MyProject\Animation\LyraCharacter.cpp
    void ALyraCharacter::GetLifetimeReplicatedProps(TArray< FLifetimeProperty >& OutLifetimeProps) const
    {
    	Super::GetLifetimeReplicatedProps(OutLifetimeProps);
    
    	DOREPLIFETIME_CONDITION(ThisClass, ReplicatedAcceleration, COND_SimulatedOnly);
    -	DOREPLIFETIME(ThisClass, MyTeamID)
    +//	DOREPLIFETIME(ThisClass, MyTeamID)
    }
    
  4. 下記以外のメンバ関数をコメントアウト

    Games\MyProject\Source\MyProject\Animation\LyraCharacter.cpp
    ALyraCharacter::ALyraCharacter(const FObjectInitializer& ObjectInitializer)
    void ALyraCharacter::PreInitializeComponents()
    void ALyraCharacter::GetLifetimeReplicatedProps(TArray< FLifetimeProperty >& OutLifetimeProps) const
    void ALyraCharacter::PreReplication(IRepChangedPropertyTracker& ChangedPropertyTracker)
    void ALyraCharacter::OnRep_ReplicatedAcceleration()
    

LyraCharacterMovementComponent.h

  1. マクロの"LYRAGAME_API"を"プロジェクト名_API"に修正
    Games\MyProject\Source\MyProject\Animation\LyraCharacterMovementComponent.h
    -//LYRAGAME_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(TAG_Gameplay_MovementStopped);
    +MYPROJECT_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(TAG_Gameplay_MovementStopped);
    
    Games\MyProject\Source\MyProject\Animation\LyraCharacterMovementComponent.h
    -//class LYRAGAME_API ULyraCharacterMovementComponent : public UCharacterMovementComponent
    +class MYPROJECT_API ULyraCharacterMovementComponent : public UCharacterMovementComponent
    

LyraCharacterMovementComponent.cpp

  1. 修正不要

ビルド

  1. VSでビルド(Ctrl+Shift+B)を実行。コンパイルが通り、正常終了することを確認
    • エラーが出ずに下記が出力されればOK
      出力結果
      ========== ビルド: 1 正常終了、0 失敗、0 更新不要、1 スキップ ==========
      

ブループリント移行

アニメーションBP群を移行

  1. UE5エディタで移行元であるLyraStarterGameプロジェクトを開く
  2. コンテンツブラウザで"All/Content"フォルダを開いてAnimation Blueprintでフィルター
  3. 出てきたアニメーションBPを全選択して右クリック>アセットアクション>移行...をクリック
  4. "AnimationLocomotionLibrary"と"ControlRig"のチェックを外して"OK"をクリック
  5. 移行先のプロジェクトのContentフォルダを選択

動作確認

ABP_Mannequin_Baseが開けるか確認

  1. UE5エディタで移行先のプロジェクトを開き直す
  2. 移行したアニメーションBPのうち"ABP_Mannequin_Base"が開けるか確認
    • 初回は開くのに時間がかかる。上手くいっていなければすぐにポップアップでエラーが出る

キャラクターに適用して想定通り動作するか確認

  1. 自分のキャラクターBPにLyraCharacterを継承させる[11]

  2. 自分のキャラクターのスケルタルメッシュコンポーネントにLyraから移行した"SKM_Manny"もしくは"SKM_Quinn"と"ABP_Mannequin_Base"を設定[12]

  3. "Construction Script"や"Begin Play"から"Link Anim Class Layers"を繋ぐ

  4. プレイして想定通りの挙動をするか確認

    • "FootStepEffectTagModifier"でエラーが出るが無視してOK
    • エラーのポップアップを消したい場合は"FootStepEffectTagModifier"を開いてEventOnApplyの実行ピンを切る

以上!

脚注
  1. レプリケーションまわりの処理が入っているため丁度よいので移行する ↩︎

  2. これ以上の他クラスへの依存関係はきりがないのでコメントアウトで対応。必要になったら都度アンコメントする予定 ↩︎

  3. 続いたら記事書くかもしれません ↩︎

  4. UE4でも一部UEエディタ操作が異なるだけで同様のことは出来るが、そもそも移行対象のLyraのアニメーションBPがPropertyAccessをはじめとしたUE5新機能を利用しているため ↩︎

  5. このクラスは後で削除してしまってOK ↩︎

  6. コピー先でフォルダ構成を変えても大丈夫かは試してないです(例えば、"LyraAnimInstance"を"Animation"とは別のフォルダに入れる等) ↩︎

  7. プラグインに加え、前工程でコピーしたC++クラスがVSプロジェクトで利用可能になる ↩︎

  8. 移行したBlueprintから親C++クラスを参照するために必要 ↩︎

  9. パスが通らないため ↩︎

  10. "LyraStarterGame\Plugins\ModularGameplayActors\Source"にリソースがある。使用したい場合は、自分のプロジェクトフォルダ内にPluginsフォルダを作成し"LyraStarterGame\Plugins\ModularGameplayActors"をその中にコピーした後、UEエディタでプラグイン設定から有効化&VSプロジェクトを更新すればOK ↩︎

  11. 簡単な動作確認だけであれば継承は不要ですが、LyraアニメーションBPや各C++クラスの細かい機能を利用したい場合は継承が必要です ↩︎

  12. TPSテンプレートの"SKM_Manny"および"SKM_Quinn"だと動作が安定しませんでした ↩︎

Discussion