3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Unreal Engine (UE)Advent Calendar 2023

Day 9

マルチプレイヤー プログラミングのクイックスタートガイドをBPでやってみた

Posted at

Unreal Engine (UE) Advent Calendar 2023の9日目の記事になります.

はじめに

UEで新しいことを学ぼうとする時に、まず最初に公式ドキュメントを読むことが多々あると思います。
今回はマルチプレイゲームを作りたいけどC++書くのはちょっと…という人のために、C++で書かれた公式ドキュメントの内容をBPだけでやってみました。
僕自身、勉強し始めたばかりなので不適切な点があるかもしれません。見つけた際はぜひご指摘いただけると幸いです。
レプリケートやRPC,所有権についての詳細は触れません.参考文献などをご参照ください.

環境

Windows10
UE5.3.2

目次

※公式ドキュメントの手順に沿って進めます

基本設定

新規プロジェクトをサードパーソンテンプレートで作成します。
以下の点を確認してください。

  • BPプロジェクトであること
  • スターターコンテンツが含まれていること
  • デスクトップをターゲットにしていること

スクリーンショット 2023-12-10 124655.png

プロジェクトを作成してエディタを開くことができたら、PlayerStartを複製しておきます。
スクリーンショット 2023-12-10 125651.png

次にエディタ起動設定を変更します。
スクリーンショット 2023-12-10 130115.png

ここまで設定できたら一度起動してみましょう。「NewEditorWindow(PIE)」で起動するのがおすすめです.ウィンドウが2つ出て、それぞれキャラクターを操作できるようになっています。CharacterMovementコンポーネントで移動を制御しているだけで、キャラクターの位置が同期されています。

実行したあとMessageLogに以下のようなWarningが出るかもしれません.
スクリーンショット 2023-12-10 131646.png
その場合,「Editor Preferences→Level Editor→Play Credentials」を開きます.「Credentials」にプレイヤーの数だけ追加します.情報は適当で大丈夫です.
image.png

RepNotifiesを使用してプレイヤーのヘルスをレプリケートする

キャラクターのHPを設定していきます。
BP_ThirdPersonを開いてください。
最大HPを表す「MaxHealth」と、現在HPを表す「CurrentHealth」をfloat型で作成します。今回「MaxHealth」の初期値は100にしました.
スクリーンショット 2023-12-10 133159.png

「CurrentHealth」は他プレイヤーと同期する必要があるのでレプリケートの設定をします。
スクリーンショット 2023-12-10 133346.png

RepNotifyに設定すると「OnRep_(変数名)」という関数が自動的に作られます.変数の値が変更されたときに実行したい処理を書きます.
今回は残りのHPをPrintStringで表示する関数を用意し,ダメージを受けたときに実行するようにします.
「OnHealthUpdate」という関数を作成し,以下のように組みます.
スクリーンショット 2023-12-10 152459.png
スクリーンショット 2023-12-10 152522.png

「OnRep_CurrentHealth」で「OnHealthUpdate」を呼び出します.
image.png

プレイヤーのHPを初期化するために,「BeginPlay」イベントで「SetCurrentHealth」を呼び出します.しかしこのまま呼び出してもクライアント側でしか実行されず,サーバーには反映されません.そのためサーバーで実行させるためのイベントを用意します.カスタムイベントを作成して「Replicates」を「Run on Server」にします.Reliableにチェックを入れることで,処理負荷などでRPCが送信されなかったときに再送信するようになります.
スクリーンショット 2023-12-10 171552.png
作成したイベントを「BeginPlay」で呼び出します.
image.png

プレイヤーをダメージに反応させる

次にプレイヤーがダメージを受けた時の処理を書いていきます。
BP_ThirdPersonを開いてください。
HPのゲッターとセッターを作成します。
変数はprivateにして、外部からはゲッターとセッターを通じて
アクセスできるようにします。

スクリーンショット 2023-12-10 133730.png

スクリーンショット 2023-12-10 133730.png

セッターに関しては、サーバーだけが値の変更が可能であるようにしておくべきです。そのため「Switch Has Authority」ノードを使用して、関数の実行者がサーバーの時だけ処理を行うようにします。
image.png

次にプレイヤーへダメージを適用する処理です.ここでは「AnyDamage」ノードを使用します.ダメージを通知する「Apply Damage」ノードや「Any Damage」ノードはサーバーで実行されるようになっています。
image.png

レプリケーションで発射物を作成する

まず発射物のActorを作成します.名前は「BP_MultiPlayProjectile」としました.
[画像]
作成したBPを開いて,以下のコンポーネントを追加します.

  • StaticMesh
  • SphereCollision
  • CascadeParticleSystem
  • ProjectileMovement

スクリーンショット 2023-12-10 153442.png

ParticleSystemの設定は以下のようになっています.StarterContentにある爆発エフェクトを使用するためにCascadeのParticleSystemを使用しています.発射物を生成したと同時にエフェクトが再生されないように,「AutoActivate」をfalseにしています.
スクリーンショット 2023-12-10 153555.png

コンポーネントを追加したら,衝突時にプレイヤーへ与えるダメージ用の変数を作成します.
スクリーンショット 2023-12-10 154649.png

アクターをレプリケートするために,「ClassDefaults→Replication→Replicates」にチェックを入れます.
スクリーンショット 2023-12-10 154817.png

「ProjectileMovement」コンポーネントを以下のように設定します.
スクリーンショット 2023-12-10 155022.png

発射物によるダメージを作成する

BP_MultiPlayProjectileのEventGraphを開いてください.
発射物がプレイヤーに衝突したらダメージを与えるようにします.今回は「OnComponentBeginOverlap」を使用します.
image.png

アクターを破棄する際にエフェクトを再生します.SEなどを追加しても良いです.
image.png

発射物を発射する

特定のキーを押したら発射物を発射するようにします.せっかくなのでEnhanced Inputを使用してみます.まずInputActionを新たに作成します.
スクリーンショット 2023-12-10 160150.png

Triggersの要素を追加して,Pressedを設定します
スクリーンショット 2023-12-10 160319.png

「Content→ThirdPerson→Input→IMC_Default」を開き,先ほど作成した「IA_Fire」を登録します.今回はFキーを押したら発射するようにします.
IMC.png

ここまでできたらBP_ThirdPersonを開いて処理を書いていきます.
次発射できるようになるまでの時間と,発射中のフラグの2つの変数を追加します.
image.png

発射用のイベントを用意します.発射物を生成するイベントだけ「Run on Server」に設定します.サーバー上で生成することで,他クライアントにレプリケートされます.
スクリーンショット 2023-12-10 162034.png

image.png

Fキーを押したときに「StartFire」イベントが呼び出されるようにします.
image.png

これで完成です.実行してみましょう.

おわりに

最後まで読んでいただきありがとうございました!
ざっくりとした説明だったので,補足必要なところや不備があればコメントいただけると幸いです.
またこういう風にした方がいいなど改善案も受け付けています.

参考文献

※↓UE4.27のページですが内容は問題ありません

※↓こちらにドクセルのリンクもあります

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?