UnrealEngine4を使って簡単な3Dゲームを作る(前)

2020/12/16 追記

 

 

はじめに

この記事は、香川大学創造工学部のプログラミングサークル SLP の アドベントカレンダー 2020 15日目の記事です。サークル生やOBの方々が繋いでいきますので、そちらもぜひ目を通していただけると嬉しいです。

adventar.org

 

昨年に引き続き、アドベントカレンダーへ参加させてもらえることになりました。

前回は、「うどん屋にお昼を食べに行く学生がよくいるが、うどん屋までの横断歩道に信号がなく、車の通りも多くて危ない」ということから、うどん屋までの横断歩道を渡りきるのに挑戦するゲームを作りました。

今年は視点を変えて、「車を運転している人が、横断歩道を渡ろうとしている学生を轢かない」ように挑戦するゲームを作ることにしました。

学生でも車を運転する人がいるということを実感したことから、なんかこうなりました。

 

最近よく使っているのもあって、今回はUnreal Engine 4(UE4)で作ろうと思います。バージョンは 4.25.4 です。

この記事は、プロジェクトの作成から、プレイヤー、マップ、エネミーの作成までを書きます。後日、当たり判定や終了条件などの完成までを書きます(予定)。

 

 

Unreal Engine 4 について

Epic Gamesが開発しているゲームエンジンです。2021年にUnreal Engine 5がリリースされるとかで話題になっていますね。 

UE4で作られたゲームとしては、フォートナイト、ドラゴンクエスト11鉄拳7などがあります。ゲーム開発以外でも、アニメの背景制作などに使われています。

 

最大の特徴は、ブループリントと呼ばれる機能です。プログラミングの知識がなくても、感覚的に繋ぎ合わせて作ることができます。

他の魅力として、ハイクオリティーなグラフィック性能がよく挙げられます。感覚的な操作で作り込めるグラフィックが綺麗に創作可能なため、リアルな作品創作に向いているエンジンと認知されています。

 

では、さっそく作っていきます。

 

ゲーム制作

プロジェクトの作成

まず初めにプロジェクトを作成します。Unreal Engine4を開きます。 

 

新規プロジェクトのカテゴリに「ゲーム」を選択して、「次へ」を押します。

テンプレート選択で「サードパーソン」を選択して、「次へ」を押します。

「ブループリント、スケーラブルな3D・2D、レイトレーシング無効、デスクトップ/コンソール、スターターコンテンツ有り」にします。

これで作成は完了です。この時点で既に、実行するとマネキンを動かせます。

f:id:neokiex:20201215120425p:plain
f:id:neokiex:20201215120434p:plain

 

 プレイヤーの作成

今回、プレイヤーを車にしたいので、マネキンを消してキューブを追加します。

 「ThirdPersonBP/Blueprints/ThirdPersonCharacter」がプレイヤーキャラクターのファイルです。ダブルクリックで開きます。

 

マネキンの削除

ビューポートを開くとマネキンがいるので、これを消します。

コンポーネントの「Mesh」の「Skeletal Mesh」を黄色い矢印を押して空にします。

f:id:neokiex:20201215120847p:plain

ThirdPersonCharacter:マネキンの削除

 

車体のつもり(キューブ)の追加

「+コンポーネントを追加」から「キューブ」を追加します。

「CapsuleComponent」の子要素に追加して、回転と拡大・縮小を変更します。

f:id:neokiex:20201215120852p:plain

ThirdPersonCharacter:キューブの追加と設定

  

マップの作成

Unreal Engineでは、ゲーム中のフィールドのことをレベルと呼んでいます。このレベルの中に、いろいろと配置してマップを作っていきます。

 配置されているものは右上のアウトライナに表示されています。

 

要らないものを削除

「ArenaGeometry内全部」と「CubeMesh」、「TextRenderActor」はいらないので削除します。

f:id:neokiex:20201215121355p:plain

要らないものを削除した状態

 

マップの作成

アウトライナに「UdonMap」フォルダを作成して、マップを作っていきます。

 

[基本] → [キューブ]をレベルにドラッグします。

x軸100倍、y軸50倍、マテリアルを「M_Concrete_Tiles」に設定します。

こんな感じで作っていきます。

f:id:neokiex:20201215121401p:plain

UdonMap/Roadの作成

 

真ん中に植え込みがある、片側2車線の道路がいります。ぽんっ。

f:id:neokiex:20201215121409p:plain

 

歩道が要ります。横断歩道が要ります。ぽぽんっ。

f:id:neokiex:20201215121337p:plain

 

うどん屋がいります。ぽぽぽんっ。できました!

f:id:neokiex:20201215121343p:plain

 

各種オブジェクトの設定

それぞれの設定は以下のようになっています。

f:id:neokiex:20201215122852p:plain

アウトライナの状態

各種オブジェクトの設定

Panel1 Implantation1 Pedestrian3
[基本] → [平面]  [基本] → [キューブ] [基本] → [平面] 
f:id:neokiex:20201215122901p:plain f:id:neokiex:20201215122856p:plain f:id:neokiex:20201215122858p:plain
Sidewalk1 Udonshop Shop
[基本] → [キューブ]   [基本] → [キューブ] [基本] → [キューブ] 
f:id:neokiex:20201215122907p:plain f:id:neokiex:20201215122849p:plain f:id:neokiex:20201215122905p:plain

 

 エネミーの作成

Enemyクラスの作成

マップ上を歩くEnemyを作成します。

「右クリック」→「ブループリント」→「Character」を選択します。ファイル名はEnemyにしています。

「Mesh」の設定を変更します。位置Zを-90、回転Z-90を、アニメーションを、メッシュです。

f:id:neokiex:20201215124324p:plain

Enemy:「Mesh」の設定変更
Enemyクラスをワールドにスポーンさせる

メインツールバーで「ブループリント」をクリック、「レベルブループリントを開く」を選択します。

レベルブループリントは、レベルに固有で、レベル全体のグローバルグラフとしての役割を果たす、特別なタイプのブループリントです。

 

ゲーム開始時に、Enemyを1体スポーンさせるようにしています。

f:id:neokiex:20201215144323p:plain

レベルブループリントの状態

実行すると、マップ中央にマネキンが一体出現していると思います。

f:id:neokiex:20201215125254p:plain

マネキンが1体出現している様子

 

エネミーの動き作成

マネキンの動きを作ります。

簡単に、定期的にランダムな場所に移動するだけの動きを作ります。

 

必要なファイルの作成 

 エネミーの動きのパターンを組み立てる「ビヘイビアツリー」を作成します。

「右クリック」→ 詳細なアセットを作成「AI」→「ビヘイビアツリー」を選択します。ファイル名は「BT_Enemy」(BT:Behavior Tree)にしています。

 

エネミーの動きに必要な変数を管理する「ブラックボード」を作成します。

「右クリック」→ 詳細なアセットを作成「AI」→「ブラックボード」を選択します。ファイル名は「BB_Enemy」(BB:Black Board)にしています。

 

エネミーの動きの中身を作る「ビヘイビアツリータスク」を作成します。

「右クリック」→ 「ブループリント クラス」 → すべてのクラスで検索「BTTask_BlueprintBase」を選択します。ファイル名は「BTTask_GetMovePoint」にしています。

 

エネミーの動きをクラスに適用するのに必要な「コントローラー」を作成します。

「右クリック」→ 「ブループリント クラス」 → すべてのクラスで検索「AIController」を選択します。ファイル名は「AIC_EnemyController」にしています。

 

使用する変数の作成とビヘイビアツリーとの連携

BB_Enemyを開きます。

「新規キー」→「vector」を選択します。名前は「MoveLocation」にしています。

f:id:neokiex:20201215133814p:plain

BB_Enemy:使用する変数の作成

 

次に、BT_Enemy を開きます。

右の詳細タブの BlackBoard Asset に BB_Enemy を選択することで連携できます。

f:id:neokiex:20201215134001p:plain

BT_Enemy:BB_Enemyとの連携

 

エネミーの動きの作成

BTTask_GetMovePointを開きます。

左のタブから変数を作成します。変数の型を「BlackBoard Key」、名前を「BBK_MoveLocation」、インスタンス編集可能にチェックを入れます。

f:id:neokiex:20201215140428p:plain

BTTask_GetMovePoint:変数の作成

左のタブの関数から Receive Execute をオーバーライドします。

エネミーの座標を取得、ランダムな座標を取得、移動先座標を持っている変数 MoveLocation にキー BBKMoveLocation を使って格納、処理を終了という流れになっています。

f:id:neokiex:20201215140630p:plain

BTTask_GetMovePoint:動きの作成

 

動きのパターンを作成

 BT_Enemyを開きます。

ROOTとかの黒くなっているところから引っ張るとノードを作れるので、図のようにつくります。BTTask_GetMovePoint がさっき作ったタスクで、Move To と Wait は最初から用意されているタスクです。

左にあるノードから(右上の数字が小さい順に)処理が行われます。

f:id:neokiex:20201215141805p:plain

BT_Enemy:動きのパターンの作成

次に、BTTask で宣言した BlackBoard Key に変数を紐づけます。

BTTask_GetMovePoint と Move To に紐づけるキーがあります。

f:id:neokiex:20201215142524p:plain
f:id:neokiex:20201215142528p:plain
BT_Enemy:タスク内のキーへの変数の紐づけ

 

コントローラーへの設定

AIC_EnemyController を開きます。

図のように、使用するブラックボードの設定とビヘイビアツリーの実行を設定します。

f:id:neokiex:20201215143523p:plain

AIC_EnemyController:ブラックボードとビヘイビアツリーの呼び出し

 

Enemyクラスにコントローラーを設定

Enemyを開きます。

右の詳細タブのボーンから、Auto Process AI を Placed in World or Spawned、AI Controller Class を AIC_EnemyController に設定します。

f:id:neokiex:20201215143810p:plain

Enemy:AIControllerの設定

 

エネミーが動ける場所を設定する

2020/12/16 追記

左の「アクタを配置」タブから、「ボリューム」→「ナビメッシュ バウンズ ボリューム」をドラッグします。

位置を(0.0, 2000.0, 0.0)、拡大・縮小を(50.0, 50.0, 20.0)に設定します。

キーボードのPを押すことで、エネミーの動ける範囲が緑色で表示されます。

 

f:id:neokiex:20201216161910p:plain

ナビメッシュバウンズボリュームの設定

 

 

これでエネミーが動くはずです。本記事はここまでです。

f:id:neokiex:20201215150640g:plain

実行した様子

 

ソースコード

github.com

 

 

おわりに

Unreal Engine 4 を使用して簡単な3Dゲームを半分作りました。

 

適当にはっつけただけでもそれなりのマップが作れた気がしたり、敵の動きのあたりは初めて触ったりしたのでとても楽しかった。

サンプルが用意されていたり、面倒な部分を実装する必要がなくてとても楽だった。

 

当たり判定や終了処理が無くてゲームっぽくないので、そのうち作りたいと思います。

そのうちgithubのリンクも載せます。