【UEチャレンジ企画】スクリプティングの知識を深める
![【UEチャレンジ企画】スクリプティングの知識を深める](https://s3-ap-northeast-1.amazonaws.com/cdn.gamemo.confidence-media.jp/production/posts/eyecatches/000/002/204/original.jpg)
初学者がUnreal Engineによるゲーム制作に100日取り組んで、どこまでプロの開発者に近づけるのかという本企画。今回は第6弾となります。
前回、『Unreal Engine 5で極めるゲーム開発』を読み始めた筆者。今回はビジュアルスクリプティングシステムのブループリントを学習して、より複雑なプログラミングができるようになりました。
Unreal Engine企画第六弾!
Unreal Engine100日チャレンジに挑戦している、Neruです。
この企画は、Unreal Engineの初学者である筆者が、100日間の学習でどれだけのものを作れるのかというチャレンジ企画です。
初回の記事で、この企画の詳細と、筆者の経験値がどの程度なのかを説明しています。
前回の記事では、物体やキャラクターに動きのある要素を追加して、ゲームとして遊べるような仕組みを作りました。
今回は、Unreal Engineに搭載されているビジュアルスクリプティングシステム、ブループリントのアルゴリズム部分について学習しました。ブループリントとは、Unreal Engineに標準搭載されているシステムで、文字を書くことなくプログラミングができる優れものです。
また、ブループリントは、アルゴリズムを表現することもできます。今回は、フロー制御、オブジェクト指向やクラス、変数など、他のプログラム言語でも取り扱うような事項を学習して、さらに複雑な仕組みを実装できるようにしました。
条件分岐で処理を分岐させる
まず学んだのが、条件分岐のさせ方についてです。
条件分岐は、プログラムを学習するうえで必須と言える項目です。ある条件を満たしている場合と満たしていない場合で、別々の処理を行うことを指します。条件分岐によって、プログラムが柔軟に対応できるようになり、さまざまな状況に応じた処理の実行が可能になります。
ゲームの場合も、条件分岐はプレイヤーの行動や状況に応じて適切に反応するために重要になってきます。
「マリオ」シリーズを例に取ると、マリオが敵に接触した場合、大きい状態の場合はダメージを受けるだけですが、小さい状態の場合は残機が一つ減ってしまいます。また、残機がまだある場合では残機が一つ減るだけで済みますが、残機がない状態はゲームオーバーになるという仕組みになっています。
このように、状況に応じて異なる現象を起こすためには、条件分岐をさせて異なった処理を実行する必要があります。通常のゲーム制作ソフトの場合は、以下のイメージ画像のようなコードを書いて処理をしますが、Unreal Engine 5では専用のノードを使って実現します。
今回の学習では、キャラクターがジャンプする際に条件分岐を取り入れました。具体的には、静止した状態からジャンプする際は若干の「タメ」が発生し、移動状態からジャンプする際はノータイムでジャンプできる、といった設定です。
以下の画像が、今回組んだプログラムです。
赤い丸に囲まれた、「Branch」というノードが条件分岐のノードです。このノードを通過させることで、「True」の場合、つまり条件に当てはまっている場合と、「False」の場合、条件に当てはまっていない場合によって、異なる処理を実行できます。
青い丸で囲ってあるのが、分岐の条件です。それぞれ、「ジャンプができるか否か」、「キャラクターのスピードが一定以上か」という条件になっており、これを満たした場合は処理が分岐します。
実際に制作に取り組んでみて、ブループリントでの条件分岐の特徴は、視覚的に分岐がわかりやすいことだと感じました。分岐をさせるためのノードは複数ありますが、いずれも白色で表現されているので、一見しただけでもどこが分岐点なのかがわかります。
また、文字でコードを書くよりも、分岐の様子が直感的に理解できると感じました。コードの場合は慣れていないとどこでどのような分岐をするのか理解するのに時間がかかってしまいます。一方ブループリントの場合は、どこからどこまでが分岐した処理なのかが、一目見ただけでわかります。
全体を通して、ビジュアルスクリプティングは、条件分岐と相性がいいと感じました。
オブジェクト指向に入門!
次に学習したのが、オブジェクト指向についてです。オブジェクト指向は奥が深い概念であり、初心者である筆者自身、深い部分まで理解できているわけではありません。そのため、専門的な解説については、以下のリンクをご参照ください。オブジェクト指向について例を用いて解説しています。
ここでは、初心者である筆者が習得できた範囲内で技術を解説します。
ゲームに含まれている各要素には、クラスという「属性」を設定することができます。キャラクターや物体など目に見えるものはもちろん、変数や操作の仕組みなど、目に見えないバックグラウンドの要素の多くにも、クラスを設定することができます。
クラスは階層構造になっていて、下位のクラスは上位のクラスの特徴を一部継承しています。上位のクラスはより抽象的で、下位のクラスになればなるほど具体的です。
これを身近なもので例えると、飲食店のメニュー表を挙げることができます。メニュー表は提供するものの種類(カテゴリー)によって、掲示する位置を揃えたほうが見やすいです。例えば、「ビール」と「枝豆」が同じ欄にあったとすると、見づらいメニュー表になってしまいます。
「飲み物」で「アルコールを含む」「ビール」は「お酒」の欄に、「食べ物」で「少量」の「枝豆」は「一品もの」の欄に配置したほうが、お客さんにとってわかりやすいメニュー表になります。
わかりやすいメニュー表のように、それぞれの要素の上位カテゴリーを用意して、開発のプロセスをより効率的に、わかりやすくする方針が、オブジェクト指向です。
Unreal Engineでも同様に、上位のクラスを設定し、それをもとに下位カテゴリーを作ることで、より効率的に各要素を作り込むことができます。例えば、「敵キャラクター」として「移動する」や「触れたらダメージ」などの要素を含んだクラスを先に用意しておくことで、具体的な敵キャラクターを迅速に作ることができます。
今回の学習では、「ピックアップ」というクラスを作って、「自機が接触した際に消滅する」処理を作りました。このクラスを作っておくことで、コインやアイテムなどの取得物を簡単に制作できそうです。
変数について学ぶ
次は、変数について学びました。変数もプログラミングには必須の要素で、筆者はOffice製品のプログラミング言語、「VBA」で触れたことがあります。
変数というのは、特定の種類のデータを記憶する場所に、識別用の名前を付けたものです。よく使われる例としては、「データを入れる「箱」にタグをつけるようなもの」と説明できます。
今回実装したい項目の具体例としては、RPGゲームにおいて、武器を装備した際やレベルアップした時に、ダメージが上がるような仕組みにしたいです。また、敵によって与えられるダメージが変わることで、豊富なバリエーションを感じられるようにもしたいと考えています。
この場合は、攻撃力と防御力を変数として設定して、【攻撃力=キャラクターの攻撃力+武器の攻撃力】【攻撃力-防御力=ダメージ】のような式を作れば、思った通りの仕組みを作ることができます。
このように、変数はプログラムがデータを保存し、操作し、参照するための基本的なツールになります。
今回の実習では、変数を利用して、コインを取得した際に、いくつ取得したかが表示される仕組みを作りました。
#UnrealEngine100日チャレンジ 35日目✨
— GAMEMO|Web3とメタバースのインタビューメディア (@Gamemo2con) July 3, 2024
引き続き変数について学習しています。
コインを取得した際、コインを何枚取得したかが左上に表示されるよう設定しました。
変数を活かせば、いろいろな機能が実装できそうです。頑張ってマスターします。#ゲーム製作 #ゲーム開発 pic.twitter.com/pOeGJWMs9Z
コインと接触した際、画面の左上に、水色の文字で「コインの枚数=〇」と表示されているのがわかります。
今回は「Num of Coin」という変数を設定し、コインと接触した際にメッセージが出力されるようにスクリプトを組みました。
以下が、今回組んだスクリプトです。
このように、簡単ではありますが、変数を使った処理が組めるようになりました。
変数を応用することで、ゲームとして必要な部分を作り込んでいけそうです。
頼れる情報源を探す
今回学んだ、条件分岐、オブジェクト指向、変数は、いずれもプログラミングの幅を大きく広げる概念でした。活用の幅は無限大にあり、重要なことを学べた満足感があります。
今回学習した内容は、複雑なことも含まれているので、前回までと比較して難易度が数段上がっています。そのため、前回までとは異なり、今回は何度か原因がわからないエラーにぶつかってしまいました。
その際、筆者が参考にして大いに助けられた情報源が2つありました。Epic Games公式のデベロッパーコミュニティと、ChatGPTです。
公式フォーラム
Epic Gamesはゲームエンジンを提供するだけでなくコミュニティの構築にも力を入れており、デベロッパーコミュニティフォーラムはその一環です。以下にコミュニティへのリンクを掲載します。
このフォーラムでは、Yahoo知恵袋のような形式で、Unreal Engineに関する質問とそれに対する回答を閲覧することができます。もちろん、アカウントを持っていれば直接質問もできます。
フォーラム内部は検索ができるほか、質問の種類によってカテゴリーが分けられているので、とても便利です。問題解決にはうってつけの情報源と言えます。
ただし、欠点もあります。Unreal Engineは英語で記載された情報が多いため、質問や回答を読むには英語の理解力と読解力が必要です。さらに難しいのが、自分が抱えている問題を検索するために英語で表現しなければならない点です。
筆者は英語にある程度触れたことはありましたが、ゲーム制作における英語の語彙はほとんど知らなかったので、それを調べるだけでも時間がかかってしまいました。
日本語のフォーラムも用意されていますが、英語の情報量に比べると、どうしても量的に見劣りしてしまいます。抱えている問題を日本語で解決しようとするには、やや情報不足だと感じました。
ChatGPTについて
もう一つの情報源として、ChatGPTが挙げられます。こちらは、期待していた以上に有益な情報源でした。
ChatGPTで使用できる最新のバージョン、GPT-4oでは、テキストでの質問のほか、画像をアップロードすることもできます。GPT-4oを使用して、ブループリントのスクリーンショットと質問を同時に送ることで、自分が抱えている問題を解決できる可能性があります。
ChatGPTがブループリントを認識できるのか懐疑的でしたが、体感ではかなりの精度で認識をしてくれます。今組んでいるブループリントが比較的単純だからうまくいっているだけの可能性もありますが、予想していたよりも正確で驚きました。テキストで補足説明すれば、ほぼ確実に認識してくれます。以下に回答例を一つ掲載します。
この方法のメリットは、日本語で質問しても適切な回答を返してくれることです。欠点としては、回答が日本語ではなく、英語で返ってきてしまうことです。しかし、英語の回答のあとに、回答を日本語に訳すよう命令すれば問題ないので、大きな障壁にはならないでしょう。
実際に筆者も、公式コミュニティで回答が見つからなかった際、ChatGPTの回答で原因を見つけたことがあります。改めて言語AIの進化を目の当たりにしました。
ただ、GPT-4oは現状、無料で無制限に使用できるわけではないので、その点には注意が必要です。一定以上チャットを使うと、GPT-4oが使えなくなってしまいます。使用量を調整するか、有料のプランを使うなどの対応が必要になります。
公式フォーラム、ChatGPTは、どちらも一長一短ある情報源だと感じました。
今後の目標:ブループリントのさらなる理解
今回は、条件分岐、オブジェクト指向、変数など、プログラミングには欠かせない概念をブループリントで表現することに成功しました。
ですが、ブループリントは奥が深く、まだまだ学習するべきことはたくさんあります。次回はブループリント自体への理解をさらに深めて参ります。
Unreal Engine 100日チャレンジは今後も継続します。引き続きどうぞよろしくお願いします!