UE4 ガンシューティングゲームを作ろう!その6 AI(ビヘイビアツリー)
はい!今回は敵に自動で行動させるために、敵のAIを作っていきたいと思います。
UE4には敵のAIを作るための便利な機能があります。今回はそれを使って、簡単なAIを作っていきましょう。最初に、前回作った敵が、近くにプレイヤーが来たら弾を撃つようにしてみます。
1.敵弾
まず、下準備に弾を作ります。いつものようにBluePrintを作ります。今回はActorを選択します。名前はEnemy1Projectileにします。
コンポーネントを追加をクリック。Sphere Collisionを追加します。これは当たり判定です。ほかにも四角やカプセル型の当たり判定があります。状況に応じて形を選びましょう!
次に球(Sphere)を追加します。これを当たり判定(Collision)の中に納まるように大きさを調整します。
好きなマテリアルを選びましょう!
当たり判定はすでにあるので、こちらのコリジョンはNoCollisionにしましょう。
このままでは弾は動かないので、動くようにしていきます。Projectile Movementを追加します。
これは弾が飛ぶためのコンポーネントです。弾の速度や重力、反射やバウンドなどの動きをシミュレーションしてくれる優れものです!今回はこれを使っていきます。
Initial Speed(初期速度を)200に、Projectile Gravity Scaleを0にします。これは速さ200の重力の影響を受けない弾といった感じです。
画像の通りに画面左上のMyEnemy1Projectileをクリックすると、詳細にInitial Life Spanが出てくるので、その値を20にします。これは発生してから何秒存在できるかを表しており、0ならずっと消えません。今回は弾が発生してから20秒後に消えるようになりました。
Event Graphに進み、先ほど追加したSphere(当たり判定のほう)を右クリックし、イベントを追加からOnComponentBeginOverLapを選択します。これは当たり判定が何かほかの当たり判定に重なったときに呼び出されるノードです。
このブログの「その3」で、敵を倒せるようにしたときのように、弾がプレイヤーに当たったときに爆発を発生させ、爆発を発生させてから弾を消すようにしましょう。このままではプレイヤーは何も食らわないので、プレイヤーの方にもプログラムを打っていきます。FirstPersonCharacterのブループリントを開きます。
今回はカスタムイベントというものを使っていきます。これは他のイベントや他のブループリントから呼び出して使うイベントです。引数(今回は「入力」と呼ぶ)という、イベントを呼び出すときに送る値の種類や数も変えることができます。
customと検索すると出てきやすいです。カスタムイベントを追加を選択します。
イベント名をDamageにし、入力の新規をクリック、Float型の変数damageを作ります。
Float型の変数HPを作ります。
コンパイルし、HPの初期値を10にします。
そしてこのようにプログラムを打ちます。HPをdamage分減らし、0以下になったらマップ選択画面に飛ぶ、というものです。もちろんゲームオーバー画面を作ってもいいですし、OpenLevelで今のレベルを指定して、最初からプレーさせるようにしてみてもいいでしょう。
では先ほどのMyEnemyProjectileに戻り、キャストノードの青からから線を引っ張りDamageイベントを探して選択します。
線をつなぎなおし、入力damageに1を入力します。
このことにより、弾に1回当たったらプレイヤーのHPが1減るようになります。この入力を2にするともちろん2減ります。ほかの種類の弾を作って、プレイヤーと当たったときにこのDamageイベントを呼び出して入力damageを変えると威力の違う弾が作れます。カスタムイベントは非常に便利ですね!
2.敵のAI(1)
次に今回のメインである、ビヘイビアツリーを作ります。BluePrintフォルダを選択し、新規追加をクリックします。そこから未分類を選び、ビヘイビアツリーを作成します。
名前はMyEnemy1Behaviorにします。
次にブラックボードを作ります。名前はMyEnemy1BlackBoardにします。
これはAIの行動のプログラムで使う変数を保存するためのものです。実際に使って慣れていきましょう!
では先ほど作成したビヘイビアツリーをダブルクリックし、エディタ画面を開きます。
これがビヘイビアツリーのエディタ画面です。真ん中にあるルートがAIの思考の始まりになります。難しいことは考えず、まずは先ほど作ったブラックボードを選択します。
では変数を作っていきます。画面右上のブラックボードをクリックします。
これがブラックボードの画面です。変数を作るときは、新規キーをクリックします。
今回は弾を撃つかどうかを決める変数を作るので、TrueかFalseの値を持つ、Boolean型の変数を作ります。ブランチノードで使ったやつですね。変数名はDoShotにしておきます。
これで準備が完了したので、実際にAIの行動を作っていきます。まず「プレイヤーが近くにいるかを判定し、近くにいるならDoShotをTrueにし、そうでなければFalseにする」ような行動を作ります。新規タスクをクリックします。
そうするとブループリントが開かれます。ここにプログラムを打っていきます。ブラックボードで作った変数を使うための変数を作ります。変数の型BlackBoardKeySelectorにします。ここで必ず変数を編集可能にしてください。
プログラムの開始点を作ります。Event Receive Executeノードを出します。
そして以下のようにノードを組みます。赤色で囲っている部分はこのAIを使っているアクター、つまりEnemy1の位置を取得しています。なかなかに複雑になっていますが、意味は単純です。緑色で囲っている部分は、プレイヤーの位置を取得しています。青色で囲っている部分は、その二つの位置の距離を取得し、その長さが2000以下かどうかを判定しています。
その結果をブランチにつなぐことで、Trueなら近くにいて、Falseなら遠くにいるということが分かります。
ブランチのTrueとFalseの両方にSet BlackBoard Value as Booをつなぎます。Trueの方はチェックをつけて、Falseの方はチェックを外してください。KeyにはDoShotをつなぐのを忘れずに!
最後にFinishExecuteノードをつないでください。その際に、Successにチェックを入れておいてください(あとで解説します)。このノードはAIの行動が終わったということを指し示すノードです。
ビューポートに戻って、タスクの名前を決めましょう。タスクのブループリントを右クリックして、名前を変更を選択します。
デフォルトではBTTask_BluePrintBase_Newになっているので、BTTask_MeasureDistanceにします。
では作ったタスクをビヘイビアツリーで呼び出してみます。
ビヘイビアツリーを開き、ルートの下部分をドラッグし、適当なところで離します。すると、ブループリントの時のように選択肢が出てくるので、今回はSequenceを選びます。
SequenceやSelectorはコンポジットと呼ばれ、ノードの流れを制御するものです(これも後で解説します)。
同じようにSequenceノードの下を引っ張ります。先ほど作ったタスクを選択します。
このタスクで使う変数を指定します。DefaultでDoShotの欄をDoShotにします。おそらく初めから指定されていると思いますが、よく忘れるので確認をしておきましょう。
では、先延ばしにしていた解説をします。
Sequenceノードはタスクを左から順番に評価(実行していきます)。例えば以下の写真の場合、BTTask_MeasureDistanceを実行し、次にBTTask_BluePrintBase_Newを評価します。
しかし、先ほど作ったタスクのSuccessフラグによって動きが変わります。もしBTTask_MeasureDistanceがSccessにチェックが入ったFinishExecuteノード終わればそのまま次のタスクを評価するので、BTTask_BluePrintBase_Newが評価されます。逆にチェックが入っていなければ、評価は終わり、BTTask_BluePrintBase_Newは評価されません。
Selectorの場合は、左から評価していくのはSequenceと変わりません。
もし上の画像の時、BTTask_MeasureDistanceがSuccessにチェックが入ったFinishExecuteノードで終了した場合、Selectorノードは左からの処理を終了します。なので、BTTask_BluePrintBase_Newは実行されません。
逆にBTTask_MeasureDistanceがSuccessにチェックが入っていないFinishExecuteノードで終了した場合、BTTask_BluePrintBase_Newが実行されます。
次は弾を撃つタスクを作りましょう。名前はBTTask_Shotにしましょう。
またEnemy1の位置とプレイヤーの位置を取得します。そして緑色に囲まれたノードなのですが、これはStartにつながれた位置からTargetにつながれた位置の"方向"を指す回転の値(Rotator)を返すノードです。
つまり今回の場合、Enemy1からプレイヤーの方向を指すRotatorが出てきます。これはどの方向に弾を撃ちだすかというのに必要な値になります。
それらが繋げましたら、次は弾を撃った時の音を鳴らします。Play Sound at Locationノードです。これは選択した音声ファイルを指定した位置から流すというものです。
今回はFirstPerson_WeaponFireを選択し、Enemy1の位置を指定します。
次は実際に弾を発射するノードを作ります。spawnと検索すると、「クラスからアクタをスポーンします」というのが出てくるかと思います。これはアクタをワールドに作りだすというものです。敵などはビューポートで直接設置しましたが、弾などはこうしてプログラム内でスポーンさせます。
このノードではどのクラス(ブループリント)をアクタとして生成するかを選びます。今回は弾を作り出したいので、MyEnemy1Projectileを選択します。
次はTransformを指定します。これはアクタに必要な
位置(Location)、回転(Rotation)、大きさ(Scale)、をまとめたものです。スポーン時には最低でも位置だけは指定する必要があります。しかし今回は回転もほしいので、Transformを作ります。Spawn Transformから線を引っ張り、MakeTransformノードを出します。
今回は位置をEnemy1の位置にして、回転を先ほど作ったEnemy1からプレイヤーの方向にします。
最後に忘れずにFinishExecuteノードを作ります。Successにチェックしておきましょう
これで弾の発射のタスクは完成です。ではDoShotがTrueの時にBTTask_Shotを呼び出してみましょう。
Sequenceノードから新しくSequenceノードを作ります。新しく作ったSequenceノードを右クリックして、デコレーターを追加からBlackboardを選択します。デコレーターとはブランチ(if文)のような条件文です。今回はBlackboardのDoShotの値がTrueなら弾を撃ちたいので、Blackboardを選択しました。
Blackboard Based Conditionをクリックし、Blackboardの欄のKey QueryをIs Setに、BlackboardKeyをDoShotにします。Is Setは選ばれた変数がTrueの時に処理をするという意味です。
では先ほど作ったBTTask_Shotを出します。
このままでは弾を1フレームに撃ちまくるので、ゲームとしても面白ありません。なので弾を撃った後にしばらく待ってもらおうと思います。
ビヘイビアツリーにはデフォルトで"待つ"というタスクがあります。Waitタスクです。
このタスクは、入力されたWaitTime分待つというタスクです。そのままですねw
これにてAIは完成です!最後にAIをEnemy1に適応していきましょう。
キャラクターにAIを搭載するときは新規のブループリントからAIControllerを作ります。名前はEnemy1AIControllerにします。
EventGraphのイベントBeginPlayからRun Behavior Treeをつなぎます。
先ほど作ったMyEnemy1Behaviorを選択します。
これでAIControllerは完成です。MyEnemy1を開きましょう。
AI Controller Classを先ほど作ったEnemy1AIControllerにします。
これにて完成です!!敵に近づくと、弾を撃ってきます。
3.敵のAI(2)
どうせならプレイヤーに向かって歩いてくる敵も作ってみましょう!以下のブループリントをコピーします。コントロールキーを押しながらクリックして、複数選択し、右クリックから複製を選んでください。
今回はたくさんの要素を使ったので、復習を兼ねて以下のように変更していきましょう。
これはプレイヤーの位置を保存する変数です。
ではプレイヤーの位置を感知するタスクを作っていきます。名前はBTTask_FindTargetにします。
以下のようにプログラムを打ちます。プレイヤーの位置を取得して、それを変数を使ってブラックボードの変数に格納しています。
ビヘイビアツリーで呼び出します。このShotの前に移動したいので、いったん下の画像のようにALTキーを押しながらタスクの上の部分をクリックして線をなくします。
ここで呼び出します。画面右上のTargetPointをTargetPointに変えます。(僕が良く忘れるポイントです…)
ここで実際に移動するタスクを呼び出します。Waitタスクのようにこれもデフォルトで用意されているタスクです。Move Toタスクをつなぎます。
このようにVector型の変数を与えることによってその場所まで移動してくれるものです。障害物があったりしてもよけてくれるという優れものです!
こうなりました。
実はこれだけでは動いてくれません。動かすにはフィールドのどこまでが動ける範囲なのかを指定する必要があります。
ビューポートでNav Mesh Bounds Volume(ナビゲーションメッシュ)を見つけて、マップに設置します。
このようにマップ全体を覆うといいでしょう。
ここでキーボードのPキーを押すと、以下のように移動可能なところが緑になります。これでAIが動いてほしい場所が緑になっているかを確認しましょう。坂が急であったりすると移動不可なことが分かります。
これで動いてくれるようになりました!
敵がムーンウォークしてくるのが嫌であれば、アニメーションを使いましょう。ビヘイビアツリーではアニメーションも再生することができます。
PlayAnimationを使います。画面右側に出てくる詳細では、Animation to Play(どのアニメーションを使うか)、Looping(アニメーションを繰り返させるか)、Non Blocking(再生が終わるまで次の処理をするか)を決めることができます。
今回は歩くアニメーションであるWalk_Fwd_Rifle_Ironsightsにします。歩くアニメーションはループさせ、アニメーションを再生させながら移動させたいので、両方にチェックを入れます。(なんか画像がおかしくなっていますが気にしないでください…)。
次は弾を撃つアニメです。Fire_Rifle_Ironsightsにします。ループせず、再生完了後に次に進ませずにしたいので、チェックを外します。
これで障害物を避けながらプレイヤーを追いかけてきて、止まった地点でプレイヤーと近かったときに弾を撃ってくるようになりました!
はい!今回はこれで以上です!!今回は敵のAIを主に作成しました。敵が自動で動くようになると一気にクオリティが高く見えますね。敵だけでなく、味方を作ることもできます。ぜひいろんなAIを作成してみてください!!
4.まとめ
・弾を自作しました(ProjectileMovement)
・カスタムイベントを作り、使いました
・敵のAIを作りました。キーワード:(ビヘイビアツリー、ブラックボード、AIController、タスク、コンポジット、デコレーター、ナビゲーションメッシュ)
今回は久しぶりの投稿というのもあって、がっつりボリュームになったかと思います。しかしゲームではほぼ必須であるAIなので長くなるのは仕方ないですね。AIはいろんな行動を追加していくにつれて、ゲーム自体を多様で想像もつかないものにしてくれます。つまり面白くなるということですねwどんどん応用して面白いゲームにしていきましょう!!
では、今回はこの辺で!
UE4 ガンシューティングゲームを作ろう!その5 トリガーボックス
はい!今回はある場所に行くだけでイベントを起こすことができる、トリガーボックスを使っていこうと思います。
この機能を使うと様々なことができます。
今回はこれを使って、Splineの速さを変えたり、普通に歩いている状態からSpline移動に切り替えることなどをやっていきます。(UE4 ガンシューティングゲームを作ろう!その2の作り方でつくったSplineを使いますが、全然違うことにも応用できます)
早速やっていきましょう。レベル編集画面の画面左側のモードからトリガーボックスを見つけます。トリガーと検索すると楽ですね。
好きな形を選んでください。僕はボックストリガーを使用します。
これをここに来たらイベントを起こしたいという場所に、ドラッグ&ドロップで設置します。ほかの物体と同じように場所や大きさを変えられるので調整してみましょう。(僕ははSplineの速さを変えたいのでSpline上に設置しました)
この緑色のトリガーに何かが当たったらイベントが起こせます。
このトリガーを選択したままレベルブループリントを開きます。
レベルブループリントはそのレベルでのイベントをまとめて制御することができます。ここで記述したことは基本的にほかのレベルには影響しません。
今まで使ったBPと同じような画面が出てきますね。ここで適当なところで右クリックをして、Add Event for (先ほど設置したトリガー名前)からCollisionを開き、のOn Actor Begin Overlapを出します。検索するのもいいですね。
するとこんなノードが作れます。このノードの先には何に当たったらイベントを起こすか、そしてそのイベントの内容を書いていきます。
今回は1例としてプレイヤーに当たったらSplineの速度を変えるようにします。
このようにノードをつなげます。一番右のSetノードはキャストノードの青いところから線を出して作ってください。これだけで完成です。
これはFirstPersonCharacterがトリガーと重なったとき、FirstPersonCharacterの持つ変数Speedの値を変えるというプログラムです。Splineで坂道を作って、上に上がるときはSpeedを下げるトリガーを作って、下に下がるときはSpeedを上げるトリガーを作ると、ジェットコースターみたいになって面白いので、興味がある方は作ってみるといいでしょう。
トリガーは主にこのようにアクターにキャストして使います。キャストはよく使いますし、いろいろ調べてみると面白いと思います。
ここからはゲームに一味加えていこうと思います。普段は普通に移動できるようにし、Splineのスタート位置に行くと、Spline移動に代わるようにしたいと思います。
まず普通に移動するには、マップでFirst PersonCharacterを選択し、DefaultのSplineをなしにします(クリアを選ぶとなしになります)。
こういったあるレベルに設置した特定のアクタ(ここではSpline)をゲーム内で動的に変更したい場合はレベルブループリントを使います。
今回はトリガーを使ってSpline移動に切り替えます。一番最初にSplineの始点がプレイ中でもわかるようにしてみます。
MySplineActorを開きます。コンポーネントを追加で目印になるものを追加します。僕ははStaticMeshを選びました。
StaticMeshは以下のように様々な形のものを取り扱うことができます。今回は元から用意されているSM_AssetPlatformを選びました(それっぽかったのでw)。
設置できたら位置や大きさなどを調整します。以下のようにMaterialを変えても面白そうですね!
これでSplineの始点が分かりやすくなりました。
では先ほどのようにトリガーを設置します。こんな感じでスタート位置に合わせて小さくするのがおすすめです。
先ほどのようにFirstPersonCharacterにキャストします。
先ほどSpeedの値を変えたように、Splineの値を変えます。キャストノードの青いところから線を出し、SetSplineです。
Splineの値ですが、ここではマップで設置したSplineを指定しなければなりません。なので、マップで設置したトリガーをレベルブループリントに持ってきたように、SplineもレベルBPに持ってきましょう。
このように参照にしたいSplineを選択した状態で、レベルBPを開きます。
適当な場所で右クリックし、(参照にしたいSpline名)のリファレンスを作成を選択します。
最後にこの値をSetして完成です。
これでプレイすると、普通に歩けて始点に行くとSpline移動になりようになりました!
はい!今回はこれで以上です!!今回はある場所に行くだけでイベントが起こせるようにしました。ムービーが始まったり、敵が出てきたりと応用範囲は広いと思います。ぜひ、もっと掘り下げてみてください。
まとめ
・トリガーボックスを使いました
・トリガーボックスに何かが当たるとイベントが発生するようにしました
・Splineの速さや参照を動的に変えられるようにしました
・StaticMeshを使いました
・レベルブループリントを編集しました
・マップに設置したものを直接参照にしました
※レベルブループリント(設置したトリガーによって変わります)
今回はこの記事のその2の拡張になりましたが、それ以外の応用は幅広いです。
では、今回はこの辺で!
UE4 ガンシューティングゲームを作ろう!その4 視線選択
はい!今回は視線だけでイベントが起こせるようにしたいと思います。視線選択機能を作る過程で今日もUE4の素晴らしい機能を覚えていきましょう!
スマホなどのゲームはタッチやスライドくらいでしか入力が取れません。なので、視線だけでボタンのオンオフが制御できたら、それだけ入力の方法が増えるということですね。
特にVRコンテンツを作るときは画面がタッチできないことがあるので、その時に視線選択を使うと大変便利です。(なぜタッチできないのか→ハコスコ様 こちらを見ていただけるとわかると思いますが、スマホがカードボードに覆われます。)
スマホでなくても色々な用途に使えそうですね。それでは早速作っていきましょう!!今回は、ぶっさん様の記事を参考にさせていただきます。
まず、First Person Character(プレイヤー)のBPを開きます。
開きましたらEventGraphを開きます。
すると前作ったSpline移動のBPがあります。ここあたりにノードを追加していくので、混ざらないようにこれをまとめてしまいましょう。
1.まとめたいノードたちをドラッグして囲います。
2.どのノードでもいいので、選択したノードの一つにカーソルを合わせた状態で右クリックします。するとノードアクションが出てくるので、選択対象からコメントを作成するを選択します。
3.コメントが出てくるので、好きな(わかりやすい)コメントを打ちます。今回Spline移動にしました。
これでかなり分かりやすくなりました。
それではまず、プレイヤーの視線に当たり判定をつけます。
今回もSplineの時と同様にイベントTickを使います。しかし、これは1つしか使えないので、シーケンスというものを使っていきます。
Spline移動の初めにあるイベントTickから線を引っ張り、シーケンスを出します。
これは右のThen0を最初に実行し、そのあとThen1,Then2...と続けて実行することができます。Thenを増やす時はピンを追加をクリックします。
これを使わなくてもできないこともないですが、プログラムが見やすくなるので、こういう時はシーケンスがおすすめです。
ではThen1から線を引っ張り、下あたりで離しましょう。そこでLine Trace by Channelを出します。
このノードはStartで指定した場所からEndで指定した場所まで、当たり判定(コリジョンを発生させ、当たった情報をOut Hitから出力してくれるノードです。(個人的に、スパイ対策の当たったら警報が鳴るレーザーにも使いたいノードですw)
なので今回はプレイヤーの目の位置(Cameraの位置)をStartに、Playerの視線の先(Cameraの向き)をEndに指定しましょう。
まずGet Player Camera Managerでプレイヤーのカメラを取得します。
それをGet Actor Locationをつなげることでカメラの位置をGetし、それをスタートにします。
それと、Get Actor Forward Vectorにつなぐことで、カメラの向きをGetし、それに5000かけます(Vector*Float)。それをカメラの位置に足すことで、カメラの位置から向いている方向に5000進んだ位置を求めることができます。これをEndにつなぎます(ぶっさん様の記事に詳しく書かれています)。5000の値を変えることで距離も変えることができます。
Trace ChannelをCameraに、Draw Debug TypeをFor Durationにしましょう。ここで、コンパイルをしてプレイしてみてください。
赤い線がたくさん出てきて、何かに当たると緑になるかと思います。(Draw Debug TypeをNoneにすれば線が透明になります)
しかし、まだものを見ても何も起こりません。簡単に作れるイベントは、敵を見ただけで撃つことができるイベントです。
Out HitからBreak Hit Resultを出します。そこのHit ActorからMyEnemy1にキャストします。
キャストノードの右の一番上から線を出し、もとから作られているSpawn projectileのMontage Playにつなげます。
これで完成です。プレイするときはかなり重くなるので注意してください。敵を見ただけで弾がたくさん発射されますね。
これではバランス崩壊です。ここでバランス調整として、弾が出る感覚を大きくしましょう。Float型の変数ShotWaitTimeを作り、以下のノードを追加します。
大事なところは2枚目の写真のGet World DeltaSecandsのところです。これに関してはalwei様の記事を読んでみてください。このノードは前回イベントTickが呼び出された時間から今回呼び出されるまでの時間をFloat型で返してくれるものです。ちょー簡潔にいうと、どのプレイ環境(パソコンやスマホ)でも同じ速度で弾を発射するためにつけました。
こういった感じでバランス調整をしてみましょう。
次はしばらく見続けるとスイッチが押せるというものを作ってみましょう!こまめにセーブをして、適度な休憩を取ってくださいね。
まずはゲージ部分を作っていきます。コンテンツブラウザの新規作成をクリックし、ユーザーインターフェースからWidgetブループリントを選択します。
するとWidgetブループリントが作成されるので、名前をMyWidgetとしておきましょう。
MyWidgetを開きます。Widgetはおもに2Dの部分を作るときに便利です。今回のようなゲージを作ったり、ほかにもボタンを作ったりすることができます。
画面右上にデザイナーとグラフというボタンがあります。デザイナーは下の画像のように、見た目や配置などを操作することができます。グラフでは今まで触ってきたBPのように、実動作を制g穂することができます。
今回はデザイナーだけを触ります。
画面左のパレットからProgress Barを見つけて、真ん中の画面の点線の中にドラッグ&ドロップします。
プログレスバーの周りに白い点がついているので、左ドラッグして点線の枠と同じかそれより少し大きいくらいに調整しましょう。
これでゲージのもとは完成しました。
では次はプレイヤーにみられるとこのゲージを出現させ、青いゲージがためて、そのゲージがマックスまで行くとイベントを発生させるアクターを作っていきます。MyWidgetはコンパイルとセーブをした後、閉じてもらって構いません。
いつものようにブループリントから新規のブループリントを作成します。今回はActorにします。名前はMyWidgetActorにします。(下の画像は前々回の使いまわしですw)
まずみられるための本体を作ります。BPが開けましたら、コンポーネントを追加を押し、球やキューブを追加してください。(一番下にコーンやシリンダーがあるので、好きなものを選びましょう。僕は球にしてみました)
次はゲージ(Widget)を追加します。同じくコンポーネントを追加からWidgetを選択します。
このままでは何も表示されません。先ほど作ったMyWidgetを出しましょう。
画面右側の詳細タブからWidget Classを見つけます。デフォルトではNoneになっているので、MyWidgetに変更します。
すると先ほど作ったMyWidget が表示されます。好きなように大きさや位置を変えてみましょう。見やすくするのがポイントです。
僕は球の上に表示されるようにしました。お好みでどうぞ!
次はプログラム部分を触っていきます。
まずBoolean型の変数Flagと、Float型の変数Percentを作ります。Booleanの変数は、TrueとFalse2つの状態しか持てません。これはOn,Offのフラグに使うためのものだからです。主にブランチ(if文)とともに使われます。
今回Flagは、プレイヤーにみられているかを記憶し、Percentはゲージがどこまで進んでいるかを記憶します(物体をしばらく見続けるとPercentの値が大きくなり、決めた値まで行くとイベントを起こすようにするためのものです)。
プレイヤーにみられているか見られていないかで処理を変えるので、ブランチを作り、以下のようにつなぎます。
見られていればTrueに、そうでなければFalseに行くとします。
ここで見られていればPercentの値を大きくする処理を書いていきます。色々なやり方がありますが、便利なものがタイムラインです。百聞は一見に如かずということで早速使ってみましょう。
Trueから線を出し、Timelineと打ってタイムラインを追加するをクリックします。(タイムラインについてもっとよく知りたい方は、こちらのなつのや様の記事をお勧めします)
こちらがタイムラインです。たくさんつなぐ部分があるので戸惑うかもしれませんが、とても便利なので軽く使ってみましょう。タイムラインのノードをダブルクリックします。
するとタイムラインの編集画面が出てきます。もとの画面に戻るときは真ん中の画面の上のタブにあるEventGraphをクリックです。逆にタイムラインを開きたいときはタブのタイムラインをクリックです。
これがタイムラインです。左上にある「f+」みたいなボタンをクリックしましょう。これはフロートトラックを新しく作るもので、これでFloat(フロート)型の変数Percentの値を変えていきます。名前は何でもいいですが、そこまで重要ではないので、僕はデフォルトのままにしました。
すると中央部に、何やら数字が書いたトラックが出てきます。これはx軸が時間(s)で、y軸が値になります。右ドラッグで画面を動かしたり、スクロールで画面のズームを変えることができます。ほかの画面と同じ操作ですね。
トラック内でShiftキーを押しながら左クリックでポイントを打つことができます。下の画像のように打ってみましょう。
上の画像では時間が-0.002の時値が0.011になるように点を打ちました。このように点の位置によって時間ごとの値を決めることができます。
次は5秒で値が0.265付近になるように点を打ちましょう。すると原点からゆっくり値が上がるように線が引かれます。これで時間当たりの値の変化のグラフが完成しました。
最初に作った点をクリックすると、点の場所調整ができます。下の画像の赤丸の場所の数値を変えることでも調整ができます。今回はしっかりとした値に調整します。
1つ目の点を、時間0,値0にし、2個目の点を時間5、値0.265にしましょう。あとから変えられるので、完成してからプレイをして調整してみてください。
タイムラインの設定は以上です。Event Graphに戻ってFalseをReverseにつなぎます。
タイムラインのPlayはタイムラインを動作させ、時間の値を増やしていきます。Reverseはタイムラインを動作させ、時間の値を減らしていきます。Play from Startは時間がすでに増えていても一度リセットしてから時間を増やしていくもので、Stopは時間の加減算を止めます。ほかにもいろいろな機能があるので、ぜひマスターしてください。
時間当たりの値は下の画像でいうNew Track 1から出てきます。この値をそのまま使ってもよいのですが、便利なのでPercentに保存しておきましょう。
次はこのPercentの値をプログレスバーに送り、わかりやすく色がつくようにします。この記事の最初の画像のバーの青い部分を作ります。
他のブループリントにつなげるためにはキャストを使います。今までに何度も使ってきましたね。SetノードからMyWidgetへキャストするを選びます。
画面左下にあるWidgetをドラッグ&ドロップします。そこから線を引っ張り、Get User Widget Objectを選択します。
そして下の画像のようにObjectにつなぎます。
そしてAs MyWidgetから線を出し、Get Progress Bar ~を出します。このように先ほど設置したプログレスバーをGetします。
このGetしたプログレスバーのPercentを指定するだけで青い部分を作ってくれるノードがあります。今回はそれを使います。GetノードからSet Percentを出します。
先ほどPercentに値を格納したので、Percentの値を取得し、プログレスバーに送ります。
ではここでFirst PersonCharacterのBPを開きます。MyWidgetActorをみたらFlagをTrueにする処理を書いていきます。
Line Trace by ChannelとSetノードの間にシーケンスを追加します。先ほどいじった部分ですが、ごちゃごちゃしているので探しにくいですが頑張りましょう。コメントをつけると探しやすいと思います。コメントの作り方はこの記事の最初のほうで書いています。
Then0を先ほど作ったノードにつなぎ、Then1を視線選択に使いましょう。そうすると、Then0を切断するだけで敵を見ても勝手に弾を発射しなくなります。このひと手間で管理がしやすくなりますね。
Then1から線を出し、MyWidgetActorへキャストするを出します。
As My Widget ActorからSet Flagを出します。これは先ほど作ったBoolean型の変数です。Setノードのチェックを忘れずにつけましょう。このチェックはTrueという意味です。チェックがついていないとFalseになります。
最後にHit ActorをObjectにつなげます。
まだ完成ではありませんが、ここで設置して確かめてみようと思います。SplineのSpeedを0にしてSplineのスタート位置に設置すると確かめやすいです。Widgetは前からしか見えないので、回転させて見えるようにします。物体を回転させるにはビューポート上部のいかにも回転というボタンをクリックして、回転させたい方向に対応している扇形をドラッグします。
そしてプレイすると、ゲージが増えていくようになりました。しかし視線をそらしてもゲージが減りませんし、何も起こりませんね。
またMyWidgetActorを触っていきます。タイムラインとTrueの間でFlagをFalseにします。見続けることでこのFalseをTrueにできますが、見なくなると途端にFalseになり続けるといった感じです。
これだけで別のものを見るとゲージが減るようになりました。次はマックスまで行くとイベントが発生するようにします。
Finishedから線を出し、以下のようなノードを打ちます。
Percentが0.265より大きくなったらTrueにつながるので、Trueの先に繋げたことがマックスまで行ったイベントになります。タイムラインの値を変えた人は(~より大きくなった)の~の部分を変えるといいと思います。
今回はOpen Levelを使います。これは名前の通りLevelを開くノードです。
OpenLevelノードに直接Level名を打ってもいいのですが、その名前を変数化すると便利です。名前型の変数Level Nameを作ります。編集可能にしっかりとチェックをつけてください。
Default名をとりあえずMyLevelにしてノードをつなぎます。
これでゲージがマックスまで行くとMyLevelに飛ぶようになりました。同じレベルに飛んでいるので感動が薄いですが、別のレベルに飛ぶことも可能です。
BPではゲームプレイ中に物体を見えなくしたり、見えるようにしたりすることができるノードがあります。それを使ってゲージの値がが0より大きいときゲージが見えるようにして、0以下の時見えなくしたいと思います。
案外どこでもいいのですが、ここにプログラムを打っていきます。このブランチでTrueのとき見えるようにして、そうでないとき見えないようにします。
Trueから線を引っ張り、Set Hidden in Game(Widget)を出します。Falseの先にも同じように出します。
このノードのNew Hiddenのチェックをつけると消え、チェックをつけないと見えるようになります。以下のようにしましょう。
これで青い部分があるときには見えるようになり、数値が0になると見えなくなります。
しかしウィジェットは見えないだけで存在はしているので、この際当たり判定を消してしまいましょう。
画面左のWidgetをクリックし、右側に詳細を出します。詳細のCollisionのコリジョンのプリセットをNoCollisionにします。これで当たり判定がなくなりました。
これでほとんど完成ですが、実はこれでは不具合が生じてしまいます。視線選択に使ったLine Trace by Channelですが、これは最後に線に当たったものをOutHitから出します。なので、敵を観た後に地面などの他の物体に線を当てずに素早く空を見ると、ずっと弾を撃ち続けてしまいます。視線選択も同じで、ゲージが増え続けてしまいます。
色々な解決法がありますが、今回はLine Trace by Channelで作った当たり判定の線の終点に、其れだけに反応する(敵や弾は貫通する)ダミーのアクターを置いて解決しようと思います。
ブループリントからActorのBPを作ります。名前はMyDummyActorにしました。
BPを開いてコンポーネントを追加から球を選びます。
このアクタは常に視線の先の末端にいてほしいので、そのようにプログラムを打っていきます。どうせなのでコピーを使ってみましょう。
First Person Characterを開き、下の画像の赤丸の部分を範囲選択し、右クリックからコピーを選びます。(WindowsではCTRL+Cでもできます)
またMyDummyActorに戻り、適当なところで右クリックし、ここに貼り付けをクリックすると、貼り付けができます(CTRL+Vでもできます)。
イベントTickからSet Actor Locationを出します。これはActorの位置をダイレクトに決めるものです。今回は視線の5000進んだところに位置をSetしています。
これでプログラムは完成です。次はこれを見えなくして当たり判定を変えていきます。
見えなくするには画面左にあるMyDummyActorをクリックし、詳細のRenderingにあるActor Hidden in Gameのチェックを入れることで消せます。
先ほどのようにゲーム内で見えたり見えなくしたいのならばプログラムで、ずっと見えなくするならこちらのように設定するといいでしょう。
次は当たり判定を変えていきます。画面左のSphereをクリックし、詳細を出します。詳細のCollisionからコリジョンのプリセットを変えます。その前に今回はいつもよりも細かくいじるので、コリジョンのプリセットの左にある▷ボタンを押してより細かい詳細を出します。
コリジョンのプリセットをCustomにしますこれにより、自分独自の当たり判定を作ることができます。今回はほとんどの物体には反応してほしくないので、コリジョン応答を無視するにして、一度すべての当たり判定をなくします。
このままでは何にも反応しないので、Line Trace by Channelで出した当たり判定に反応するようにします。
First Person CharacterのLine Trace by Channelノードです。
ここでTrace ChannelをCameraに設定したので、Cameraの部分だけブロックにチェックを入れます。
最後にCollision EnabledをNo Physics Collisionにします。
これで完成です。マップに適当に1つ設置すると、自動で視線の先の末端に移動して仕事をしてくれます。
どうせなのでステージ選択画面を作ってみます。
MyLevelに戻ってファイルから新規レベルを作成します。今回もDefaultを選びます。名前はSelectLevelにしました。
ここで復習です。プレイスタートを消去し、FirstPersonCharacterを設置し、それをプレイヤーにしてみましょう。
設置した後、PawnのAuto Process PlayerをPlayer0にするんでしたね。これについてはこの記事のその2にわかりやすく書いていますので、わからない方はどうぞ。
ここでプレイするとなぜかプレイヤーが地面に埋まってしまいます。それはなぜかというと、SplineがないのにSpline移動をしようとしているからです。どうせなので治しましょう。
変数からSplineを取得し、MySplineActorにキャストします。このSplineの値があればキャストに成功し、正しく動作します。Splineの値がなければCast Failedに行き、そこで処理が終わります。なのでマップにSplineがあっても下の画像のようにSplineの値をなしにしているとSplineに関係なく自由に動くことができます。
このちょっとしたノードで普段は普通に操作できて、一定の場所に行くとSpline移動になるなんてことも可能になります。
では視線選択を設置していきます。
このようにどのレベルに飛ぶのかを変数化したおかげで、複数個おいてそれぞれ別のレベルに飛ぶようにしてみました。左がMyLevelで右がSelectLevelです。
DefaultをSelectLevelにしてもいいかもしれませんね。こちらはその1でやり方が書いてあります。もう一つLevelを作って別のコースを作ってコースを選べるようにしてもいいかもしれませんね!
はい!今回はこれで以上です!!回を重ねるごとに長くなっている気がしますが気にしないでおきましょう。こまめなセーブ、こまめな休憩が大事です(まあやりたいときにやるのが一番だと思いますが…)。
まとめ
・プログラムをコメントでまとめました
・シーケンスを使いました
・視線に当たり判定をつけました。
・敵を見ただけで撃つようにしました
・どの環境でも同じ速さで動作するようにしました(自動で弾が出てくる速さ)
・Widgetを作成しました
・視線選択を作りました
・レベルを飛べるようにしました
・タイムラインを使いました
・物体の表示非表示を切り替えました
・当たり判定をより深く制御しました
・Splineを改良しました
※FirstPersonCharacterの追加分
※MyWidgetActor
※MyDummyActor
今回もたっぷりボリュームになったかと思います!次回はある場所に行っただけでイベントを発生させることができるトリガーボックスについて書いていこうと思います。Splineの速さを途中で変えてみたり、最後まで行ったらSelectLevelに飛ばしたりいろいろできそうですね。今回で結構BPに慣れてきたのではないかと思いますがどうでしょうか。慣れてきたらどんどん物怖じせずにいじってみてください!
では、今回はこの辺で!
UE4 ガンシューティングゲームを作ろう!その3 敵の作成
はい!今回は前回の宣言通り、敵を作っていこうと思います。敵を弾で撃ったらHPが減っていって倒せるようにしましょう。これができたら結構ゲームらしくなってくると思います。
それでは張り切っていきましょう!!
今のガンシューティングゲーム(プロジェクト)には敵の素材がまだ入っていません。ブロックを組み合わせて作ってみてもいいのですが、今回は公式様の素晴らしい素材を使わしていただいてウハウハしたいと思います。パソコンをネットにつないでください。
いつもUE4を起動するときに開くランチャを開きます。そこで左側にあるマーケットプレイスをクリックします。
するとたくさんのアセットが出てきます。これらは本当にすごいので、気に入ったものがあったら購入をオススメします。
今回は現在2015年8月にマーケットプレイスにEpic Games様が出されている無料のアニメーションスターターパックを使わせていただきたいと思います。アニメーションスターターパックをクリックしてください。
すると画像ではダウンロードになっていますが、画面右側の無料ボタンを押してください。するとダウンロードボタンが出てくるので、クリックしましょう。
ダウンロードが終わったらプロジェクトへ追加が出てくるので、クリックします。
するとどのプロジェクトへ追加するかが出てきます。ここではGunShootingを選択し、プロジェクトに追加ボタンを押します。これでGunShootingにアニメーションスターターパックが追加されました。
それではエディタを開いてください。コンテンツブラウザを確認すると、AnimStarterPackというファイルが追加されているのが確認できます。
こちらのアセットは、名前通りキャラクターのアニメーションがたくさん入っています。今回はこちらを使用して敵を作っていきます。
では敵を作っていきます。いつも通りビューポート上部にあるブループリントからブループリントを新規作成します。今回はCharacterを選びます。
BPエディタ画面が開きますので、左側にあるMeshをクリックします。そうすると画面右側に詳細タブが出てきます。ここでAnimationの欄のAnimation ModeをUse Animation Assetにします。さらにそこから下にあるMeshの欄のSkeletal MeshをHeroTPPにします。
そうしましたら画像のようにMesh(ここでは人型のモデル)が、薄ピンクの楕円の中に納まるように調整します。
位置を移動するときはPlayer StartやSplineを動かした時と同じように、真ん中の画面の上部にある十字ボタンを押して、3本の軸をドラッグすることで移動させることができます。(3本の軸が出てこない方は画面左のMeshが選択されていない可能性があります。Meshを選択した状態で位置や大きさを変えましょう)
大きさを変えるときは十字ボタンの2つ右にある2本の矢印ボタンを押します。これも3つの軸をドラッグすることでx,y,zそれぞれの方向の大きさを変えることができます。x,y,zの比率を保ったままサイズを変えるときは、3つの軸が交わっている白い点にポインターを合わせ、3つの軸が黄色くなった時にクリックし、ドラッグすると比率を保ったまま大きさを変えることができます。
次はアニメーションをつけます。Anim to Playの右にある▼ボタンを押すと、アニメが選べます。ここでは敵の初期のアニメを選びましょう。私は止まっている敵を作るので、Idle_Rifle_Ironsightsを選びました。ライフルを構えていますね。
ピンクの楕円は当たり判定ですMeshにも当たり判定があるのですが、今回はこちらを判定に使っていきます。
ではMyLevelに戻ってコンテンツブラウザからドラッグ&ドロップして敵を設置してみましょう。画像では2体目を配置しようとしています。このように複数対出すこともできます。
ではプレイしてみましょう。弾を撃ってみてください。弾がはじかれてしまいますね。当たり判定はしっかりとあるのですが、当たったら何をするということがまだ設定されていません。ではブループリントで設定してみましょう。
MyEnemyのBPに戻ってもらいまして、画面左側のCapsuleComponentを右クリックします、そこからイベントを追加→OnComponentHitを選びましょう。
するとOnComponentHitのノードが作られます。そこから線を伸ばして適当なところで離します。
今回は弾に当たったときのアクションを追加したいので、弾のBPであるFirstPersonProjectileへキャストするを選択します。
キャストノードができましたら、画像のようにOther ActorとObjectをつなぎ、そしてキャストノードの一番右上から線を引っ張ってPlayAnimationを出しましょう。
Play AnimationノードのNew Anim to Playの欄があるので、弾に当たったときのアクションを選びましょう。Reactと検索すると、くらいモーションが出てきます。僕はHit_React_4にしました。お好みでどうぞ。
真ん中画面左上のコンパイルボタンを押して、プレイしてみてください。手間を充てると敵が暗いモーションをしてくれるようになりました。
では次は倒せるようにしましょう。前回の復習です。Float型の変数HPを作ります。
編集可能にチェックを入れます。
コンパイルボタンを押してコンパイルすると、デフォルト値が決められるようになるので、とりあえず5にします。
画面左側の変数の欄のHPを真ん中の画面にドラッグ&ドロップし、取得(Get)と値の取得(Set)を出します。そして画像の緑で囲っているようにつなげてみてください。これでHPがマイナスされるようになりました。
次はHPが0以下か0大きいかでで処理を変えるようにしましょう。
キャストノードから線を引っ張り、「if」もしくは「ブランチ」と検索してブランチノードを出しましょう。
まずHPを取得します。そこから線を出して離し、「>」と検索して、Float>floatを出します。このノードは2つの値を比較し、上につながれた値(HP)>下につながれた値(今回は数値をダイレクトに指定して0にしています)が正しければ、「True」を返し、違えば「False」を赤い線から送り出します。
ブランチはその赤い線を受け取って、Trueであれば右側の上の線を実行し、Falseであれば下の線を実行します。
ブランチは本当によく使うので覚えておきましょう。(プログラミングをしたことがある人はわかるかと思いますが、if-else文と同じです。
ノードがごちゃごちゃしてきた人は、左ドラッグで範囲を選択して手を放した後、左ドラッグをすることで一気にノードを動かせます。左ドラッグだけで1つずつ動かすこともできます。見やすいように調整しましょう。
ではHPが0以下になったときの処理を書いていきましょう。Falseから線を出し、Play Animationを出します。今回は敵には倒れてほしいので、deathと検索し、Deathを選びます。僕はDeath_1を選びました。こちらもお好みでどうぞ。
ここまでできたらコンパイルをしてプレイしてみましょう。6回撃つと倒れてくれるようになりましたね!しかし倒れた後に撃つともう一度倒れてしまいますね。こちらを直していきましょう。
様々な方法がありますが、今回は先ほどの薄ピンクの楕円の当たり判定を消してしまいましょう。
下の画像のように線を引っ張りSet Collision Enabled(CapsuleComponent)を出します。
ノードが出てきましたらNew TypeをNo Collisionにしましょう。Collisionというのは当たり判定です。それをNoにすることで当たり判定をなくしています。
さあコンパイルしてプレイしてみましょう。ちゃんと倒れた後にもう一度倒れなくなっていて、Meshの当たり判定は残っているおかげで弾は跳ね返ってきますね。
さて、これでガンシューティングの基礎は完成しました!おめでとうございます!!!好きなマップを作って、コースを作って敵を配置して楽しんでください。
しかしこれからも要素を追加することで様々なUE4の機能を紹介していこうと思いますので、よろしくお願いします。
今回はもう少し続きます。
次は敵に当たった瞬間に弾が消えて、爆発のエフェクトが出て、音が鳴るようにしましょう。以下の画像のようなノードを追加します。(すぐ後にこれらの詳細を書きます)
まず弾が消えるようにします。先ほどブランチノードを間に追加したのと同じように、キャストノードとブランチノードの間にDestroy Component(Projectile)を追加します。つながっている線を切りたいときはAltキーを押しながら線が出てきているところをクリックします。
Destroyは破壊という意味です。Projectileというのは弾の事なので、弾を壊すという意味になります。それを敵と弾が当たったときに実行するので、弾が当たって消えるようになるということです。そして下の画像のようにしっかりと青い線をつなぎましょう。
次は音が鳴るようにします。DestroyノードからPlay Sound at Locationを出します。これは指定した場所(Location)から音を鳴らすことができるノードです。今回は爆発の音を鳴らすので、Explosion01を選びました。
そしてキャストノードの一番右下から青い線を引っ張り、Get Actor Locationを出します。これは物体やキャラクターの位置を取得することができるノードです。それをPlay Sound at Locationにつなげることで、弾が爆発した位置から音を鳴らすようにしています。
次は爆発エフェクトが出るようにします。Play Soundノードから線を引っ張り、spawnと検索し、「クラスからアクタをスポーンします」を選びます。
スポーンとは産むという意味があります。つまりアクタ(物体やキャラクターやエフェクト)を発生させるノードになります。
今回は爆発を出すので、Classの部分をBlueprint_Effect_Explosionにしました。
Spawn Transformにこのように線をつなげて離します。すると自動でノードが作成されます。ここではどこにActorを発生するかを決めることができます。
最後に忘れずにブランチノードに線をつなぎます。
これで完成です!コンパイルをしてゲームを始めてみてください。
最後に敵によってマテリアルを変えたり、HPを変えたりします。
マテリアルを変える方法は、コンテンツブラウザでMaterialsというファイルを検索します。そのファイルを開くと、マテリアルがあるので、それをマップに設置した敵にドラッグ&ドロップします。これで敵のマテリアルが変えられます。
HPを変えるには、ブループリントで変数HPを編集可能にしておきましょう。(この記事通りに作っていればなっているはずです)
マップに設置した敵を選択した状態で画面右にある詳細からDefaultを探します。そこにHPとあるので、そこの値を変えるとHPが変えられます。
今回はここまでです、お疲れさまでした!弾が敵に当たると爆発して音が鳴り、弾が消えますね。これで一気にクオリティが上がりました。好きに敵を配置して遊んでみてください。
・マーケットプレイスからアセットを入手しました
・Characterを新規作成しました
・物体の大きさを変えました
・アニメーションを設定しました
・物体同士が当たったときのイベントを作りました
・ブランチ(if文)を使いました
・当たり判定(コリジョン)をなくしました
・Actorを消しました
・エフェクトを出しました
・音を鳴らしました
・Actorのマテリアルを変えました
・敵によってそれぞれのHPを持たせました。
次回はある物体を見ることによってイベントを発生させる、視線選択をしていきたいと思います(こちらのぶっさん様の記事を参考にさせていただきます)。かなりブループリントをいじるので、前回や今回でやったことをよく覚えておきましょう。
では、今回はこの辺で!
UE4 ガンシューティングゲームを作ろう!その4 - YumaDogidogi’s blog
UE4 ガンシューティングゲームを作ろう!その2 スプライン
はい!今回は前回でも言ったとおり、スプラインについて書いていこうと思います。スプラインはワールド上に線を作って、その線をたどらせて物体を動かすことができるというものです。ほかにも坂道を作ることもできるのでとても便利なものです。
ジェットコースターをイメージしていただければわかりやすいかと思います。今回のゲームではプレイヤーをスプラインで動かしたいと思います。
今回は少し長くなりましたので、こまめにセーブをして休みながら頑張りましょう。
では始めます。まずエディタを開きましょう。一度閉じた方はUE4を起動した後のこの画面でプロジェクトを選択すると、以前作ったプロジェクトが表示されます。開きたいプロジェクトをクリックして右下にある開くを押しましょう。
実際画面はこんなに黒くないです。(誰かさんの名前のプロジェクトがあったりで隠しています…)
エディタを開きなおした人はここで前作ったマップが出てこないかと思います。それはデフォルトで開くマップ(レベル)が別のレベルに設定されているからです。パッケージ化した時に最初に開かれるレベルも設定と同じになるので、前回作ったレベルをデフォルトになるよう設定しましょう。
僕の場合はFirstPersonExampleMapがデフォルトレベルになっています。下の画像の一番上にレベル名が書かれていますね。
左上の編集からプロジェクト設定を選択します。
するとプロジェクト設定が開けます。ここでマップ&モードを選択します。
Default Mapsという欄があるので、「▼」ボタンを押して2つとも前回作ったMyLevelを選びます。これで次にエディタを開いたとき、MyLevelが最初に開かれるようになります。
設定が終わりましたらプロジェクト設定の画面は消してもらってもいいです。
エディタを開いている間にほかのレベルを開くのは、画面下側にあるコンテンツブラウザのコンテンツを押すと、そのすぐ右にフォルダとレベルが出てきます。そこにあるMyLevelをダブルクリックするとレベルが開けます。
もし出てこない方は、保存するときに別の場所に保存した可能性があります。フォルダを開いて探すのもいいですが、検索することもできます。
フォルダを検索するときは左の青四角で囲っているフォルダを検索に、それ以外を検索するときは右の青四角で囲っている検索~(ここではコンテンツになっています)に名前を入力しましょう。
今回はレベルを検索するので右の検索にMyLevelと打ち込みましょう。
ゲームが大きくなると、フォルダやコンテンツが探しにくくなるので、これらの検索機能はどんどん使っていきましょう。
それではスプラインを作っていきます。今回はついにUE4独自のプログラムであるブループリントを触っていきます。ブループリントは、個人差はあると思いますが普通のプログラムよりも全体の流れが見やすく、プログラマーでない人も比較的簡単にプログラミングができます。考え方は普通のプログラミングとそう変わりないので、今までにプログラムをしてきた方でも、それまでの知識を生かせると思います。
今回、スプラインは株式会社ヒストリアさんの記事を参考に作っていきます。こちらの記事ではより深くスプラインの事が書いてあるので是非読んでください。
それではブループリントを作っていきます。ビューポートの上部にあるブループリントをクリック。そうすると、どんなブループリントを作るかを聞かれるので、Actorを選択します。名前はわかりやすくMySplineActorにします。
するとMySplineActorのブループリントが開かれます。下の画像の最上部にMyLevelとMySplineActorのタブがあることが分かります。MyLevelのタブを押すと元の画面に戻ることができます。
ではブループリントの画面の左上にある、コンポーネントを追加を押してSplineを見つけて選択しましょう。
するとスプラインが追加されます。
スプラインの始点と終点が分かりやすかったり、とにかく分かりやすいのでText Renderを追加します。(あとからTextを入れたほうがいいと思ったので、この先の写真には追加していないときの写真があります…)
左側にText Renderができるので、それをクリックします。右側の詳細にあるTextという欄で表示する文字が決められます。僕はStartにしました。
そしてそのさらに下のほうにRenderingのところにHidden in Gameという欄があります。そこのチェックをオンにするとゲーム起動時には見えなくなります。とりあえずオンにして編集の時だけ見えるようにしましょう。Hidden in Gameは個人的に使う機会が多いので、覚えておくといいと思います。
では次にプログラミングに移りましょう。今回は簡単にするために機能を最小限に抑えたスプラインにしようと思います。もしブループリントになれている!もっと便利な機能をつけたい!という方はヒストリアさんの記事を見て作るといいと思います。ヒストリアさんの続きの記事ではスプライン移動をコンポーネント化するということも書かれているので要チェックです。
こちらは簡単に書きたいと思います。まず関数を作ります。関数というのは1つの機能の塊と思っていただけたらいいと思います。その関数に数字などのデータを送ることで、ある数字が帰ってきたり、ある処理をしてくれるというものです。
ブループリント(BP)の右側にある関数のところの+ボタンを押して関数を作りましょう。名前はGet Current Locationにします。
関数を作ると、真ん中の画面の上部にGet Current Locationのタブが出てくるので、そのタブをクリックします。
そして画面真ん中にある紫の箱をクリックすると、画面右側に詳細が出てきます。
そこで、入力と出力のところで「新規」ボタンをクリックし、新しく入力と出力を作ります。下の画像の▼ボタンを押すと型を決めることができます。プログラミング経験がある方はわかると思いますが、したことのない人には少しわかりにくいかもしれません。
今回は入力にFloat型のLength、出力にVector型のLocationを作ります。
Float型は実数(180.0や3.14など)で、Vector型はx,y,zの3つの実数([12.0,32.3,3.658]や[1,1,1]など)です。
プログラムを書いていきます。左上にある先ほど作ったsplineを真ん中の画面にドラッグ&ドロップします。すると、青色のsplineと描いている楕円ができます。それの右の青い丸をクリックし、ドラッグすると線が出てきます。
これを何もない適当なところで離しましょう。
そうすると下の画像のような画面が出てきます。黄色の線のようにGet World Location at Distance Along Splineと検索しましょう。途中で絞られてくるのでその下に出てきたそれをクリックしましょう。
そうすると以下のような緑の箱(ノード)ができます。下の画像のように線をつなぎましょう。
これでスプラインは完成しました。では実際に配置してみましょう。
先ほど書いたように、上部のタブからMyLevelに戻りましょう。
先ほど使ったコンテンツブラウザからMySplineActorを探し出します。見つからなければ検索でしたね。
見つかりましたらMySplineActorをビューポートにドラッグ&ドロップします。するとMySplineActorが設置できます。この他にもこのやり方でキャラクターや物体を設置することができます。また使うので覚えておきましょう。
スプラインの引いていきましょう。スプラインの始点はTextがあるほうです。始点の移動は、前回PlayerStartの位置を変えた方法と同じです。
始点の位置が決まったら終点をクリックしましょう。下の画像のように位置を変えると線がビヨ~ンと伸びます。この線をプレイヤーがたどることになるので、地面にめり込まないように線を作っていきます。
まっすぐだけでは面白くないので曲げてみましょう。Altキーを押しながらドラッグすると、ドラッグする前の場所に点が作られ、点が増えます。
好きなコースを作りましょう。
ではプレイヤーが今作ったスプラインを参照にして動くようにします。
コンテンツブラウザからFirstPersonCharacterを探し出してダブルクリックします。
するとMySplineActorの時と同じようにブループリントが開かれます。すでに色々とプログラムが書かれていますので、今回はあまりいじらないでください。
画面右下の変数と描いているところで+ボタンを押してFloat型の変数SpeedとMoveDistanceを作ります。型の変え方は、作った変数が変数の欄に追加されるので、それをクリックすると、画面右側に詳細画面が出てきます。ここで先ほどと同じように方を変えます。
そしてもう1つ、MySplineActorを参照にした型のSplineという変数を作ります。変数の型を変える画面でsplineと検索するとかなり絞られるので、見つけてください。
型が決められましたら、忘れずに編集可能にチェックを入れてください。すると、画面左の変数の欄のSplineの横の目玉が開きます。(なんとおしゃれな…!!)これは外部からでも値を変えられるという意味です。今回はあまり深く考え無くてもいいですが、このチェックをつけ忘れるとうまくいかないので注意してください。
それではブループリントを書いていきます。真ん中の画面上部にあるEvent Graphをクリックして、この画面を出します。(出てた方は押さなくてもいいです)
空いている適当なところで右クリックします。そうするとこの画面が出てくるので、tickとでも検索してイベント Tickを見つけてクリックしてください。
イベントTickができるので、先ほどと同じように線を引っ張って適当なところで離します。*と検索して、Float*Floatを出します。
次はSpeedとMoveDistanceの値を取得するために右側の変数の欄からドラッグしてきて適当なところで離します。すると取得と値の取得が出てくるので、取得を選択します。
同じ要領でFloat+Floatを見つけ出し下の画像のようにつなげます。そして次はMoveDistanceの値を保存したいので、変数の欄からドラッグしてきて値の取得を選択します。
同じようにSpline(の値)を取得します。Splineから線を引っ張り、Get Current Locationを見つけて選択します。 (注意:Splineから線を引っ張らないとこのノードは見つかりません)
同じようにMoveDistanceを取得し、つなげます。そしてSetActorLocationを探して設置してみましょう。できましたら画像のように線をつなぎ合わせてください。
画面上部のコンパイルボタンを押してください。チェックマークがついたら成功です。
最後にSpeedの初期値を決定します。右側の変数欄のSpeedをクリックして詳細を出します。デフォルト値を決定してください。僕は200にしました。あとから変えられるので、上手く調整してみてください。
これでブループリント完成です。
あと少し作業があります。頑張りましょう!MyLevelに戻ってください。
そこでコンテンツブラウザからFirstPersonCharacterを見つけて、どこでもいいのでビューポートにドラッグ&ドロップしてください。
マップ上のFirstPersonCharacterを選択した状態で、画面右側にある詳細からDefaultを見つけてください。そこにSpline なし と書かれています。このなしをクリックします。
*ここでDefaultが出てこない方は、FirstPersonCharacterのブループリントで作ったスプライン変数が編集可能になっていない可能性があります。そうであった場合は編集可能にチェックをつけて、もう一度FirstPersonCharacterをドラッグ&ドロップしてみてください
そうすると選択画面が出てくるので、MySplineActorを選びましょう。
そしてそれよりもかなり下にあるPawnを探してください。
そこにあるAuto Possess PlayerがDisabledになっているので、そこをクリックしてPlayer0を選択してください。
これは、今配置して設定したFirstPersonCharacterをPlayer0にして初期のプレイヤーにしたということです。Player1や2はマルチプレイの時に必要になります。
このガンシューティングゲームを作ろう!の終盤か終わった後の追加として書こうと思っている、マルチプレイを利用したVR表示にも使うので興味がある方は覚えておいてください。
これでスプライン移動の基礎が完成しました!プレイを押して動作を確認してください。どうでしょうか、しっかりとスプラインに沿って移動していれば成功です。プレイヤー自身が歩いたりすることはできなくなっています。
ここに敵がそこらに配置されていることを考えて、マップやコースや速さを調整してみてください。
画面の左上に何やらエラーっぽいものが出てきていますね。これは影の描画に影響がある操作をすると出てくるものです。例えば光源の位置や向きを変えたり、ランドスケープでマップを変えたりです。
ビューポート上部のビルトをクリックします。結構重い処理なので、あまり触らずにコーヒーでも飲んで休みましょう。
これでエラーが出なくなるはずです。
それではお疲れさまでした!今回は長くなってしまいました。しかしブループリントはゲームを作るうえでは必要不可欠なので、よく触っておきましょう。プログラムは習うより慣れろ!です。
・デフォルトレベルを設定しました
・コンテンツブラウザからレベルやブループリントを開きました(設置しました)
・新規アクターを作りました(MySplineActor)
・ブループリントの基礎を触りました
コンポーネントの追加
関数の作り方(入力と出力の追加)
変数の作り方、出し方、値の保持の仕方、型の変え方
ノードの出し方
・スプラインの作りました(設置しました)(プレイヤーに対応させました)
・キャラクターを設置し、そのキャラクターをプレイヤーにしました
・ビルドしました
・好きなマップを作って、Speedをかなり速くして遊びました(ゲーム製作を楽しみましょう)
次回は敵を設置して倒せるようにしたいと思います。(もしかしたら僕の都合で変わるかもしれません)
では、今回はこの辺で!
UE4 ガンシューティングゲームを作ろう!その1 初心者〜ランドスケープ
これから数回にわたって、UE4を使って、自分で移動したり、オートスクロールしたりするガンシューティングゲームの作り方を書いていこうと思います。
何故ガンシューティングを選んだのかといいますと、僕の知識を書き留めるにはちょうどいいと思ったからです。
今回UE4のバージョンは4.7でやりたいと思います。(理由はスマホでVR表示するとき、4.8だとうまくいかなかったからです、どうにかしたいのですがなかなか難しいですw)ちなみにUE4自体の導入方法は端折っています。
では始めていきましょう!
まずUE4を起動して、新規プロジェクトを選択します。そうすると以下のような画面になるので、赤い丸の通りにブループリントを選択。UE4では最初からゲームのもとになるコンテンツが用意されています。今回はFirst Personを選びます。
したの3つもこの通りにしますフォルダは勝手に選択されるので、あまり気にする必要はありません。名前はGunShootingとしておきましょう。最後に右下のプロジェクトを作成でプロジェクトが作られます。
するとエディタ画面が開きます。ここでまずプレイをしてみましょう!下の画像のプレイを押すとゲームが始まります。
十字キーで移動、マウスで画面をタッチすると弾が発射され、マウスを動かすとカメラが動きます。
すごい!!最初からこんなすごいものが使えるなら使うっきゃない!ということで今回はこちらを軸に使って、ゲームを作っていきます。ゲームはEscapeキーで終了することができます。
このマップでは狭いので、新しいマップを作っていきます。左上にあるファイルをクリックして、新規レベルを選択します。すると右のような画面が出てくるので、赤丸で囲っているDefaultを選択します。
すると1枚の地面だけのマップができます。この地面をクリックし、そのあと右クリックから消去を選んで消してしまいましょう。(クリックしてからCTRL+Xでも消せます、こういったショートカットは多くありますが、覚えていると非常に便利です)
ではここに大きな地面を作っていきます。
左上にある山のアイコン(ランドスケープ)をクリックします。そして新規作成を選択し、フィルワールドをクリックします。
Materialと描いている部分をクリックすると、その地面のマテリアルを選ぶことができます。初期状態だと小さくて見えないと思うので、開いた選択画面の右下にある表示オプションを押して、スケールをクリックしてドラッグすると、マテリアルの表示が大きくなります。
ここで選んだマテリアルはゲームのイメージに大きくかかわるので、自分がどのような世界にしたいかによって自由に決めてみてください。僕は自然をイメージしているので、自然っぽいM_Ground_Grassを選びました。
それらが選択できましたら作成を押します。すると大きな地面が出来上がります。
現在地面は平らなので、凹凸を作っていきましょう。真ん中の画面(ビューポートでの操作方法が分からない方は、なつのやさんのサイトに詳しく乗っていますので参考にさせていただきましょう。操作以外でも幅広く分かりやすく書いてくださっているので要チェックです。僕はマウスの右ボタンとキーボードの十字キーで操作しています。自分がやりやすいようにやりましょう。
ランドスケープからスカルプトを選択します。その下のツールもスカルプトにします。するとブラシのセッティングが出てきます。ブラシの大きさや時間単位でどれくらい高さを変化させるかを決めることができます。あまりにも多くの便利機能があり、僕自身まだ把握しきれていないのでここでは詳しいことは書きませんが、公式ドキュメントに詳しく書いてくださっているので、いろいろいじりたい方はぜひ読んでみてください。
上の画像の状態で画面内の地面を左クリックすると、選択された範囲の地面が高くなります。逆にシフトキーを押しながら左クリックすると、選択された範囲の地面が低くなります。
思い思いのマップを作ってみましょう!
先ほどのようにプレイを押してこのようになれば成功です。こうならずに青い空しか見えない!という人はプレイヤーが地面の下に落ちてしまっている可能性があります。
右上にあるブロックのアイコン(配置)をクリックしましょう。そして右側にあるワールドアウトライナーからPlayer Startを探し出し、クリックしましょう。そうすると真ん中の画面(ビューポート)にPlayer Startの位置に3本の矢印が出てきます。
このPlayer Startは名前通りプレイヤーのスタート位置を決めるものです。これが地面に重なっていたり、地面の下にあったりすると、ゲームを始めた瞬間に重力で地面の下に落ちていってしまいます。
ビューポートの上部にある十字矢印をクリックし、Player Startの青いうえ向きの矢印をドラッグし、地面の上に配置しましょう。これで地面の下に落ちなくなります。
このPlayer Startを好きなところに配置してみましょう。そこからゲームがスタートするようになります。
これで自分のマップができました。今回はランドスケープに関して基本のところだけにしますが、これにはもっと多くの機能があり、木を生やしたり川や海を作ったりするともっとそれらしくなるかもしれません。
それでは保存をしましょう。ファイルからすべて保存を選択します。右のような画面が出てくるので、名前をMyLevelにして保存です。
それでは今回は以上です!なんとまだ一切プログラミングをしていませんw本当にUE4はすごいですね!
・新しいプロジェクトを作りました
・新しいレベルを作りました
・基本的なランドスケープを触りました
・プレイヤーのスタート位置を変えました
次回はスプラインを使って、自動でマップを移動する方法を書きたいと思います。
では、今回はこの辺で!