シヴァのブログ

UnityやUE4や趣味とかいろいろ...

「Unreal Engine」エンドレスランナー作成

f:id:shivaT:20150715165110p:plain
ニコニコでエピック・ゲームズ・ジャパン さんの、
「エンドレスランナー」の開発動画があった。
動画を見て作成してみる。

参考:ブループリントでエンドレスランナーを作る ‐ ニコニコ動画:GINZA

基本的にこの記事に書くことは、
「ゲームの作り方」ではなく、
・知らなかったこと
・気になったこと
・あとで思い出したいこと
などです。
ゲームを開発したい人は動画を見て下さい。

チュートリアルPart01

・プレーヤー操作の作成

・自動的に前に移動させる

InputAxis MoveRight:左右の操作
InputAxis MoveForward:前後の操作
Event Tick:フレームごとに呼び出されるイベントノード

Event Tickによって、マイフレームごとに入力され、前に移動させる。

f:id:shivaT:20150713220138p:plain


・角に到達すると90度曲がることができる
・「DesiredRotation」に「値」をセット
・「Can Turn」を「OFF」にセット
f:id:shivaT:20150713220202p:plain

向きが変更(DesiredRotationがセット)かつ、CanTurnがON(角にいる)のとき、
「Player ControllerのRotation」に「DesiredRotation」をセットする。
f:id:shivaT:20150713220218p:plain

Event tickのところに、自作の関数(Turn Corner)を追加。
f:id:shivaT:20150713220234p:plain

トリガーの範囲内のとき、「Can Turn」を「ON」にセットする。
f:id:shivaT:20150713222206p:plain

チュートリアルPart02

・ゲームモードを使い、ステージ自動生成

・Arrowコンポーネントについて
Arrowコンポーネントで、次にマテリアルをスポーンするときの基準点を設定できる。
f:id:shivaT:20150713225345p:plain

AttachPointがワールドの中のどこにあるか分かるように自作の関数を作成する。
(出力はTransform型のAttachPoint)
f:id:shivaT:20150713230155p:plain


・「Event Begin Play」のショートカット方法
イベントグラフで「P」キーを押しながらクリックすると、
「Event Begin Play」が配置できる。


・イベント開始後、床を生成させる
新規で「AddFloorTile」関数を作成する。
「BP_FloorTile」をスポーンさせる。
f:id:shivaT:20150714004903p:plain

イベントグラフで、イベントが開始後「AddFloorTile」関数を呼び出す。
f:id:shivaT:20150713232227p:plain

・Cast to BP_FloorTile
BP_FloorTileのものであるか調べる

・get AttachPoint
Arrowが矢印のどこにあるか調べる

ビデオでは「Cast to BP_FloorTile」をしているが、
エラーが以下のように出た。
‘ReturnValue’ is already a ‘BP Floor Tile’, you don’t need ‘Cast To BP_FloorTile’.
f:id:shivaT:20150714161133p:plain

そのため、
「Cast to BP_FloorTile」が必要ないと書かれているので、消した。
f:id:shivaT:20150714161304p:plain

うまくfor文で床が生成できないため中断。

スタンドアローンゲームでプレイすると、きちんと出来ていた。
(Shift+F1を押して、マウスカーソルを復活させてウィンドウを閉じることができる。)
(Macの場合Shift+fn+F1)

f:id:shivaT:20150714161423p:plain


バージョンが4.8になり新規として、
どのグラフ エディタでもワイヤーを直接操作できるようになったらしい。

・接続を切る:Alt + 左マウスボタンをクリック
・接続を別のピンに移動する:Ctrl + 左マウスボタンを押してドラッグ
・ワイヤーにマウスをあてて、ハイライトするか関連するピンのツールチップを見ます。
・再ルーティングノードを挿入する:ダブルクリック(ブループリントのグラフのみ)

ノードの線がきれいになっていないと嫌なタイプなので、
特にノードの線上でダブルクリックしてして線を整えるのによく使っています。
その他にも、以下のサイトに色々と載っているので参考に...。
Unreal Engine 4.8 リリース ノート | Unreal Engine

チュートリアルPart03

・障害物の作成

ビデオと異なっているところがあった。
「Get Relative Transform」が異なる。
そのため以下のように変更した。
動作するため問題ないと思われる。

ビデオのノードのつなぎ方
f:id:shivaT:20150714181527p:plain

自分で作成したつなぎ方
f:id:shivaT:20150714181645p:plain


・Add Child Actor Component
これを使うことによって、床と一緒に障害物も消すことができる。

・Random Integer in Range
ランダムに(>= Min and <= Max)数値を出す。

・Last Index
最後のインデックスを表す Int を受け取る。

・物体が通り抜けてしまう対処方法
メッシュの設定が悪い。
メッシュの中を見ると、コリジョンが反映されているように見えるが出来ていない。
メニューのコリジョン→オートコンべックスコリジョンを選択。
「凸型分解」のデフォルト値のままでいいので「適用」を押す。
f:id:shivaT:20150714203834p:plain


・障害物に当たると倒れる処理

・Disable Input
入力できなくする。

f:id:shivaT:20150714205559p:plain

・障害物の処理

・OnConponentHit(StaticMesh)
衝突したとき呼び出す。

・Cast To RunCharactor
衝突したものがキャラクターかどうか確認する。

f:id:shivaT:20150714210351p:plain

・変数「IsDead」の追加
初期値:false
f:id:shivaT:20150714214733p:plain
変数(IsDead)を入れて、ブランチで分岐させる。
f:id:shivaT:20150714214502p:plain

・Execute Console Command
RestartLevel:現在のレベルを再読み込み

その他にも、
quit もしくは exit:ゲームを終了する
参考サイト:[UE4] コンソールコマンドの使い方&よく使うコマンド一覧 | historia Inc - 株式会社ヒストリア

f:id:shivaT:20150714221620p:plain

爆発まで完成。
f:id:shivaT:20150714220738p:plain

チュートリアルPart04

・アイテム作成

・アイテムの回転
「RotatingMovement」コンポーネントを追加するだけでいい。
回転軸がおかしい場合、アイテムの位置を中心にきちんと配置すれば直る。
X = Roll
Y = Pitch
Z = Yaw
参考:
Blueprint Rotating Movement Component - Epic Wiki

f:id:shivaT:20150714230803p:plain

・アイテムの配置
・Random Point in Bounding Box

Origin:CoinAreaのLocation
Box Extent:Boxの幅
f:id:shivaT:20150714234931p:plain
テストで一旦「SpawnBlocker」を外して「SpawnCoins」を繋げる。
f:id:shivaT:20150714235056p:plain
以下のように、指定したコリジョン内にコインが生成される。
f:id:shivaT:20150714234819p:plain

・ランダムで障害物かコインのどちらかを生成させる
・Switch on Int
数値によって分岐させる。
f:id:shivaT:20150715000311p:plain

・コインの取得処理

・プレーヤーがコインをゲットしたとき所持コイン数を増やす処理
f:id:shivaT:20150715001038p:plain

・OverlapOnlyPawn
この設定で、Pawns(延長するとCharaters)のみをボックス経由で渡すことができるようになる。
参考:ダイレクト ブループリント通信 | Unreal Engine

・タッピーチキンのサウンド「SFX_Score_01」
マーケットプレースにあるタッピーチキンをダウンロードして入れる。
f:id:shivaT:20150715004341p:plain

処理は以下のようになる。
f:id:shivaT:20150715004854p:plain

これでコインをゲットしたとき音がなり、コインが消える。
f:id:shivaT:20150715005946p:plain

チュートリアルPart05

・コースのアップダウンの実装

・上り坂の作成(BP_FloorTile_RampUp)
f:id:shivaT:20150715014001p:plain

Classに「FloorTiles」を繋げたしたとき、
「Get AttachPoint」で以下のようなエラーが出た。
f:id:shivaT:20150715012848p:plain

なので、
以前に必要ないといわれた「Cast to BP_FloorTile」を以下のように繋げた。
f:id:shivaT:20150715013337p:plain

実行すると動くため問題ないと思われる。
f:id:shivaT:20150715013847p:plain

・下り坂の作成(BP_FloorTile_RampDown)f:id:shivaT:20150715014626p:plain

あとは、
BP_FloorTile_RampDownを配列に追加する。
f:id:shivaT:20150715014847p:plain

実行すると、アップ・ダウンがあるステージができる。
f:id:shivaT:20150715015204p:plain

チュートリアルPart06

・コーナーの実装
・コーナーを曲がれるようにする

・Parent: Construction Script
親のConstruction Scriptが呼ばれている。
コーナーには、障害物・コインがない状態にしたいため、
今回はこれを削除している。
f:id:shivaT:20150715020536p:plain


・右曲がり角の作成(BP_FloorTile_RightCorner)f:id:shivaT:20150715021658p:plain

カーブを曲がれるようにする処理
f:id:shivaT:20150715022342p:plain

カーブが連続でなった場合、コースが重なる恐れがある。
そのためカーブは特別な扱いとする。
(ストレート何回か入れたら、カーブを1回入れる)

まず、カーブ生成の処理
f:id:shivaT:20150715023411p:plain

・ストレート8回入れたら、カーブを1回入れる処理

・Add FloorTileの処理
f:id:shivaT:20150715024724p:plain

・Add FloorCurveの処理
f:id:shivaT:20150715025221p:plain

これで右に曲がれるようになった。
f:id:shivaT:20150715030804p:plain

・左曲がり角の作成(BP_FloorTile_LeftCorner)
f:id:shivaT:20150715031600p:plain

あとは、BP_FloorTile_LeftCornerを配列に追加する。
f:id:shivaT:20150715031752p:plain

これで左にも曲がれるようになった。
f:id:shivaT:20150715032128p:plain

チュートリアルPart07

・壁に衝突すると倒れる処理
・UMG作成
・完成
・まとめ

・壁に衝突すると倒れる処理
Block,Overlap,Ignoreについて調べてみた。

※Blockingは、Blockに設定された2つ(以上)のアクタの間に自然に発生する。
参考:コリジョン反応 | Unreal Engine

※Overlapは、見えないコリジョン同士が重なった時に発生する呼び出しのイベント。

簡単にいうと、

検出 画像 簡単な使い分け 当たり判定イベント
Block 衝突検出 f:id:shivaT:20150715114511p:plain 衝突判定がいる。めりこまさない。衝突判定後移動させる。 Hit
Overlap 重複検出 f:id:shivaT:20150715114518p:plain 衝突判定がいらない。まりこます。衝突判定後移動させない。 Actor Begin Overlap, Actor End Overlap
Ignore 無視 f:id:shivaT:20150715114526p:plain 衝突判定がない。めりこむ。衝突判定なし。 当たり判定イベントなし

参考①:猫でもわかるUnreal Engine4
参考②:コリジョン反応 | Unreal Engine

・Actorのノードについて

Get Actor Forward Vector 正面方向の単位ベクトル(X軸)取得
Get Actor Right Vector 右方向の単位ベクトル(Y軸)取得
Get Actor Up Vector 上方向の単位ベクトル(Z軸)取得

・Dot Product

参考:Math 表現式 | Unreal Engine


・Nearly Equal(Float)
Aとbを比較してほぼ等しいならtrue。
・A:比較対象
・B:比較対象
Error Tolerance:「ほぼ等しい」として考慮できる最大容量の差
参考:Blueprint Node: Math Node - Epic Wiki

今回の場合、
RunCharactorの正面方向とヒットした方向を比べて倒れるかどうか決めている。
まっすぐ衝突したとき、「-1」になる...らしい。(よく分からない)
f:id:shivaT:20150715130001p:plain

だけど倒れない...。
f:id:shivaT:20150715035718p:plain

よく考えると、RunCharactorのX軸って正面なのか疑問になり見てみると、
正面じゃありませんでした?(でもこれは、選択しているのがメッシュだがあっているのか...)
よく分かりません。
f:id:shivaT:20150715134500p:plain

なので、
「Get Actor Forward Vector」じゃなく「Get Actor Right Vector」を使ってみた。
f:id:shivaT:20150715140608p:plain

結果ダメでした。
なので、軸を変えてみる。(ちょっとやり方がわからないので保留)
参考:UE4 読み込んだモデルのサイズや向きが異なっていたら | the-saurus


ニコニコのコメントに、
「-1じゃなくて1にしたらうまくいった」
と書かれていたので試してみた。
f:id:shivaT:20150715172234p:plain
できました!コメントした方ありがとうございます。
f:id:shivaT:20150715172703p:plain

・UIの作成
Widget作成する。
f:id:shivaT:20150715164528p:plain
コイン取得数表示させる。
f:id:shivaT:20150715164410p:plain
Widgetをゲーム画面に表示させる。
f:id:shivaT:20150715164813p:plain
UI作成完了。


ゲーム完成。
f:id:shivaT:20150715165110p:plain


あとは、好みで
・障害物を破壊させる
・一定のところしか通ることができなくなる
・走った距離を出す
・アイテムの追加(爆弾やマグネットなど)
機能を追加していく。
f:id:shivaT:20150715165715p:plain
f:id:shivaT:20150715165821p:plain



エンドレスランナー作成終了。