チュートリアル作成日
2020年10月2日
チュートリアルをやる前に必要なこと
Unityのインストール
Visual Studioのインストール
C#の入門編を、インターネットか書籍で学んでいること(詳しく知っている必要はありません)
少しくらいUnityをいじってみること
ゲームのルール
0から99までの数字を当てるゲーム。数字を答えると、正解がそれより大きいか小さいかヒントが与えられる。
制作環境
Unity 2019.4.6f1
C#(Visual Studio Community 2019)
完成予想画像
遊び方
これはPC用のゲームである。
真ん中の「Input Number...」と書かれているスペースにカーソルを合わせてクリックし、数字をキーボードで書き込み、「答える」ボタンをクリック。すると正解の数字がそれより大きいか小さいかヒントが与えられるので、また数字を入力し、正解するまで答える。
2D。
名前、保存場所は自由。
2~3分で、プロジェクトが作成される。
Gameビューで、画面サイズをStandalone(1024x768)に設定する。
(Gameビューが出てなければ、ツールバーのWindowというところを見てください)
HierarchyウィンドウでCanvasを作る。
このゲームのゲームオブジェクトはすべてUIの中にある。
上図の赤線を引いたオブジェクトを使う。
Canvasを作成したら、Canvasにカーソルを合わせて右クリック。
そして、Text、Button2つ、Input Fieldを作成。
それぞれ名前を、
Text --- messageText
Button --- そのまま
Button --- newGameButton
Input Field --- そのまま
と変更する。
まず、Input Fieldを調整する。
HierarchyウィンドウのInput Fieldを見ると、左に▼マークがついている。これを押すと、上図のようにPlaceholderとTextという子オブジェクトがついていることがわかる。
Input Fieldを選択した状態で、右のInspectorビューで、位置とサイズを調整する。
PosX:0、PosY:0、PosZ:0、
Width:200、Height:100
とする。
これで数字を入力する箱の大きさが決まった。
Inspectorビューを下に見ていくと、Input Fieldコンポーネントがある。その中の、Content TypeでInteger Numberを選択する。
これで、箱の中に整数しか入力できないようになる。
次に、Placeholderを選択してInspectorビューを見ると、Textというコンポーネントがある。
そこで、Font Sizeを30くらいにする。うすい灰色で書かれている「Enter text...」の文字サイズが変わることがわかる。
次に、Input Filedの子オブジェクトであるTextオブジェクトを選択して、Inspectorビューを見る。
やはりTextコンポーネントがついているので、Font Sizeを50くらいにしておく。これはプレイヤーが数字を入力したときの、その数字のフォントサイズである。
messageText、Button、newGameButtonについては省略するが、位置と文字サイズを好きなように設定する。
下の完成予想図を参考にしてください。色や位置はあなたの好みです。
ここまでやるのも大変だったかもしれない。ゲームの完成予想図と照らし合わせながら、なんとか頑張ってほしい。
細かい位置の調整や色などはどうでもいい。必要なゲームオブジェクトを画面におくことが大切だ。
今までは画面を見ながら、マウス操作で、ゲーム画面を作ってきた。
Unityがすごいのはまさにそこで、今までの作業を、昔ならすべてプログラミングでやらねばならなかった。
たとえばButtonというゲームオブジェクトを作成したが、ボタンの見た目は出来上がっているし、中に文字を入れるスペースも出来上がっているし、実はすでに「クリックされたら何かする」という機能がついている。つまり、「クリックされたら・・・」という部分は出来上がっている。プレイヤーからの入力(操作)を受け付ける態勢が整っている。これも昔ならプログラミングが必要だったところである。しかし、Unityはそれを自動で作成してくれている。言い方を変えれば、Unityを作った人が、「クリックされたら・・・」というプログラミングを我々に代わって書いてくれている、ということである。
さて、Unityが準備してくれたプログラムに乗っかって、今度は我々が作ろうとしている数当てゲームに必要なプログラムを書き足していこう。
(これが、C#の本を読むと出てくる継承とかインターフェイスとかいうものと考えてよい。ざっくり言えば、Buttonクラスというものがすでに作られていて、それを継承して、我々独自の命令をButtonに与えるのである)
Projectビューの+マークをクリック。すると、リストが表示されるので、上から2番目あたりの「C# Script」を選択。
名前をGameControllerとする。ここで異なる名前でC#Scriptを作成してしまった場合、一度削除して、もう一度作り直す。
作成したGameControllerスクリプトを、HierarchyウインドウのMainCameraにドラッグアンドドロップする。
Main Cameraを選択して、Inspectorビューを見てみると、GameControllerスクリプトコンポーネントがついていることがわかる。(ついてない場合は、もう一度ドラッグアンドドロップ)
GameController(Script)と書いてある右側にタテに3つ・が並んだマークがある(あるいは歯車マーク)。それをクリックして、Edit Scriptを選択すると、Visual Studioが開く。(ほかにもVisual Studioを開く方法はある)
Visual Studioに以下のように記述する。
public class GameController : MonoBehaviour
{
/**正解の数字をランダムで設定する。
* フィールド変数としてint型のcorrectNumberを宣言。
*/
private int correctNumber = 0;
private void Start()
{
int r = Random.Range(0, 100);
correctNumber = r;
}
以下、省略。
----------------------------
/**
* ボタンを押したときの関数。プレイヤーが答えを確定する。
* フィールド変数としてpublicでふたつ宣言。
*/
public InputField input;
public Text message;
public void PressButton()
{
//InputFieldに入力された文字列(数字だけど)を、int型に変換して、
//int型のplayerAnswerに割り当てる。
int playerAnswer = int.Parse(input.text);
//正解とプレイヤーの答えを比べて、messageにメッセージを表示。
if (playerAnswer == correctNumber)
{
message.text = "正解!";
}
else if (playerAnswer > correctNumber)
{
message.text = "もっと小さいです";
}
else if (playerAnswer < correctNumber)
{
message.text = "もっと大きいです";
}
}
以下省略
--------------------------------
public Text message;
と書いたときに、エラーが出るかもしれない。そのときは、一番上に、これを記述する。
using UnityEngine.UI;
↑これを記述。
public class GameController : MonoBehaviour
-------------------------------------
TextなどUIを使うときは、UnityEngine.UIを使うよ、と宣言する必要がある。
ここで簡単な解説。
TextやInput Field、message.textといった書き方はUnityのものだが、intや、if else if、文末に;(セミコロン)などはC#の入門編で習うようなことばかりなことに気が付くだろうか。落ち着いて、自分の書いたコードを見直してみてください。
C#入門ではmain関数を書くことを習うが(public static void main())、Unityでは書かない。私は知らないが、どこかで記述されているはずである。しかし、普通にゲームを作る限りにおいては気にしないでよい。
UnityでC# Scriptを作成したときにGameControllerというファイル名にしたが、それがclass名になっていることに注目。
そのため、ファイル名とクラス名を一致させる必要がある。不一致だとエラーになる。
public class GameController : MonoBehaviourとなっている。
少し難しいが、自動的にMonoBehaviourというクラスを継承して、このファイルは作られている。それによって、Unity独特の文法を使えるようになる。
/**
* ニューゲームボタンを押したときの処理。
*/
public void PressNewGameButton()
{
SceneManager.LoadScene(0);
}
以下省略
------------------------------
publicにすることを忘れずに。
エラーが出る場合は、usingにこれを追記する。
using UnityEngine.SceneManagement;
スクリプトは以上である。大変だったかもしれない。お疲れさまでした。
ふたたびUnityに戻ります。
いま書いたスクリプトのうち、ボタンに関するものは、ボタンオブジェクトに関連付ける必要がある。
どのボタンを押したときに、その関数を実行したらよいのか、Unityに教えてやるのである。
HierarchyウィンドウでButtonを選択。InspectorビューでOn Click ()を探す。
その中の+マークをクリック。
下図を参考に、GameControllerスクリプトのついてるMain Cameraをドラッグアンドドロップ。
その中のPressButton関数を選択。
NewGameButtonも同様に、PressNewGameButton関数を選択。
次に、スクリプトで宣言していたpublicな変数をオブジェクトと紐づける。
public InputField input;
public Text message;
この2つが、UnityのゲームオブジェクトのInput Fieldと、messageTextであることを教えてやるのである。
HierarchyウィンドウでMain Cameraを選択し、InspectorビューにGameController(Script)があることを確認。
そこにInputとMessageという欄ができている。これが、スクリプトで書いたpublic変数の変数名である。
その白い空欄に、ゲームオブジェクトをドラッグアンドドロップする。
下図を参考に、2つともセットする。
さてテストプレイ。
テストプレイは、Unityの中央上にある横向き▼マークを押すとできる。
Gameビューの"Game"タブにカーソルをあわせて右クリックし、出てきたリストからMaximizeを選択すると、大きな画面でテストプレイできる。
うまく動くかやってみよう。
たぶん、完成しているはずである。
おめでとう!
お疲れさまでした!