Board Game Arenaで自分のゲームを遊べるようにするまで(2023年8月)
2023年度の年間目標の1つとして、サイコロ塾で作成したボードゲームを「Board Game Arena」(BGA)でプレイすることができるようにする、ことを掲げました。
このnoteは、1週間に一度追記していき、その1週間のうちにどんなことを学習したかを書き残していく個人的なメモの8月版です。
8月は7月に引き続きPHPの学習を進める予定でしたが、個人的な事由によりいったんPHPの学習をお休みして、Unityでのゲーム作りを学ぶことにしました。
Unityでの学習がBGAへのボードゲームの実装にそのまま役立つかと言われると、直結はしないのかなと思いますが、近視眼的に構えるのではなく、もう少し広い視野からプログラミングでのゲーム作りをしてみるのも良いかと思うので、この1ヶ月だけ集中して行う予定です。
第1週:8月1日(火)〜8月5日(土)
火曜日という中途半端なところから学習を始めていますが、月初めでキリが良いということで。
8月1日(火) Unity1日勉強会
8月1日(火)には、研究室のゲームプログラミングができる学生に1日空けてもらい、一緒にUnityに触れて「ブロック崩しゲーム」の基礎的な部分を作る、ということをしてもらいました。
Unityに触れ始めると、GUI(グラフィカル・ユーザー・インターフェース)を用いている部分はまるでパワーポイントのように感じました(特に今回は2Dだったこともあり)。
また、画面の右側はインスペクタービューと言いますが、こちらはイラストレーターでプロパティウインドウをいじっているような感覚でした。
この日は、基本の「き」ということで、Unityの画面における基本的な構成を教えてくれたのですが、ノーコードではなくあくまでスクリプトを用いる、ということを要望していたので、「ボールの作成」「ブロックの作成」「パドルの作成」それぞれについて、スクリプトで動的に出現させたり、動かせるようにするプログラムをしていきました。
本当にわかりやすく教えてくれ、また、初心者であることを配慮して、たくさんの質問に答えながら学習を補助してくれて大感謝です!ありがとうございます。学んだことはたくさんありますが、いくつか抜粋して書きます。
Unityで作られるゲームの構成要素には、SceneとGameObject、Componentがある
→ボードゲーマー脳としてはコンポーネントと聞くと別のものを思い浮かべてしまいますが、ここでは「GameObjectに付与されている効果」みたいなものと理解しましたデジタルゲームであっても仕様設計が大事
→いずれBGAでゲームを作成するときもそうだと思うのですが、ゲーム内の色々な構成要素、要素間の関係(並列・包含など)をきちんと設計しておくことは必須ですねVector3、Intなど型が存在する
→ちょっとイメージできなくてつまずいたのですが、「箱」くらいのイメージを持っておけば良いということでしたStart()とUpdate()
→Unityのスクリプトを開くと自動で書かれている関数で、この中({})に処理を書くとそれぞれ、初めの1回、1フレームに1回実行されるということでしたGameObjectにComponentをアタッチする
→例えば、ボールに「衝突判定」を付与したり、何かにぶつかった時の処理を付与したりします。こういうふうに、オブジェクトそのものに処理をつけていくのを「オブジェクト指向」というそうです。「SerializeField」の直後の一文に書いた変数がインスペクタービューからその値を変更できるようになる
→これすごく大事な処理だなと思ったので書きました。
色々やってみた「BallMover」(ボールにアタッチしたスクリプト)が以下のようなものです。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BallMover : MonoBehaviour
{
private Vector3 BallPosition;
[SerializeField]
private float BallVelocityY = 0.01f;
private float BallVelocityX = 0.01f;
// Start is called before the first frame update
void Start()
{
BallPosition = transform.position;
}
// Update is called once per frame
void Update()
{
BallPosition.y += BallVelocityY;
BallPosition.x += BallVelocityX;
transform.position = BallPosition;
}
private void OnCollisionEnter2D(Collision2D other) {
if(other.gameObject.tag == "Celling"){
BallVelocityY *= -1;
}else if(other.gameObject.tag == "LeftWall"){
BallVelocityX = 0.01f;
}else if(other.gameObject.tag == "RightWall"){
BallVelocityX = -0.01f;
}
}
}
それぞれ、天井(Celling)や壁(LeftWall、RightWall)にぶつかった時の処理がアタッチされています。
このほかに、ブロックを動的に生成するスクリプトなんかも書いたのですが、これについてはしっかり復習しておこうと思います。
8月2日(水)以降
2日以降は新たにテキストベースで学習を進めました。1日に基本の「き」を学習したこともあり、飛ばせるところは飛ばして進めました。
使用しているテキストは以下のものです。2冊のテキストを準備したので早いところ進めていきたいですね。
ただ、前日に1点だけ解消できなかったことがあったので、どのように対処したかも含めてそれについて書いておこうと思います。
通常、スクリプトを入力していくと、「自動補完」という機能で呼び出したい関数の綴りを途中まで書くと選択肢が出てきて、そこから選べるようになっています。
UnityではC#の関数と、UnityEngineを読み込むことで使用できる関数があり、そこにあらかじめある関数であれば自動補完がなされます。この自動補完の機能ですが、たびたび機能しない場合というのが報告されています。
実際のところ、1日に勉強会をしていた時点でこうしたことはなかったのですが、もう1つ「綴りの誤りなどがあった際に、誤りであることを知らせる赤線が引かれない」ということが起きていました。
これに関しては、僕がUnityのスクリプトを書いていくのに、「VS code」を使用していたことが問題であるということに落ち着きました。2日以降、VScodeではなく、Visual Studioにしたところ解決しましたので、現在はそちらで学習を進めています。
今までHTMLやCSS、PHPをVScodeで書いてきていたので切り替えるのはなんだかなぁとか、Visual Studioの容量大きいなぁという。
1ヶ月、デジタルゲーム作りをするときだけ使おう、と割り切って進めていきます。
第2週以降
第2週以降も同じペースで学習を進めていければよかったのですが、クラウドファンディングで資金を集めて印刷したゲームが届いて、その発送作業をする必要があったり、月末にはボードゲームジャムの開催があったりと、心が忙しくなかなか学習が進められませんでした。
ちょっとサボりがちになってしまっているので、9月から引き締めて再度学習をしていこうと思います。