お茶漬けびより

"あなたに教わったことを、噛んでいるのですよ" 五等分の花嫁 7巻 「最後の試験が五月の場合」より

第2回 関西UE4 GameJam に参加しました

初めてゲームジャムに参加してきましたので、その反省をしたいと思います。

参加したイベントは以下のURLです。

connpass.com

あまりゲームジャムのことは書いていませんが、参加しようと迷っている方は最後の方だけでも読んでいくと良いかもしれません。

 

自分は主にプログラム(ブループリント(以下、BP))担当でした。

他にプログラムを作る人は二人いて、一人はUE4で仕事をしているようなプロの方でした(とてもお世話になり、助かりました)。もう一人は学生でした(同じくお世話になりました)。

自分のチームが作ったゲームは、競争型の4人対戦ゲームです。

簡単に言うとアイスクライマーのようなゲームなのですが、足場が小さくジャンプで足場から足場に飛び移って上を目指すゲームです。

このゲーム開発の中で自分は、床の制作を担当しました。床といってもただの床ではなく、下からジャンプでぶつかると壊れたり、床の角度が変わったり、通常は下から床を抜けることは出来ませんが、それが可能な床であったりといくつかギミックを作りました。そのうちいくつかは時間が足らず実装に間に合わないものもありました。

それ以外にも拾って使うことで有利になるアイテムを作成しました。といってもアイテムの型は他の方が作成し、機能の部分のみを作るという感じでしたが(自分にもっと力があれば……!)。

作成したモノの紹介はまた別の機会にするとして、今回は反省でこうすればよかった。ここが自分には足りていないなとか、こうしてよかったこと(あれば)などを書いていこうと思います。

 メモを取る

時間は限られており、自分がする作業を忘れたり情報に齟齬が生まれるということは避けたいです。メモは取っていましたが、メモしきれておらず何度か作業を確認したり、勘違いしていることがあったりと時間を無駄にしてしまいました。

メモは紙に書いていたので、PCを使っていればメモしきれていないという状況は避けられたかもしれません。

また、自分はあまり聞き取り上手ではないので、話が早いとついていけないことがあります(ここら辺ってどうやったらついていけるようになるんだろう……)。途中で何の話をしているのか分からなくなったり、話の結果どうなったのか分からなかった場合は、すぐにその場でリーダーに聞くというのが最善かなと思いました。

ゲームのことで甘く見ていたのか、思っているよりも自分の知らない単語が出てきたので、プログラム周りだけでなくゲーム全体の作業を知っておくともう少しついていけたのかも……?

まとめると上記は、主にコミュニケーション能力になるでしょうか。

・メモは一番情報を得ることが出来る方法で取る。

・会話に参加できるように分からなくなったらその場で聞く。

こう書くととても当たり前のことですね。

これを少しでも克服するためには、人と話す機会を増やしたり要点をまとめる癖(勉強したことをまとめたり、ブログを書いたり)をつけるといいのかもしれません。

基本的な手段や基礎は、調べなくても出来るようになる

これは主にBPのことです。

BPの簡単なことはできるようになったと自負していたのですが、思っていたより上手くいかず、そのたびに調べたり人に聞いたりしていました。今回の件でBPでよく使う機能や手順は調べなくても手癖で出来るようになろうと思いました。

BPの簡単なことというのは、オブジェクトの移動や回転のノードの機能(相対的な移動や絶対的な移動)を把握しておくことや、フロー制御の機能、一定間隔で動いたり何かイベントを起こすといった方法などです。

また、ノードだけに詳しくなるのではなく、BPの機能的な部分も詳しくなりたいので、BPの継承であったり、インタフェース、ディスパッチャーや関数、上記に書いたフロー制御といったBPの基礎?を勉強したほうが良いと感じました。ここら辺を知っておくと速く良いものが作れそうです。

改めて考えてみると、ノードのことはよく調べるのですがBPの基礎?はあまり調べたことがありませんでした。プログラム言語だと基礎となる関数の作り方や制御フロー、インタフェースといったことを調べて開発を進めていくのですが、BPはそれを知らなくてもノードの機能を利用することで作れてしまうことが多い気がします(まだ経験が浅いですが)。調べてみてもUE4の入門は、BPを使ってゲームの開発を出来るようにすることに焦点を当てているので、機能部分はあまり見ません(というか必要ない)。これは良いことではあるのですが。

プログラマーとしてBPの基礎は知っておくべきだと感じたので、これを機に調べてみようと思います。

まとめると上記は、BPの基礎能力でしょうか。

  • BPの基礎(フロー制御、継承、インタフェース、関数、ディスパッチャー)を理解する。
  • BPの基本的なノードの機能(回転、移動、拡縮、Timelineや様々なイベント)を把握しておく。

 

以上が今回のゲームジャムで得た自分の課題です。

初めはゲームジャムのことを書こうと思ったのですが、特に説明することがないなと思いやめました(本当にURL先のスケジュールのような感じでした)。

ゲームジャムがどんなところか知りたいという人は、とりあえずゲームを作りたいという気持ちを持ってゲームジャムに参加するのが一番だと思います。特にUnityやUE4のようなゲームエンジンを使うゲームジャムはかなり参加しやすいです。

自分は3Dのゲーム開発はしたことがなく、UE4で簡単な機能を作れる程度の能力ですが、それでも参加をしていくつか機能を作ることが出来ましたから。

ゲームを作る能力がない、でもゲームを作りたいという気持ちがある(これが一番重要です)人は、Unity、UE4などのゲームエンジンを使うゲームジャムに参加するときっと良い経験になると思います。もちろんゲームエンジンを限定していないゲームジャムでも良いです。

特に学生の方は今すぐにでもゲームジャムに参加するべきです。社会人だと今よりも参加しづらくなります。基本土日に開催されると思うので、社会人になるとゲームジャムで丸二日作業して次の日仕事……ってなるので。自分はそれでも人とゲーム開発をしてみたかったので参加しましたが。

学生なら月曜の授業や土日月?のバイトをサボっても良いんです。授業より、数時間のバイトで得た金額よりも必ず得られるものがあります。というのも授業や数千のバイト代はあとで取り返せます。ゲームジャムはその時しかありません。

と、最後に学生の方に向けて書いてみましたが、これは学生のときに何で自分は参加しなかったのだろうと後悔しているからです。一人でゲーム開発をしている方はぜひ参加してみてください。きっと良い日になります。

操作キャラクターの目の前にあるオブジェクトのイベントを呼ぶ

初記事です。UE4の話です。

 今回作った機能は、アクションボタンを押したときにオブジェクトによって異なるアクションを起こす機能です。例えば、ゼルダの伝説というゲームがありますが、Aボタンを押すだけでも状況によってアクションが変化します。宝箱が近くにあれば宝箱を開け、登れる壁があれば登り、押せるオブジェクトがあれば押したりなど。そんな機能を作ります。

 手順としては、アクション用のBPクラスを作り、イベントディスパッチャーを使って、プレイヤーからオブジェクトのイベントを起こします。

まず簡単に流れを考えます。

アクションボタンを押す

目の前にオブジェクトがある?―(ない)→終了

↓ある

アクションイベントを持っている?ー(ない)→終了

↓ある

アクションイベントを呼び出す

終了

この流れを、操作キャラクターのBPに追加します。

 

アクションボタンを押す

これは、プロジェクトの設定からインプットにあるAction Mappingsで追加します。

今回、名前は「Action」にしました。

 

目の前にオブジェクトがある?

これは、LineTraceByChannel を使います。

LineTraceByChannelについては、以下を参照ください。

docs.unrealengine.com

以下のように組みました。

f:id:pickles-ochazuke:20161123100311p:plain

 

アクションイベントを持っている?

今回の本題です。

まず、アクターにアクションイベントを持たせます。そのために新しいコンポーネント(アクションコンポーネント)を作成し、そのコンポーネントにイベントディスパッチャー(アクションイベント)を作ります。そして、アクション用のアクター(アクションアクター)を作り、アクションコンポーネントを追加し、アクションを持っていることが分かるようにタグを追加します。アクションイベントを持たせたいアクターを作るときは、このアクションアクターを継承するようにします。

図にすると以下のような感じです。

f:id:pickles-ochazuke:20161123111027j:plain

では、まずコンポーネントを作っていきます。

コンテンツブラウザの新規作成からブループリントクラスを選び、親クラスとしてActorComponentを選びます。作ったコンポーネントの名前は、ActionComponentとしました。

f:id:pickles-ochazuke:20161123111506p:plain

次にBPを開いて、イベントディスパッチャーを追加します。

名前はActionDispatchにしました。

f:id:pickles-ochazuke:20161123112055p:plain

次にアクション用のアクターを作ります。

コンテンツブラウザから新規作成でブループリントクラスを選びます。親クラスはActorを選びます。作成したBPの名前は、ActionActorBPにしました。ActionActorBPを開いて、コンポーネントを追加からActionComponentを追加します。クラスのデフォルトを選んだ状態で、詳細のActorのTagsのタグを追加します。タグの名前は、Actionにしました。

f:id:pickles-ochazuke:20161123113211p:plain

これでアクション用のアクターは完成です。あとはアクションを付けるアクターを作るときにActionActorBPを親クラスに選び、ActionComponentのActionDispatchをイベントに追加すれば、OKです。

では、操作キャラクターのBPに戻ります。

まず、ヒットしたActorがActionタグを持っているか見ます。Actionタグがあるということは、アクションイベントを持っていると判断し、ActionDispatchを呼び出します。これで、ヒットしたActorのアクションイベントを呼びます。

BPは以下のようになります。

f:id:pickles-ochazuke:20161123114238p:plain

 

アクションイベントを呼び出す

一応流れとしては完成していますが、試しにイベントを呼び出してみます。

ActionActorBPを親クラスに選び、ActionChild1とActionChild2を作ります。

そして、ActionDispatchをイベントに追加し、分かりやすいようにPrint String でてきとうな文字を入力します。もちろんActionChild1とActionChild2は別々の文字を出力するようにします。

細かい説明は面倒なので、以下の動画をご覧ください。

youtu.be

これで、操作キャラクター側のBPをいじることなく、オブジェクト内をいじるだけで新しいアクションが追加できるようになりました。

もっと簡単な方法や、何か問題があるかもしれませんが、分かり次第追記しようと思います。