ゲームプログラミング/Unity
- ※ ページ作った人が、これから「Unity勉強しよう」と思ってこのページ作ったあとにUntyをいじり始めてみたら、、なんだかコンパイルに凄い時間(30分以上)掛かってしまいました。なので、現状ではこのページの著作を放棄しています。パソコンのスペック(メモリ2GB)が足りないのかハードとの相性が悪いのか(2012年くらいに購入したPC)、他の原因なのか、原因は分かりません。
だから読者でもしUnityに詳しい人がいたら、どうぞ躊躇なく、上書きしてしまってください。そっちのほうが助かります。
セットアップの手順[編集]
- ※ wikiの都合上、画像が不足してますので(仮に画像投稿しても、バージョンアップで使えなくなることや、画像の著作権の問題が複雑なので)、外部の解説サイトの画像なども併用してください。
Unity は、Windows か mac OS で使わないと、挙動が不安定です。 たとえば実際に LInux の Fedora 33 でインストールしようとすると、 Unity Hub まではインストールできるのですが、Unity をインストールしようとする段階で、容量が余ってるのに容量不足などのエラーメッセージが出て、インストールに失敗します。(2021年1月24日 に Fedora33 でインストール失敗を確認。なお、UnityHub ダウンロード直後の UnityHub.AppImage の実行は、実行アインコンを右クリックし「アクセス権」のタブで、チェックボックス「プログラムとして実行可能」にチェックをいれれば、あとはアイコンのダブルクリックでUnityHubを起動できます。)
なので、本ページでは主に、Windows版のセットアップに関して述べます。
Windows版のUnityの使用には、まず、事前に .NET Framework の最新版と、ひとつ古いバージョンをインストールしておく必要がありそうである。
Windows版の Unity は、 .NET Framework の機能を間借りしているようである。(Unityインストール時に、勝手に .NET Framework の Windows Update が出たりするので。)
たとえば2020年4月現在の時点では、.NET Frameworkの最新版は ver 4.x 台だが、
Unityは ver 3.0 台を部分的に用いているようである。
インストール時に公式サイトでのアカウント作成が必要だが、
グーグルアカウントでもアカウント作成できるので、
グーグルアカウントでUnityアカウント作成するのがラクチンである。
unity のインストールや起動には、けっこう時間が掛かる。
ときどき、デスクトップを見に行こう。Unityのロゴ画面ウィンドウが表示中なら、
まだバックで作業中である。
入門プログラム Hello World[編集]
インストールに成功して、プロジェクト画面が出るようになったら、
その中にあるProjectパネルにある項目「Assets」にマウスカーソルを合わせて右クリック。 (最新安定版ではAssetsにあわせないと、メニューが表示されない。2020年4月16日に確認。)
表れるメニュー欄から「Create」→「C# Script」をマウスで選択。
まず「Create」にマウスをあわせてクリックすると、続いて表れるサブメニュー欄に「C# Script」あるので、 マウスで選択すればいい。
すると、Assetsフォルダ内にC#コードのテンプレートが作成される。
まだ、何の命令もしてないので、これに命令文を追記する。
Assetsをクリックした直後なら、
プロジェクトパネルの隣に、アセット内部の構成パネルがあるので、その選択フォルダ内のアイコン一覧に、 C#のアイコン画像でスクリプト新規ファイルが追加されているので、そのC#アイコンのあるファイルをクリック。
すると、Visual Studio などのエディターが立ち上がり、そのスクリプトを編集して
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class NewBehaviourScript : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class HelloTest : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
Debug.Log("Hello World");
}
// Update is called once per frame
void Update()
{
}
}
のように更新して保存する。
class名はファイル名と同じ(ただし拡張子は抜き)でなければならない。
なので
public class NewBehaviourScript : MonoBehaviour
の 「NewBehaviourScript」 の部分をファイル名に変更する。
たとえばファイル名が「HelloTest.cs」なら、クラス名を「HelloTest」に変更しなければならない。そうしないとUnityがコードを認識せず、再生ボタンを押しても全く「Hello World」が表示されない。
その後、Hierarchy パネルのほうで、目的として GameObject を作成するために、
Hierarchy パネル内で右クリックして
「Create」→「Create Empty」を選択。(Createを右クリックすると出てくるCreate Empty項目をクリック。)
そして、先ほど作成したC#ファイル(HelloTest.cs のような名前のファイル)のアイコンをマウスドラッグでGameObjectまでドラッグすると、
自動でインポートしてくれ、画面にウィンドウメッセージで Importing とか出てくるので待機。
このインポート作業をunity用語で「アタッチ」という。
さて、デバッグログはコンソール欄でしか見られない。
Unityのコンソールパネルの場所については、
Project パネルのタブの真横の、コンソールのタブがあるので、
そのコンソールのタブをクリックして、コンソール欄を開けばいい。
画面上部の右側に再生ボタン があるので、ソレをクリックすると、
プログラムを実行する。
すると、コンソール画面に「Hello World」と出ているハズだろう。
ゲーム画面に文字を表示したい場合[編集]
プレイヤーは作者のコンソール画面なんて見れないので、プレイヤーにも見えるように文字を表示するには、コンソール画面でない方法を使う。
とはいえ、作業は簡単である。
Hierarcy パネル内で右クリックし、「UI」→「Text」を選択。
これだけで画面に文字を表示できるようになっている。初期設定では「New Text」の文字を表示する。
再生ボタンを押せば、画面のどこかに表示されている(パソコン事情や個人設定などにより、表示位置が微妙に違う)。
(画面が暗くて見づらいかもしれないが、たぶん、画面のどこかに「New Text」とあるハズ)
しかし、上記の作業だけでは、まだビルドしてないので、実行ファイル(windowsなら .exeファイル)になっておらず、ゲームとして配布できない状態である。
ビルドの方法[編集]
画面上部のメニュー欄から「File」→「Build Settings」を選択。
ボタン「Add Open Scenes」を押すと、そのUnity内で開いているsceneファイルを勝手に認識するので、
「Add Open Scenes」を押す。
画面下にボタン「Build and Run」があるので押す。
保存先の選択ウィンドウが開くので、とにかく画面下のほうにある決定ボタンを押す。
すると、勝手にビルドが始まる。けっこう時間が掛かるので(5分くらい)、もし一見して反応が無いように見えるなら、
デスクトップ画面を見に行ったりして、ビルド中の表示欄が出てるか確かめよう。
待ち時間のあいだ、読書するなり、パソコンを使わない別の軽作業とか家事や、職場なら書類事務でもして時間を潰そう。
もし全画面モードで起動してしまった場合、
ウィンドウズの場合なら
Ctrl + Ald + Delete
でタスクマネージャが開くので、そのタスクマネージャを使って 自作unityアプリをいったん終了させよう。
ホームフォルダに、Unityのプロジェクト作成時に自動で作ったフォルダ「New Unity Project」がある。
そこに、「Bulid and Run」実行によって、
新たにファイル
- New Unity Project.exe
- UnityCrashHandler32.exe
- UnityPlayer.dll
が加わっているハズだ。
この3つのファイルを丸ごとコピーして、1つのフォルダに入れたものを、ゲームファイルとして配布すればいい。
配布時には、
フォルダ名をゲーム名にしたり、「New Unity Project.exe」に相当する実行ファイルの名前をゲームのファイル名などに変更しよう。
- 全画面でないウィンドウモードでビルドする方法
ただし、上記のまま実行しても、全画面表示になってしまい、とても不便。
なので、ウィンドウ「Build Settings」の右下にあるボタン「Player Settings」をクリックして、
自動で開かれるウィンドウ「Project Settings」にある 項目「Resolution and Presentation」に、 フルスクリーン化をしている「Fullscreen mode」に関するボックスがあるので、
このボックス内容を「Windowed」に変更する。
特に決定ボタンなどは無いので、設定が終わったら、右上の「x」ボタンでウィンドウ「Project Settings」を閉じる。
キーボード入力[編集]
まず、
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class HelloTest : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
Debug.Log("Hello World");
}
// Update is called once per frame
void Update()
{
}
}
の void Update() 関数のほうのブロック内に、起動後の処理を書くので、キーボード入力の処理もこちら void Update() 関数のブロック内のほうに書く。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class HelloTest : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
Debug.Log("Hello World");
}
// Update is called once per frame
void Update()
{
if (Input.GetKey(KeyCode.RightArrow))
{
Debug.Log("migi");
}
}
}
のように書けばいい。
再生ボタンを押してテストしてみると、たしかにキーボードの右ボタンを押すたびに、コンソール欄にデバッグ文「migi」が表示される。(時刻が秒単位で併記されるので、押すたびに更新表示されてるのが分かる。)
なお、キーコードについてはUnity公式マニュアル『KeyCode』 を参照せよ。
画像などを移動させたい場合[編集]
コンソールに何を表示したところでゲームにならないので(そもそもアプリにならない)、ゲームにするためには最低限、キーボードからの入力に応じてプレイ画面にある画像を移動させるなどの反応のためのプログラムを作る必要がある。
そうするためには、例えば、単に下記のように、文字列「New Text」の画面表示プログラムを作ったときのコードを加工して、
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class HelloTest : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
Debug.Log("Hello World");
}
// Update is called once per frame
void Update()
{
if (Input.GetKey(KeyCode.RightArrow))
{
//Debug.Log("migi");
gameObject.transform.Translate(0.5f, 0, 0);
}
if (Input.GetKey(KeyCode.LeftArrow))
{
//Debug.Log("hidari");
gameObject.transform.Translate(-0.5f, 0, 0);
}
}
}
- (このプログラムの内容は、キーボードの右矢印(→)を押すと画像「New Text」が右に移動して、左矢印(左)を押すと画像「New Text」が左に移動する。)
のように書けばいい。
「○○.transform.Translate(0.5f, 0, 0);」の○○のところはオブジェクト名で、もし初期設定のままならば「gameObject」という名称になっているだろう。
Unity の void Update() 関数は、自動的にコンマ数秒ごとに呼び出されるので、画像更新などをしたい場合には、ここに処理を書いておけば、あとは自動でUnityが処理してくれる。いちいち画像更新の処理命令を追加する必要は無い。
余談だが、「○○.transform.Translate(0.5f, 0, 0);」の、
2項目のtransformは、テキストオブジェクトなどにあるtransform プロパティを意味し、
3項目のtranslateはそれに対する増分命令である。プラスなら増加、マイナスなら減少である。