スパッツくじ-Remake- ― キャラクター選択画面を制作02

こんにちは。
メイドさんこと、女装子ゲームクリエイターtoメイドです(笑)

いつもコメント、ときにはメッセージをいただき、ありがとうございます💗

以前から取り掛かり始めた、キャラクター選択画面の制作。


キャラクター選択画面
上記の画像はエディアンさんを選んでいる状態

選択画面なので、上の状態から「次」ボタンをクリックすると……





「次」ボタンをクリックしてタカナに変更した状態

タカナに変わり、「前」ボタンをクリックすると再び上のエディアンさんに戻る……ということをしないといけないんだけど。

今回使用しているインターフェースはボタン。
画面下の「前・決定・次」がボタンにあたります。

データ管理の都合上、メイドさんは「できるだけスクリプトファイルを増やさない」方向で制作をしているんだけど。
ボタンというインターフェースは、実は「そのボタンごとにクリックされた時の処理を設定する」ようになっている。
つまりは”ボタンの数だけスクリプトファイルが必要になる”ということである。

スクリプトファイルというのは、動作を記述した命令書のようなもの。
ゲーム・ツール共通でアプリケーションはこの命令書のとおりに動くようになっている。

で、上述のようにスクリプトファイルがボタンの数だけ必要になる、ということで。
なんとか1つのファイルで済ませられないだろうか? と思ったりして。
色々やってみてたんだけど。

結論から書くと。

“ボタンごとにきっちりスクリプトファイルを作ったほうがいい”

です。
より正確に書くと、今回の場合は「1つのスクリプトファイルにまとめて記述したほうがややこしくなります」。
ので、ボタンの数だけスクリプトファイルを作成し、それぞれにプログラムを記述したほうが単純であると。
一応、複数のボタンを、クリックしたものごとに処理を変える、みたいなことはできるし、やってみたんだけど、それでも今回の場合は別に記述したほうがいいということがわかった。

何が起きたのかというと。

まず、どんなプログラムの記述のしかたをしたのか、というところから。
(ボタンをクリックしたときのエディタでの設定等は端折ってます)

選択されているキャラクターは整数型の変数で管理しています。
(0がエディアンさん、1がタカナ、2が新キャラという感じで)

プログラムの動きでいうとこんな感じ。

・初期値を0にして、キャラクター選択画面の最初は必ずエディアンさんが選択された状態にする

・「次」ボタンをクリックすると変数が+1されて1に。
 タカナに変わる。
 更にクリックすると、さらに+1されて2に。新キャラに変わる。
 更にクリックすると……3にキャラクターはいないので0に戻す。ということで、代わりに0を代入してエディアンさんに戻す。

・「前」ボタンは「次」ボタンの逆の処理。
 クリックすると-1されるけど-1にキャラクターはいないので、代わりに2を代入して新キャラに変わるようにする。
 更にクリックすると-1されて1になり、タカナに変わる――といった感じ。

……というのを1つのファイルにまとめて記述し、ゲームを再生してみたら。

最初にエディアンさんが表示されるのは想定どおり。
「次」ボタンをクリックしていくと、ちゃんとキャラクターが順繰りで表示される。
が、問題は「前」をクリックした場合。
何も起きなかったり、「前」をクリックしたのに次のキャラクターが表示されたり、といったことが起きる。
(逆も同じように。最初に「前」ボタンをクリックするとちゃんと逆順にキャラクターが表示されていきますが、そのあとに「次」をクリックするとおかしな挙動になります)

何故だ?
というか、今となっては”なんで気づかなかったのか?”という(笑)
これがまさに「1つにまとめたほうがややこしくなる」状態。

どういうことが起きているのかというと。
まず、最初にどちらかのボタンをクリックしたときは、実行しているのは「その処理だけ」なので、この時点では想定どおりに処理がされる。
が、後に別のボタンを押した場合はおかしいことになる。

というのもプログラムは条件分岐でやってる上に、プログラムというのは「基本的に上に書かれてるものから順に実行されていく」というのが超基本のルール。
つまり、最初にクリックしたときはその処理のみで終わるが、後に別のボタンを押した場合、前に押したボタンの処理も実行されてしまってる、ということに。
ので、+1して1になったけど、今度は後に記述されてる「1なら-1する」という処理が実行されているため、結局0に戻るので何も変わらなかったり「次」をクリックしたのに前のキャラクターが表示されたり……といったことになっていたようだった。

ので、今回の場合は素直にプログラムを別に分ける必要があります。
「次」をクリックしたときは次に進める処理のみ。
「前」をクリックしたときは前に戻す処理のみ、という風に。

そもそも何で今回プログラムをまとめて書いていたのか……という。
理由としては「変数の扱いをそのファイルのみで完結させようとしてたから」で。
ファイルを別に作った場合は「元のスクリプトから変数を参照する処理」が必要になるためです。
が、素直に分けたほうが単純だったみたいです。

ということで分けることになったが……

プログラムを分ける場合も、元のスクリプトから変数を参照するときに詰まった部分がある。
それは「インクルードの要領で変数とその値だけ持ってくる」という端的な使い方はできない、ということ。
ちゃんと「ここにオブジェクトがあって、そのオブジェクトから元のスクリプトが実行されてる。そのスクリプトに変数があるから、その変数を参照して」と、細かく教えてあげる必要がある。

オブジェクトを教えずに参照の記述だけ書いた場合、プログラムとしては間違いではないのでゲームは再生される。
が、どちらのボタンを押しても何も起きない。
ログを見てみるとエラーが発生している。

内容は「変数を参照しているオブジェクトのインスタンスがありません」みたいなこと。
わかりやすく書くと「他のスクリプトの変数への参照……と書かれてますが、そのスクリプトを実行しているオブジェクトはどれなんでしょうか? 教えられていないので処理ができません」となってエラーとなっている、ということ。

ので”どこに何があって、どういう処理をしているのか、何をしてほしいのか”というのを細かく教える必要があると。
プログラムでは基本中の基本ですね。忘れてしまってました(笑)
あと”横着をするな”ということですね。
ちゃんときっちりやらないといけない。


そんなこんなで、ちゃんと処理ができました。




レイアウトとプログラムが一通りできたキャラクター選択画面
あとはキャラクターごとのモーション等が設定できればこの画面は完成

ちゃんと想定どおりの処理・動きができるようになりました。

全体的にプログラムの経験がない方……いや、経験がある方でも何書いてるのかわからなかったかもしれないけど(笑)
そんな感じで、現在も制作は続けています、と。

以上のようなことで。
キャラクタ選択画面のプログラム制作の話でした。


最後までお読みいただき、ありがとうございました。
























コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です