見出し画像

ゲーム画面のボタンは初期配置するか、プログラムコードで生成するか...

こんにちは「つけらっとゲームス」プログラム担当のとちです。
ゲームを作る他に専門学校のシステム系学科で外部講師もやってます。

今回はオブジェクト配置をテーマにお話したいと思います。

タイトルでは「ボタン」と書いてますが、ボタンに限らず枠線やキャラクター、背景画像などゲーム画面を構成するあらゆるモノ(ここではオブジェクトとします)の表示タイミングや表示の仕方について考えてみましょう。

ことの発端は以下の「つぶやき」にいただいたコメントから始まります。

質問です💡
専門学校でこういうのを作る時って、動かないデザイン(背景のパネル的なものや、吹き出し、キャラクターなど)は、Excelで元から配置するのですか?
それとも上記のような部分もコードを書いて設置するものだったりするんでしょうか?

カクスタ様からいただいたコメントを引用

なるほど、これは面白い質問です!
(勉強熱心な学生は好印象です。いや学生じゃないけど)

確かに、GUIを簡単に配置できるエディタを使用していると、あまり考えずに初期配置してしまいがちですが、いまから数十年前のエディタでプログラム作成している時って全部コードで表現していましたよね…

わたしが20代前半の頃、Windows3.1から95、98へと移り変わる頃でして、その頃のVisualBasicを触って「こんなんで画面作成できちゃうの?」って衝撃を覚えたんです。でも、今はそれが普通になってます…

前述の「つぶやき」コメント欄でも返答しましたが、しっかり考えると面白いお題だなーと思いまして、今回記事にした次第です。

ちなみに「cactus stance(カクタススタンス)」さんの記事やゲーム画面、とにかく、カワイイんですよ。弊サークルメンバーで共有したところ「カワイイ、雰囲気いい!」と大好評。皆様にも見ていただきたいのです!

また、今回記事の同テーマについて「一緒に投稿しよう!」という無茶振りを聞いてくださったので(ありがとうございます!嬉しい!)コチラ、是非見てください!

1人の意見だけでなく、複数の人の意見を見比べるの大事ですからね!

なるほど、うんうん、わかる! それはそうだ!
カクタススタンスさんの記事の中でおっしゃっていることについても、後述しますね。

さて、オブジェクトをエディタ上で初期配置するか、プログラムコードで生成するか、なんですけどシチュエーションで変わると思います。

そもそも「初期配置」と「コード生成」とは何を指しているのかが難しいかもしれません。今回も話が長くなりそうですがお付き合いください~



前提!

当たり前のように「初期配置」「コード生成」と言ってますが、それが何なのかを定義しておきましょう。
例は弊サークルのシューティングゲーム「つけらっと防衛軍」です。

◆初期配置

以下のスクショはゲーム開発環境(Unity)エディタ上での表示画面です。

エディタ上でのゲーム画面

メッセージ枠とメッセージの場所は合ってないし、キャラクター画像の上に文字があり読めません。
初期配置はこれら枠線や文字列等をエディタ上で配置しています。

◆コード生成

それに対して、次のスクリーンショットはゲームとして動かしている画面。
島の形をみると先程と同じ場所なのがわかりますね。枠線と文字列の表示位置も合ってますし、先程までは見えなかった自機や雲があります。

ゲームプログラム実行画面

初期配置のオブジェクトは、隠したり、透明化したり、削除してゲーム画面を構成しています。しかし、よく見ると先程のスクショには無いオブジェクトも幾つかありますね。

そうです。雲、自機、そしてステージ中で出現する多くの敵機等はコード生成でゲームに登場させているのです。

この記事での「コード生成」の定義として、Unityを使用していると仮定した場合、プログラムコードによってリソースフォルダから読み込んだ、あらかじめプレハブ化しておいた、またはサーバーからDLした素材等をオブジェクト生成しゲーム画面に登場させた事を意味するとします。


本題!

では「初期配置がいいのかコード生成がいいのか」を考えていきます。

◆教材として

前述の「つぶやき」コメント欄でも言及していますが、学習対象者のレベルによって大きく変わると思います。わたしが担当している学生は3年制の学科の1年目ですので、なるべく簡単に視覚的にわかりやすい方法がいいでしょう。覚えることが多すぎるとキャパオーバーしますからね。

◆オブジェクトが動くか固定か

ゲーム画面を再掲します。画面右側のUIは初期配置です。
UIを表示しているフレーム部分は画面の右端(見えない場所)からスライドインしてきますが、大きな動きをする場所ではありません。

ゲームプログラム実行画面(再掲)

パワーパックを取得した、パワーアップした、通信が入った等々、UI部分にも演出はありますが大幅に表示座標が変化する処理はありません。決まった位置のオブジェクトは初期配置で良いと思います。

これに対し自機、敵機、雲の表示座標は大きく変化します。これらはステージ開始時にオブジェクトをコード生成し、ステージ終了時や撃墜時には削除しています。

「生成と削除」つまり「初期化と動作」を繰り返すのでコード生成が無難ですね。

◆複数あるかどうか

前述通り「UIは演出があっても大きく変化することが無い」です。
1度表示してしまえば増えることもありません。初期配置でいいです。

これに対し自機は1つだけですが、敵機は山ほど出てきますし、雲も複数出てきます。これを手で配置していく作業は面倒です。やりたくありません。まさに苦行。同じようなオブジェクトですのでコード生成がいいでしょう。

◆デバッグはどうよ?

これはエディタ上でデバッグしているときに関係するんですが、Unityはオブジェクトをコード生成するとHierarchyの欄に増えて行きますよね。
デバッグでオブジェクトの各コンポーネントの値を確認したいとき、対象となるオブジェクトを探すの大変なんですよ。

これに対し初期配置のオブジェクトはゲーム再生前からあらかじめ参照したいオブジェクトを選んでおけるので内容の確認が楽です。

◆ゲーム画面のレイアウトを考える

システム設計の授業を担当している人間として、これはあんまり大きな声では言えないのですが、画面レイアウトをエディタ上で思いつきで作っている時は初期配置だらけになります。

思いつきじゃなくても、画面レイアウトの大枠を構成するオブジェクト、つまり、UI類は初期配置で構わないと思うんですがいかがでしょう?

◆全部コードで書いてるよね?

前述の「cactus stance(カクタススタンス)」さんの記事「オブジェクトの初期配置ってどうしてる?」を読んで、はっとなったんです…

初期配置しているモノも、結局は(Unity側で)コードを書いて表現しているものなんですよね。たしかにそうだ!

んで、Sさんのおしゃるとおりコード生成はコードでガァァァーって書いてある部分を読めばよくなるので、画面切り替えが少なくなるという利点があるんですよ。これはコード書く人にとっては良い方法だと思います。

スクリプトエディタで必要箇所を文字列検索できるし、似たような設定であればコピペでいい、変更があっても文字の置換えで対応できる(一括置換すると気持ちイイッッまである)ので、そこはメチャクチャ便利なんですよねぇ~

うん、やはり聞いてみて良かった!


AIに聞いてみた!

ただね、自分の開発時を思い浮かべると「これだ!」という強い理由が無いことに愕然としました。本当に思いつきで作っていることがわかりました。実は元々システム設計は苦手なのです…

しかし、質問された以上は答えたいし、わたしもどっちがいいか知りたいのでAIさんに聞いてみようと思います。

というわけで質問。

「Unityでゲームを作る際に、オブジェクトはエディタ上で初期配置した方が良いのか、それともプログラムコードで生成した方が良いのか教えてください。双方のメリット、デメリットがあれば、それも教えてください」

以下は返答です。

Unityでオブジェクトをエディタ上で初期配置するか、プログラムコードで生成するかについて、それぞれのメリットとデメリットを以下にまとめました。

エディタ上で初期配置
メリット:
・視覚的に配置: オブジェクトの位置やサイズを直感的に調整できます。
・即時フィードバック: 配置したオブジェクトの見た目や動作をすぐに確認できます。
・簡単なデバッグ: エディタ上での変更がすぐに反映されるため、デバッグが容易です。
デメリット:
・柔軟性の欠如: 動的にオブジェクトを生成する場合に比べて、柔軟性が低いです。
・大量のオブジェクト管理が難しい: 多数のオブジェクトを手動で配置するのは手間がかかります。

プログラムコードで生成
メリット:
・柔軟性: 条件に応じて動的にオブジェクトを生成できます。
・再利用性: 同じコードを使って複数のシーンやプロジェクトでオブジェクトを生成できます。
・自動化: スクリプトを使って大量のオブジェクトを一括生成できます。

デメリット:
・視覚的な確認が難しい: コードだけではオブジェクトの配置を直感的に確認できません。
・デバッグが複雑: コードのバグを見つけるのが難しい場合があります。

どちらの方法を選ぶかは、プロジェクトの規模や要件、開発者のスキルセットによって異なります。どちらの方法にも一長一短があるので、状況に応じて使い分けるのが良いでしょう。

Copilotの返答を一部引用

「書いた記事をそのまま吐き出してません?」ってくらい言ってる内容が似てる。だがしかし、文章はAIの方がうまいし短い、わかりやすい!

どっちがいいかは状況に応じて使い分ける。となると、そのへんは開発者の経験値次第になってくるんだろうなーと思います。

そういえば以前、弊サークルのゲームではない、結構な規模のUnityプロジェクトを触らせて貰ったのを思い出しました。そのプロジェクトも弊サークルのゲームと思ったより違いは無かったような記憶があります。

みんな、自然と似ている作り方してるのかなぁ~?
というわけで結論としては

UIや大きく動かないオブジェクトは初期配置
動きまくるオブジェクトはコード生成

単体オブジェクトは初期配置
複数オブジェクトはコード生成


おわりに

いかがでしたでしょうか?
なんかフワっとした終わり方になっているような気がします…
大丈夫でしょうか?

今回は処理効率を無視して作りやすい方はどっち?という話になったような気がしますので、最後にAIさんに処理効率とマシン負荷を考慮して回答して貰いました。

・初期配置
初期ロード時間が長くなる可能性があります。
ゲーム中のパフォーマンスは安定します。

コード生成
初期ロードは短縮できる可能性があります。
ゲーム中の生成時に一時的に負荷がかかることがあります。

結論
静的なオブジェクト(例えば、ステージの背景や固定された障害物など)はエディタ上で初期配置するのが良いでしょう。

動的なオブジェクト(例えば、敵キャラクターやアイテムなど)はプログラムコードで生成するのが適しています。

Copilotの返答を一部引用

……えーと、AIさんは結論も上手くまとめたなぁ。似たようなことを連続で聞いたから、より具体的な結論を答えたんだろうか?!

というわけで今回は「AIさんは賢いねぇ」というお話でした。
ではなく「初期配置とコード生成は状況に応じて!」というお話でした。

もう少し、プログラミングの勉強について読みたい方は、以下のマガジンにまとめていますのでご覧ください。

普段はこんなゲームを作っているサークルの人です。
ご興味がございましたらご覧ください(↓)

それでは、また別の記事でお会いできるのを楽しみにしております!

この記事が参加している募集

弊サークルの活動を応援してもいいなと感じていただけたら嬉しいです。 いただいたサポートは「地域/若者向けの展示会費用」「ゲーム開発費」として使わせていただきます! サポートよろしくお願い致します~🐱🐭