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をかなり速くして遊びました(ゲーム製作を楽しみましょう)
次回は敵を設置して倒せるようにしたいと思います。(もしかしたら僕の都合で変わるかもしれません)
では、今回はこの辺で!