iT邦幫忙

2022 iThome 鐵人賽

DAY 19
0
自我挑戰組

遊戲中的冰山一角-網路連線系列 第 19

Day19-Unreal連線初學(4)

  • 分享至 

  • xImage
  •  

接下來要新增子彈來當作CauseDamage函式觸發的載體,首先需要創建一個子彈的Actor並且為它加上碰撞、外觀以及他的行動物件。

首先先在上方tool找到Add new c++ class的選項或是在文件管理裡面找到C++ Classes後對該文件點選右鍵的選單,在Add/Import content選項裡也能找到,選擇之後按照此圖做設定:
https://ithelp.ithome.com.tw/upload/images/20220919/20151289JmovLK0Mym.png
選擇Actor,Public之後取個適當的名字後按Create Class。

附註:如果在創完物件打開編譯器發現會有紅底線之類的引用錯誤,就先回到專案裡面點選tool裡面的refresh讓他重新更新檔案路徑與要使用的模組。
https://ithelp.ithome.com.tw/upload/images/20220919/20151289pHhilwfQjX.png

接者就是今天標投檔會用到的程式碼:

// ProjectileBase.h

#include "Components/SphereComponent.h"
#include "Components/StaticMeshComponent.h"
#include "GameFramework/ProjectileMovementComponent.h"
#include "GameFramework/DamageType.h"
#include "Particles/ParticleSystem.h"


public:
	UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Projectile")
	USphereComponent* SphereCollision;
	
	UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Projectile")
	UStaticMeshComponent* StaticMesh;
	
	UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Projectile")
	UProjectileMovementComponent* ProjectileMovementComponent;
	
	UPROPERTY(EditAnywhere, Category = "Effects")
	UParticleSystem* ExplosionEffect;
	
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Damage")
	TSubclassOf<UDamageType> DamageType;
	
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Damage")
	float Damage;

首先為了要創建子彈我們要先將這些模組引用進來,在引用的時候有個重點千萬不能忘了,這些引用必須要寫在#include”xxx.generated.h”之前,不然在編譯時會發生錯誤,讀者也可以將這些引用都寫在.cpp檔裡面,標頭檔裡就必須將有U開頭的模組前加上class才能讓編譯器去識別,例如:

class USphereComponent* SphereCollision;
  • StaticMesh與ExplosionEffect屬於視覺上面呈現要用到的物件,一個是子彈本身另一個則是命中時要觸發特效。
  • SphereCollision是要做碰撞的判定
  • ProjectileMovementComponent是負責管理子彈的物理運動要用到的所有基本功能,UE非常貼心的已經為開發者寫好了
  • DamageType是傷害的事件
  • Damage是傷害數值

接著進到.cpp檔裡面添加下列程式碼:

// ProjectileBase.cpp

#include "Kismet/GameplayStatics.h"

// 在建構原裡面添加下列程式碼
Constructor()
{
	// Main idea
	bReplicates = true;

	SphereCollision = CreateDefaultSubobject<USphereComponent>(TEXT("RootComponent"));
	SphereCollision->InitSphereRadius(30.f);
	SphereCollision->SetCollisionProfileName(TEXT("BlockAllDynamic"));
	RootComponent = SphereCollision;

	StaticMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Mesh"));
	StaticMesh->SetupAttachment(RootComponent);

	ProjectileMovementComponent = CreateDefaultSubobject<UProjectileMovementComponent>(TEXT("ProjectileMovement"));
	ProjectileMovementComponent->SetUpdatedComponent(SphereCollision);
	ProjectileMovementComponent->InitialSpeed = 1000.f;
	ProjectileMovementComponent->MaxSpeed = 1000.f;
	ProjectileMovementComponent->bRotationFollowsVelocity = true;
	ProjectileMovementComponent->ProjectileGravityScale = 0.f;

	DamageType = UDamageType::StaticClass();
	Damage = 10.f;
}

首先是這個布林變數一定要設定為true,之後在專案中也能找到設定

bReplicates = true;

https://ithelp.ithome.com.tw/upload/images/20220919/20151289hmmLtlFKZQ.png
這個設定會決定此物件能否複製到其他客戶端上,因此非常的重要,之後在實際測試的時候就可以將此選項設為false各位讀者就能看到差別。

再來為圓碰撞建立實體,這邊會用到很方便的函式CreateDefaultSubobject()來幫助我們創建並將物件名稱設定為RootComponent,設定初始半徑為30,碰撞的設定檔初始化為會與所有動態物體碰撞,最後將它設定成子彈物件的根物件。

接著建立外觀的實體,不過我們這邊只將實體容器創建出來並取名稱,實際要設定的外觀等之後回到專案的時候再做設定,並將他綁定在根物件上成為根物件的子物件。

最後設定ProjectileMovementComponent一樣先建立實體然後設定要受到此移動物件影響的物件,這邊就設定根物件做為影響的主要對象,接著設定初始速度與最大速度。是否要伴隨速度旋轉可有可無這邊就將她打開讓子彈看起來更生動,最後將重力影響設定為0讓子彈直線運動。

DamageType與Damage都做最基本的初始化即可。

以上的設定都還能在專案中手動調整,讀者可以依照自己喜好挑整所有數值與設定。

都完成後就回到專案中重新編譯一下,等到編譯完成就可以將我們剛創建好的子彈從cpp當轉換成Blueprint來管控,這會比純程式碼相對簡單。

對著C++檔案的ProjectileBase點選右鍵,找到此選項就可以創建Blueprint:
https://ithelp.ithome.com.tw/upload/images/20220919/20151289Sj6d3evaY1.png
https://ithelp.ithome.com.tw/upload/images/20220919/20151289AC7pCvXfLE.png
筆者先創建了一個CppToBP的資料夾用於集體管理從父類別是Cpp檔案的BP檔,創建完後打開來就可以看到我們剛剛創的SphereCollision以紅色線條呈現,接下來就要來設定視覺上要看到的東西。
https://ithelp.ithome.com.tw/upload/images/20220919/20151289feCqXEeDq4.png
先選左邊的StaticMesh然後在右邊的StatiMesh中找到Sphere,之後將大小稍加調整就會長這樣
https://ithelp.ithome.com.tw/upload/images/20220919/20151289P7xXqgXc4G.png
之後點選上方的Class Default設定爆炸的粒子特效
https://ithelp.ithome.com.tw/upload/images/20220919/20151289SdUNjce0qt.png
都設定完成後點選左上角的編譯然後存檔,回到場景就可以把剛剛設定好的子彈直接拖進場景中,讀者可以依照自己的喜好去改變設定。


上一篇
Day18-Unreal連線初學(3)
下一篇
Day20-Unreal連線初學(5)
系列文
遊戲中的冰山一角-網路連線30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言