ブループリントとC++でモンタージュ設定
アニメーションブループリントを開いて、AnimGraphでマウスを右クリックして検索窓にslotと入力します。候補の中から一番上にあるスロットを選びます。
詳細にあるSlot nameを新規に作成したスロット名(ここではattack)に変更します。ノードを接続したらコンパイルと保存を押します。
設定→プロジェクト設定→インプットでアクションマッピングを以下のように設定します。コントローラボタンやアクション名は適当に選んでください。
MyCharacter.hを開いて関数と変数を宣言します。
UPROPERTY(VisibleAnyWhere, BlueprintReadOnly, Category = Combat) bool bAttacking; void Attack(); UFUNCTION(BlueprintCallable) void AttackEnd(); void GPBDown(); void GPBUp(); bool bGPBDown; UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = Anim) class UAnimMontage* AttackMontage;
MyCharacter.cppにbGPBDownのデフォルト値を設定します。GPBはGamePadBButtonのことで、bGPBDownはゲームパッドBボタンが押されているかどうかを判定します。
// Sets default values AMyCharacter::AMyCharacter() : bGPBDown(false)
次にswitchを使ってアニメモンタージュの攻撃アニメーションを切り替えます。
void AMyCharacter::Attack() { bAttacking = true; UAnimInstance* AnimInstance = GetMesh()->GetAnimInstance(); if (AnimInstance && AttackMontage) { int32 Section = FMath::RandRange(0,8); switch (Section) { case 0: AnimInstance->Montage_Play(AttackMontage, 2.5); AnimInstance->Montage_JumpToSection(FName("attack1"), AttackMontage); break; case 1: AnimInstance->Montage_Play(AttackMontage, 2.5); AnimInstance->Montage_JumpToSection(FName("attack2"), AttackMontage); break; case 2: AnimInstance->Montage_Play(AttackMontage, 2.5); AnimInstance->Montage_JumpToSection(FName("attack3"), AttackMontage); break; case 3: AnimInstance->Montage_Play(AttackMontage, 2.5); AnimInstance->Montage_JumpToSection(FName("attack4"), AttackMontage); break; case 4: AnimInstance->Montage_Play(AttackMontage, 2.5); AnimInstance->Montage_JumpToSection(FName("attack5"), AttackMontage); break; case 5: AnimInstance->Montage_Play(AttackMontage, 2.5); AnimInstance->Montage_JumpToSection(FName("attack6"), AttackMontage); break; case 6: AnimInstance->Montage_Play(AttackMontage, 2.5); AnimInstance->Montage_JumpToSection(FName("attack7"), AttackMontage); break; case 7: AnimInstance->Montage_Play(AttackMontage, 2.5); AnimInstance->Montage_JumpToSection(FName("attack8"), AttackMontage); break; case 8: AnimInstance->Montage_Play(AttackMontage, 2.5); AnimInstance->Montage_JumpToSection(FName("attack9"), AttackMontage); break; default: ; } } } void AMyCharacter::AttackEnd() { bAttacking = false; if (bGPBDown) { Attack(); } } void AMyCharacter::GPBDown() { bGPBDown = true; Attack(); } void AMyCharacter::GPBUp() { bGPBDown = false; }
SetupPlayerInputComponentにattackアクションマッピングを追加します。
PlayerInputComponent->BindAction("GPB", IE_Pressed, this, &AMyCharacter::GPBDown); PlayerInputComponent->BindAction("GPB", IE_Released, this, &AMyCharacter::GPBUp);
キャラクターブループリントを開いて、検索窓にmontageと入力してアニメーションモンタージュをAttackMontageに設定します。
AttackMontageを開いて、通知トラックの追加ボタンを押して通知トラックをいくつか追加します。
9個の攻撃アニメーションの最後にAttackEndという通知を追加します。
9個全部にAttackEnd通知を追加したら保存ボタンを押してAttack Montageを閉じます。
次に、アニメーションBPを開きます。イベントグラフエディタで右クリックして検索窓にmycharと入力してMy Charを選択します。
MyCharのピンを左クリックして引き出し、左クリックを解除して検索窓にisvalidと入力して?マークのノードを選択します。
エディタ内で右クリックして検索窓にattackと入力してイベントAnim_Notifyを選択します。
再びmycharと入力してMy Charを呼び出し、ピンを左クリックで引き出し、左クリックを解除後、検索窓にAttack Endと入力してC++関数を呼び出します。この時、状況に合わせた表示のチェックを外します。
以下のようにピンを接続したら完了です。
アニメ速度を変えることで、もっと動きを拘束にできます。攻撃パターンをもっと増やしてもいいかもしれません。
コメント