iT邦幫忙

2025 iThome 鐵人賽

DAY 27
0

今天來製作第二個魔法攻擊:追蹤彈,使用UE5的 Projectile Movement Component 來製作

1. 事前準備

Blueprint 或 C++ 都可以加 Porjectile Component,但我這裡用 C++ 來做投射物的 Base

  • ProjectileBase.h
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/ProjectileMovementComponent.h"
#include "ProjectileBase.generated.h"

UCLASS()
class ITHOME30DAYS_API AProjectileBase : public AActor
{
	GENERATED_BODY()
public:
	AProjectileBase();
	virtual void BeginPlay() override;
	
	UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Movement")
	UProjectileMovementComponent* ProjectileComp;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Projectile Settings")
	float InitialSpeed = 300.f;
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Projectile Settings")
	float MaxSpeed = 800.f;
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Projectile Settings")
	float ProjectileGravityScale = 0.f;
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Projectile Settings")
	bool bIsHoming = false;
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Projectile Settings")
	bool bRotationFollowVelocity = bIsHoming;
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Projectile Settings")
	float HomingAccelerationMagnitude = 2000.f;
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Projectile Settings")
	USceneComponent* HomingTarget = nullptr;

	
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Projectile Settings")
	float Damage = 5.f;
};
  • ProjectileBase.cpp
#include "ProjectileBase.h"

AProjectileBase::AProjectileBase()
{
	PrimaryActorTick.bCanEverTick = true;
	// 預先創建 Projectile Component
	ProjectileComp = CreateDefaultSubobject<UProjectileMovementComponent>(TEXT("ProjectileComp"));
}

void AProjectileBase::BeginPlay()
{
	Super::BeginPlay();

	ProjectileComp->InitialSpeed = InitialSpeed;
	ProjectileComp->MaxSpeed = MaxSpeed;
	ProjectileComp->ProjectileGravityScale = ProjectileGravityScale;
	ProjectileComp->bIsHomingProjectile = bIsHoming;
	ProjectileComp->bRotationFollowsVelocity = bRotationFollowVelocity;
	ProjectileComp->HomingAccelerationMagnitude = HomingAccelerationMagnitude;
}

在敵人身上 加一個 Scene Component (HomingTarget)作為導彈目標,因為 Projectile Component 的 Homing Target 只接收 "Component" 而非 FVector Location
https://ithelp.ithome.com.tw/upload/images/20251011/201710369RpufytJxK.png

2. 新增 MagicMissile

跟之前創建武器一樣,創建 Blueprint 時選擇 ProjectileBase 作為 Parent。

  • 在 MagicMissile 裡加 Box Collision 跟 Mesh
    https://ithelp.ithome.com.tw/upload/images/20251011/20171036rVYHr0uZX7.png
    Box Collision 碰到敵人時造成傷害
    https://ithelp.ithome.com.tw/upload/images/20251011/20171036Vp2Y5Hza7U.png

3. 修改 MagicWeapon

  • MagicWeapon.h
    我把之前的 Missile 改成 Magic 陣列,這樣就能根據 Combo 來放要執行的魔法攻擊。
UPROPERTY(EditAnywhere, Category = "Weapon")
TArray<TSubclassOf<AActor>> Magics = {};

// 還有加一個攻擊函式
UFUNCTION()
virtual void BookMagicProj();
  • MagicWeapon.cpp
void AMagicWeapon::BookMagicProj()
{
    if (!Magics[1]) return;

    // 從魔法書發射
    const FVector Loc = OwnerChar->GetMesh()->GetSocketLocation(AttachSocketName);
    
    AActor* ProjActor = GetWorld()->SpawnActor<AActor>(Magics[1], Loc, (OwnerChar->TargetActor != nullptr) ? FRotator(90,0,0) : OwnerChar->GetActorRotation());
        
    if (AProjectileBase* Projectile = Cast<AProjectileBase>(ProjActor))
    {
        Projectile->Damage = Damage*1.5;
        
        if (OwnerChar->TargetActor != nullptr)
        {
            Projectile->bIsHoming = true;
            USceneComponent* HomingPoint = Cast<USceneComponent>(OwnerChar->TargetActor->GetDefaultSubobjectByName(TEXT("HomingTarget")));
            Projectile->ProjectileComp->HomingTargetComponent = HomingPoint ? HomingPoint : OwnerChar->TargetActor->GetRootComponent();
        }
        else
        {
            Projectile->bIsHoming = false;
        }
    }
}

4. 設定

  • Magic Book
    https://ithelp.ithome.com.tw/upload/images/20251011/201710365UroDKZUxs.png
  • Magic Attack Montage
    https://ithelp.ithome.com.tw/upload/images/20251011/20171036fc4KIYt7h5.png

然後就

完成!!!!!11!!1!


上一篇
# Day 26|魔法攻擊(一)
下一篇
# Day 28|魔法攻擊 (三)
系列文
30 天用 Unreal Engine 5 C++ 開發遊戲28
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言