UE4 ローカルマルチプレイヤーゲーム プレイヤー生成
第12回ぷちコンに参加し、ローカルマルチプレイヤーゲームを制作しました。
今回はその制作したゲームでどういう風にプレイヤーを生成していたのかを初心者の人で見てもわかるように(できるだけ)説明します。そのために少しプログラムを変えています。
先にどういうゲームを制作したのかを見たい人は下に動画を貼ってあるので見てください。
※良いプログラムではありません。こうしたらもっと簡単にできるよ!!
という部分があればTwitterでおしえてもらえるとありがたいです。
このゲームの流れ
タイトル→使いたいキャラクターを選ぶ→バトルという流れをやろうとしてました。
なのでキャラクターを作るときに注意したのは、
1.動的にプレイヤーが選んだキャラクターを操作出来るようにする。
2.キャラクターごとに違った挙動をしたかったので別々のBPで管理する。
というようなことに注意してました。では、どう実装したのかを書いていきます。
1.プレイヤーの生成位置
今回のゲームは事前に使われるキャラクターが不明でバトルマップ(level)上に特定のキャラクターを配置することはできないと考えていました。
なので、キャラクター生成位置を検索する→生成位置に(特定の)キャラクターを生成する。というプログラムで作っています。
今回実装した方法
Actor型のBP(BP_Player_Start_Position)を作成。BPをマップ上に配置。その位置を検索して生成します。
マップ上に配置したときに分かりやすくなるように作成したBPにコンポーネント追加の項目からCapsue Collisionを追加しています。
コンポーネントウインドウのCapsuleを左クリック。右の詳細ウインドウのShape項目にあるCapsule HalfHeight・Capsule Radiusがあります。ここの値を変更するとCapsule Collisionの形状が変わります。ここでCapsule Collisionの形状を変更してもいいですが、今回はマップに配置されている状態で形状を変更できるようにしたいと思います。
マップ(level)上でCapsule Collisionの形状を変更する
float型の変数を2つ新規で追加する。
追加:[変数] Capsule Height→Capsule CollisionのHalfHeightの値を変更するために追加。
追加:[変数] Capsule Radius→Capsule CollisionのRadiusの値を変更するために追加。
Construction Script内でCapsule CollisionのHalf Heightの値を作成した変数Capsule Heightの値で代入。同様に、Capsule CollisionのRadiusの値を作成した変数CapsuleRadiusの値で代入しています。
Construction Scriptとは
簡単にいえばマップ上に配置したときに実行されるものです。便利!!
イベントグラフのBeginPlayはゲームが再生されてオブジェクトが生成されたときに一度実行されるものです。ごちゃごちゃにならないようにしよう!!
これで新規で作成した変数が変更されるとその値がCapsule CollisionのHalfHeight・Radiusの値になり形状が変更されます。
後は、作成したBPをマップ上に配置された状態で簡単に変数を変更できるようにします。
変数のCapsule_Heightを左クリック。右の詳細ウインドウの変数項目のインスタンス編集可能のチェックボックスをチェックします。
もしくはマイブループリントウインドウの変数項目にある変数の横に四角形の目を閉じたようなマークがあります。これを左クリックすると上の手順の結果と同じになります。
もう1つの変数Capsule_Radiusも同様の手順を行います。
マップ上で変数を変更できるようになりました。
作成したBPをマップ上に配置する→BPを左クリックで選択。詳細ウインドウのデフォルト(カテゴリ)欄にある変数の値を変更するとマップに配置されている状態でCapsule Collisionの形状を変更できます。
2.スポーン位置を検索・生成
これから説明する処理はGameModeというBPに書いています。
詳しくはドキュメントを御覧ください。
スポーン位置検索
スポーン位置を検索するためにBP_Player_Start_Positionの情報を取得します。
ここではGet All Actors Of Classというのを使って情報を取得しています。
取得した情報を配列でデータを格納しておきます。
詳細はUE4のドキュメントに書いているので見てください。
これを使う時には注意してください。特定のクラスのレベル内のアクターを全て取得できて便利ですがTickなどで実行すると毎フレーム特定のクラスのレベル内アクターを取得されるので大変重くなります。Tickなど毎フレーム実行させるものには本当に毎フレーム実行させる必要があるのか検討してください。
プレイヤーを生成する
3キャラクターを操作したいのでcreate player 関数を2回実行する
create playerはGameModeに設定されているDefault Pawnを生成します。
事前に操作したいキャラクターがわからないのでDefault Pawn ClassはDefaultPawnにしています。
これでデフォルトポーンが2つとPlayer Controller1, PlyaerController2が生成されました。Player Controller0はゲームを再生したときに生成されています。
SpawnActorでプレイヤーを生成する処理です。
class→生成するアクター
Spawn Transform→生成する位置・回転・拡大縮小
紫色のPlayerBaseRef配列の中には生成したいキャラクターのクラス参照情報が格納されています。Get関数で配列の中の要素番号を指定しその中の情報を取得しています。
ですから要素番号が変われば生成されるキャラクターが変わります。
BP_Player_Start_Positionの情報を取得した配列から要素番号を指定してそのTransform情報を取得しています。
最後にPlayer Controllerを生成したアクターに所持させます。
※動的に要素番号を変更する処理は書いていません。
あとはこれと同じ形で要素番号を変えたプログラムを2回書きます。
まとめ
ざっくりとキャラクター生成まで説明していきました。キャラクターの管理などの処理は書いていないので機会があれば書きます。もしわからないことがあればTwitterで言っていただければ返信が出来ますのでよろしくおねがいします。
UE4でゲームを作ろう!!
今回の制作したゲームです。制作期間は約3週間です。
[第12回UE4ぷちコン応募作品】GrayMan Slayer
他にも学校の課題でこういうゲームも作りました。制作期間は8時間です。