UnrealEngine4を使って簡単な3Dゲームを作る(前)
2020/12/16 追記
はじめに
この記事は、香川大学創造工学部のプログラミングサークル SLP の アドベントカレンダー 2020 15日目の記事です。サークル生やOBの方々が繋いでいきますので、そちらもぜひ目を通していただけると嬉しいです。
昨年に引き続き、アドベントカレンダーへ参加させてもらえることになりました。
前回は、「うどん屋にお昼を食べに行く学生がよくいるが、うどん屋までの横断歩道に信号がなく、車の通りも多くて危ない」ということから、うどん屋までの横断歩道を渡りきるのに挑戦するゲームを作りました。
今年は視点を変えて、「車を運転している人が、横断歩道を渡ろうとしている学生を轢かない」ように挑戦するゲームを作ることにしました。
学生でも車を運転する人がいるということを実感したことから、なんかこうなりました。
最近よく使っているのもあって、今回はUnreal Engine 4(UE4)で作ろうと思います。バージョンは 4.25.4 です。
この記事は、プロジェクトの作成から、プレイヤー、マップ、エネミーの作成までを書きます。後日、当たり判定や終了条件などの完成までを書きます(予定)。
Unreal Engine 4 について
Epic Gamesが開発しているゲームエンジンです。2021年にUnreal Engine 5がリリースされるとかで話題になっていますね。
UE4で作られたゲームとしては、フォートナイト、ドラゴンクエスト11、鉄拳7などがあります。ゲーム開発以外でも、アニメの背景制作などに使われています。
最大の特徴は、ブループリントと呼ばれる機能です。プログラミングの知識がなくても、感覚的に繋ぎ合わせて作ることができます。
他の魅力として、ハイクオリティーなグラフィック性能がよく挙げられます。感覚的な操作で作り込めるグラフィックが綺麗に創作可能なため、リアルな作品創作に向いているエンジンと認知されています。
では、さっそく作っていきます。
ゲーム制作
プロジェクトの作成
まず初めにプロジェクトを作成します。Unreal Engine4を開きます。
新規プロジェクトのカテゴリに「ゲーム」を選択して、「次へ」を押します。
テンプレート選択で「サードパーソン」を選択して、「次へ」を押します。
「ブループリント、スケーラブルな3D・2D、レイトレーシング無効、デスクトップ/コンソール、スターターコンテンツ有り」にします。
これで作成は完了です。この時点で既に、実行するとマネキンを動かせます。
プレイヤーの作成
今回、プレイヤーを車にしたいので、マネキンを消してキューブを追加します。
「ThirdPersonBP/Blueprints/ThirdPersonCharacter」がプレイヤーキャラクターのファイルです。ダブルクリックで開きます。
マネキンの削除
ビューポートを開くとマネキンがいるので、これを消します。
コンポーネントの「Mesh」の「Skeletal Mesh」を黄色い矢印を押して空にします。
車体のつもり(キューブ)の追加
「+コンポーネントを追加」から「キューブ」を追加します。
「CapsuleComponent」の子要素に追加して、回転と拡大・縮小を変更します。
マップの作成
Unreal Engineでは、ゲーム中のフィールドのことをレベルと呼んでいます。このレベルの中に、いろいろと配置してマップを作っていきます。
配置されているものは右上のアウトライナに表示されています。
要らないものを削除
「ArenaGeometry内全部」と「CubeMesh」、「TextRenderActor」はいらないので削除します。
マップの作成
アウトライナに「UdonMap」フォルダを作成して、マップを作っていきます。
[基本] → [キューブ]をレベルにドラッグします。
x軸100倍、y軸50倍、マテリアルを「M_Concrete_Tiles」に設定します。
こんな感じで作っていきます。
真ん中に植え込みがある、片側2車線の道路がいります。ぽんっ。
歩道が要ります。横断歩道が要ります。ぽぽんっ。
うどん屋がいります。ぽぽぽんっ。できました!
各種オブジェクトの設定
それぞれの設定は以下のようになっています。
各種オブジェクトの設定
Panel1 | Implantation1 | Pedestrian3 |
[基本] → [平面] | [基本] → [キューブ] | [基本] → [平面] |
---|---|---|
Sidewalk1 | Udonshop | Shop |
[基本] → [キューブ] | [基本] → [キューブ] | [基本] → [キューブ] |
エネミーの作成
Enemyクラスの作成
マップ上を歩くEnemyを作成します。
「右クリック」→「ブループリント」→「Character」を選択します。ファイル名はEnemyにしています。
「Mesh」の設定を変更します。位置Zを-90、回転Z-90を、アニメーションを、メッシュです。
Enemyクラスをワールドにスポーンさせる
メインツールバーで「ブループリント」をクリック、「レベルブループリントを開く」を選択します。
レベルブループリントは、レベルに固有で、レベル全体のグローバルグラフとしての役割を果たす、特別なタイプのブループリントです。
ゲーム開始時に、Enemyを1体スポーンさせるようにしています。
実行すると、マップ中央にマネキンが一体出現していると思います。
エネミーの動き作成
マネキンの動きを作ります。
簡単に、定期的にランダムな場所に移動するだけの動きを作ります。
必要なファイルの作成
エネミーの動きのパターンを組み立てる「ビヘイビアツリー」を作成します。
「右クリック」→ 詳細なアセットを作成「AI」→「ビヘイビアツリー」を選択します。ファイル名は「BT_Enemy」(BT:Behavior Tree)にしています。
エネミーの動きに必要な変数を管理する「ブラックボード」を作成します。
「右クリック」→ 詳細なアセットを作成「AI」→「ブラックボード」を選択します。ファイル名は「BB_Enemy」(BB:Black Board)にしています。
エネミーの動きの中身を作る「ビヘイビアツリータスク」を作成します。
「右クリック」→ 「ブループリント クラス」 → すべてのクラスで検索「BTTask_BlueprintBase」を選択します。ファイル名は「BTTask_GetMovePoint」にしています。
エネミーの動きをクラスに適用するのに必要な「コントローラー」を作成します。
「右クリック」→ 「ブループリント クラス」 → すべてのクラスで検索「AIController」を選択します。ファイル名は「AIC_EnemyController」にしています。
使用する変数の作成とビヘイビアツリーとの連携
BB_Enemyを開きます。
「新規キー」→「vector」を選択します。名前は「MoveLocation」にしています。
次に、BT_Enemy を開きます。
右の詳細タブの BlackBoard Asset に BB_Enemy を選択することで連携できます。
エネミーの動きの作成
BTTask_GetMovePointを開きます。
左のタブから変数を作成します。変数の型を「BlackBoard Key」、名前を「BBK_MoveLocation」、インスタンス編集可能にチェックを入れます。
左のタブの関数から Receive Execute をオーバーライドします。
エネミーの座標を取得、ランダムな座標を取得、移動先座標を持っている変数 MoveLocation にキー BBKMoveLocation を使って格納、処理を終了という流れになっています。
動きのパターンを作成
BT_Enemyを開きます。
ROOTとかの黒くなっているところから引っ張るとノードを作れるので、図のようにつくります。BTTask_GetMovePoint がさっき作ったタスクで、Move To と Wait は最初から用意されているタスクです。
左にあるノードから(右上の数字が小さい順に)処理が行われます。
次に、BTTask で宣言した BlackBoard Key に変数を紐づけます。
BTTask_GetMovePoint と Move To に紐づけるキーがあります。
コントローラーへの設定
AIC_EnemyController を開きます。
図のように、使用するブラックボードの設定とビヘイビアツリーの実行を設定します。
Enemyクラスにコントローラーを設定
Enemyを開きます。
右の詳細タブのボーンから、Auto Process AI を Placed in World or Spawned、AI Controller Class を AIC_EnemyController に設定します。
エネミーが動ける場所を設定する
2020/12/16 追記
左の「アクタを配置」タブから、「ボリューム」→「ナビメッシュ バウンズ ボリューム」をドラッグします。
位置を(0.0, 2000.0, 0.0)、拡大・縮小を(50.0, 50.0, 20.0)に設定します。
キーボードのPを押すことで、エネミーの動ける範囲が緑色で表示されます。
これでエネミーが動くはずです。本記事はここまでです。
ソースコード
おわりに
Unreal Engine 4 を使用して簡単な3Dゲームを半分作りました。
適当にはっつけただけでもそれなりのマップが作れた気がしたり、敵の動きのあたりは初めて触ったりしたのでとても楽しかった。
サンプルが用意されていたり、面倒な部分を実装する必要がなくてとても楽だった。
当たり判定や終了処理が無くてゲームっぽくないので、そのうち作りたいと思います。
そのうちgithubのリンクも載せます。