「Unreal Engine」エンドレスランナー作成
ニコニコでエピック・ゲームズ・ジャパン さんの、
「エンドレスランナー」の開発動画があった。
動画を見て作成してみる。
参考:ブループリントでエンドレスランナーを作る ‐ ニコニコ動画:GINZA
基本的にこの記事に書くことは、
「ゲームの作り方」ではなく、
・知らなかったこと
・気になったこと
・あとで思い出したいこと
などです。
ゲームを開発したい人は動画を見て下さい。
チュートリアルPart01
・プレーヤー操作の作成
・自動的に前に移動させる
InputAxis MoveRight:左右の操作
InputAxis MoveForward:前後の操作
Event Tick:フレームごとに呼び出されるイベントノード
Event Tickによって、マイフレームごとに入力され、前に移動させる。
・角に到達すると90度曲がることができる
・「DesiredRotation」に「値」をセット
・「Can Turn」を「OFF」にセット
向きが変更(DesiredRotationがセット)かつ、CanTurnがON(角にいる)のとき、
「Player ControllerのRotation」に「DesiredRotation」をセットする。
Event tickのところに、自作の関数(Turn Corner)を追加。
トリガーの範囲内のとき、「Can Turn」を「ON」にセットする。
チュートリアルPart02
・ゲームモードを使い、ステージ自動生成
・Arrowコンポーネントについて
Arrowコンポーネントで、次にマテリアルをスポーンするときの基準点を設定できる。
AttachPointがワールドの中のどこにあるか分かるように自作の関数を作成する。
(出力はTransform型のAttachPoint)
・「Event Begin Play」のショートカット方法
イベントグラフで「P」キーを押しながらクリックすると、
「Event Begin Play」が配置できる。
・イベント開始後、床を生成させる
新規で「AddFloorTile」関数を作成する。
「BP_FloorTile」をスポーンさせる。
イベントグラフで、イベントが開始後「AddFloorTile」関数を呼び出す。
・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’.
そのため、
「Cast to BP_FloorTile」が必要ないと書かれているので、消した。
うまくfor文で床が生成できないため中断。
↓
スタンドアローンゲームでプレイすると、きちんと出来ていた。
(Shift+F1を押して、マウスカーソルを復活させてウィンドウを閉じることができる。)
(Macの場合Shift+fn+F1)
バージョンが4.8になり新規として、
どのグラフ エディタでもワイヤーを直接操作できるようになったらしい。
・接続を切る:Alt + 左マウスボタンをクリック
・接続を別のピンに移動する:Ctrl + 左マウスボタンを押してドラッグ
・ワイヤーにマウスをあてて、ハイライトするか関連するピンのツールチップを見ます。
・再ルーティングノードを挿入する:ダブルクリック(ブループリントのグラフのみ)
ノードの線がきれいになっていないと嫌なタイプなので、
特にノードの線上でダブルクリックしてして線を整えるのによく使っています。
その他にも、以下のサイトに色々と載っているので参考に...。
Unreal Engine 4.8 リリース ノート | Unreal Engine
チュートリアルPart03
・障害物の作成
ビデオと異なっているところがあった。
「Get Relative Transform」が異なる。
そのため以下のように変更した。
動作するため問題ないと思われる。
ビデオのノードのつなぎ方
自分で作成したつなぎ方
・Add Child Actor Component
これを使うことによって、床と一緒に障害物も消すことができる。
・Random Integer in Range
ランダムに(>= Min and <= Max)数値を出す。
・Last Index
最後のインデックスを表す Int を受け取る。
・物体が通り抜けてしまう対処方法
メッシュの設定が悪い。
メッシュの中を見ると、コリジョンが反映されているように見えるが出来ていない。
メニューのコリジョン→オートコンべックスコリジョンを選択。
「凸型分解」のデフォルト値のままでいいので「適用」を押す。
・障害物に当たると倒れる処理
・Disable Input
入力できなくする。
・障害物の処理
・OnConponentHit(StaticMesh)
衝突したとき呼び出す。
・Cast To RunCharactor
衝突したものがキャラクターかどうか確認する。
・変数「IsDead」の追加
初期値:false
変数(IsDead)を入れて、ブランチで分岐させる。
・Execute Console Command
RestartLevel:現在のレベルを再読み込み
その他にも、
quit もしくは exit:ゲームを終了する
参考サイト:[UE4] コンソールコマンドの使い方&よく使うコマンド一覧 | historia Inc - 株式会社ヒストリア
爆発まで完成。
チュートリアルPart04
・アイテム作成
・アイテムの回転
「RotatingMovement」コンポーネントを追加するだけでいい。
回転軸がおかしい場合、アイテムの位置を中心にきちんと配置すれば直る。
X = Roll
Y = Pitch
Z = Yaw
参考:
Blueprint Rotating Movement Component - Epic Wiki
・アイテムの配置
・Random Point in Bounding Box
Origin:CoinAreaのLocation
Box Extent:Boxの幅
テストで一旦「SpawnBlocker」を外して「SpawnCoins」を繋げる。
以下のように、指定したコリジョン内にコインが生成される。
・ランダムで障害物かコインのどちらかを生成させる
・Switch on Int
数値によって分岐させる。
・コインの取得処理
・プレーヤーがコインをゲットしたとき所持コイン数を増やす処理
・OverlapOnlyPawn
この設定で、Pawns(延長するとCharaters)のみをボックス経由で渡すことができるようになる。
参考:ダイレクト ブループリント通信 | Unreal Engine
・タッピーチキンのサウンド「SFX_Score_01」
マーケットプレースにあるタッピーチキンをダウンロードして入れる。
処理は以下のようになる。
これでコインをゲットしたとき音がなり、コインが消える。
チュートリアルPart05
・コースのアップダウンの実装
・上り坂の作成(BP_FloorTile_RampUp)
Classに「FloorTiles」を繋げたしたとき、
「Get AttachPoint」で以下のようなエラーが出た。
なので、
以前に必要ないといわれた「Cast to BP_FloorTile」を以下のように繋げた。
実行すると動くため問題ないと思われる。
・下り坂の作成(BP_FloorTile_RampDown)
あとは、
BP_FloorTile_RampDownを配列に追加する。
実行すると、アップ・ダウンがあるステージができる。
チュートリアルPart06
・コーナーの実装
・コーナーを曲がれるようにする
・Parent: Construction Script
親のConstruction Scriptが呼ばれている。
コーナーには、障害物・コインがない状態にしたいため、
今回はこれを削除している。
・右曲がり角の作成(BP_FloorTile_RightCorner)
カーブを曲がれるようにする処理
カーブが連続でなった場合、コースが重なる恐れがある。
そのためカーブは特別な扱いとする。
(ストレート何回か入れたら、カーブを1回入れる)
まず、カーブ生成の処理
・ストレート8回入れたら、カーブを1回入れる処理
・Add FloorTileの処理
・Add FloorCurveの処理
これで右に曲がれるようになった。
・左曲がり角の作成(BP_FloorTile_LeftCorner)
あとは、BP_FloorTile_LeftCornerを配列に追加する。
これで左にも曲がれるようになった。
チュートリアルPart07
・壁に衝突すると倒れる処理
・UMG作成
・完成
・まとめ
・壁に衝突すると倒れる処理
Block,Overlap,Ignoreについて調べてみた。
※Blockingは、Blockに設定された2つ(以上)のアクタの間に自然に発生する。
参考:コリジョン反応 | Unreal Engine
※Overlapは、見えないコリジョン同士が重なった時に発生する呼び出しのイベント。
簡単にいうと、
検出 | 画像 | 簡単な使い分け | 当たり判定イベント | |
---|---|---|---|---|
Block | 衝突検出 | 衝突判定がいる。めりこまさない。衝突判定後移動させる。 | Hit | |
Overlap | 重複検出 | 衝突判定がいらない。まりこます。衝突判定後移動させない。 | Actor Begin Overlap, Actor End Overlap | |
Ignore | 無視 | 衝突判定がない。めりこむ。衝突判定なし。 | 当たり判定イベントなし |
参考①:猫でもわかるUnreal Engine4
参考②:コリジョン反応 | Unreal Engine
・Actorのノードについて
Get Actor Forward Vector | 正面方向の単位ベクトル(X軸)取得 |
Get Actor Right Vector | 右方向の単位ベクトル(Y軸)取得 |
Get Actor Up Vector | 上方向の単位ベクトル(Z軸)取得 |
・Dot Product
・Nearly Equal(Float)
Aとbを比較してほぼ等しいならtrue。
・A:比較対象
・B:比較対象
・Error Tolerance:「ほぼ等しい」として考慮できる最大容量の差
参考:Blueprint Node: Math Node - Epic Wiki
今回の場合、
RunCharactorの正面方向とヒットした方向を比べて倒れるかどうか決めている。
まっすぐ衝突したとき、「-1」になる...らしい。(よく分からない)
だけど倒れない...。
よく考えると、RunCharactorのX軸って正面なのか疑問になり見てみると、
正面じゃありませんでした?(でもこれは、選択しているのがメッシュだがあっているのか...)
よく分かりません。
なので、
「Get Actor Forward Vector」じゃなく「Get Actor Right Vector」を使ってみた。
結果ダメでした。
なので、軸を変えてみる。(ちょっとやり方がわからないので保留)
参考:UE4 読み込んだモデルのサイズや向きが異なっていたら | the-saurus
ニコニコのコメントに、
「-1じゃなくて1にしたらうまくいった」
と書かれていたので試してみた。
できました!コメントした方ありがとうございます。
・UIの作成
Widget作成する。
コイン取得数表示させる。
Widgetをゲーム画面に表示させる。
UI作成完了。
ゲーム完成。
あとは、好みで
・障害物を破壊させる
・一定のところしか通ることができなくなる
・走った距離を出す
・アイテムの追加(爆弾やマグネットなど)
機能を追加していく。
エンドレスランナー作成終了。