ゲームプログラミング/Unity
概要
[編集]Unityは、Unity Technologiesが配布を行っているゲームエンジンのことである。 WindowsやMac,Linuxなどで利用可能であり、ゲーム開発やXRコンテンツ、建築やシミュレーション等に活用が行える。 詳細はWikipediaでの解説を参照のこと。
本著では、Unityの導入から基本操作、Unity特有のクラスや関数を利用した基礎的なプログラミングについて解説し、ページ自体は5-10分で読了することを想定して執筆を行う。 使用OSはWindows11を想定している。ショートカットコマンド等は適宣読み替えてほしい。
また、ゲームエンジンは更新頻度が著しく、本著で記載されている機能や手法が利用できないケースも考えられる。不明点はUnity公式のリファレンスやマニュアルを参照すると良いだろう。
導入
[編集]Unityには「Unity Hub」「Unity Editor」の2種類が存在する。
具体的には、以下のフローで起動を行う。
- Unity Hubを起動
- プロジェクトを選択する
- Unity Editorが起動。プロジェクトが読み込まれ、表示される
プロジェクトを開くためには、ライセンスが付与されたUnityアカウントが必要となる。2024年時点では、Unityを使用して得られた収入が10万ドル(約15,000,000円)未満である場合、無料のPersonalライセンスが利用できるため、今回はこの無料ライセンスを利用する。
ここでは、Unityプロジェクトを管理・起動するために必要な「Unity Hub」の導入、Unityアカウントの取得、Unityライセンスの取得を行う。
ダウンロードとインストール
[編集]1-1 Unityアカウントを作成
[編集]Unity Hubを利用するために必要。
https://id.unity.com/account/new
アカウントはメールアドレス、Google,Facebook等アカウント連携のいずれかで作成できる。
Googleアカウント等を既に所持している場合、下側のアイコンからアカウント連携を行って作成することをお勧めする。これにより、以後ログイン時の手間を省くことができる。
1-2 Unity Hubのインストール
[編集]以下よりUnity Hubを導入する。
もしくは、コマンドラインを利用してインストールを行うこともできる(要Windowsパッケージマネージャー)。
winget install Unity.UnityHub
インストール先は任意のものを指定する。
インストール後、Unityアカウントのサインインを求められるため、1-1で作成したアカウント情報でサインインする。 サインイン後、いくつかウインドウが表示されるが、ひとまず全てSkip, NoThanks等を選択して閉じる。
さて、プロジェクトを開くためにライセンスを取得しよう。Personalライセンスは以下の手順で取得できる。
- Unity Hubのウインドウ左側のメニューから、歯車アイコンをクリック
- 「Licenses」を選択
- 青色の「Add」を選択
- 「Get a free personal license」を選択
- 規約を確認のうえ、青色の「Agree and get personal edition license」をクリック
- 右上の×ボタンから設定ウインドウを閉じる
これでUnity Hubの導入は完了した。
1-3 Unity Editorのインストール
[編集]最後に、Unityプロジェクトを開くために必要なエディタを取得しよう。 Unity Editorは複数バージョンが存在し、バージョンによって操作方法や見た目、挙動が変化する。 迷った場合、インストール画面で「Recommended version」と表記されたものを選ぶと良いだろう。
- Unity Hubのウインドウ左側のメニューから「Installs」をクリック
- 右上の青色の「Install Editor」をクリック
- バージョンを選択し「Install」をクリック(本稿では2022.3.x 系列を想定)
- モジュール選択画面。開発内容に応じてチェックマークを選択する。(本稿では「Windows Build Support(IL2CPP)」のみを選択)
- インストール開始。進捗状況は右下の「Downloads」で確認できる。完了後、「Installs」タブ内にバージョンが追加される。
これでUnityを使う準備は整った。
プロジェクトの作成
[編集]Unity Editorを使用するためには、データを利用・管理するためのプロジェクトフォルダが必須となる。プロジェクトは以下の手順で作成できる。
- Unity Hubのウインドウ左側のメニューから「Projects」タブを選択
- 右上の青色の「New Project」を選択
- テンプレートを選択(今回は3D(Built-in)を選択)
- 右側に入力欄が表示される。自分自身が分かりやすいproject name(プロジェクト名)を名付ける。(今回は Tutorial と入力)
- Location(保存場所)をクリックし、プロジェクトの保存場所を選択する。(SSDドライブ上のフォルダを推奨)
- Unity Cloudの設定があるが、どちらもチェックを外す。
- 設定項目を確認し、右下の青色の「Create project」ボタンをクリック
これでプロジェクト生成が始まる。生成時間はパソコンの性能に大きく依存するが、概ね数分程度である。生成が完了すると、UnityEditorが自動で立ち上がる。
プロジェクトはこれで生成完了だ。以後、作成したプロジェクトはUnity Hubの「Projects」タブ上に一覧表示されるため、名前をクリックすることで開くことが出来るようになる。
操作説明
[編集]Unity Editor(以下、エディタ)を立ち上げると、灰色(もしくは白色)の、4分割された画面が表示されるだろう。これがエディタの画面だ。ここでは、各ウインドウとメニューについて簡易的な解説を行う。
Hierarchy - ヒエラルキー
[編集]初期レイアウトでは左上に配置。
Scene内に配置されているGameObject郡とその親子関係を参照できる。(もし表示されない場合、「SampleScene」の左側にある ▶ をクリックすると展開される) オブジェクト名をクリックすると、Inspectorに詳細が表示される。
Scene - シーン
[編集]初期レイアウトでは上に配置。
GameObjectの位置や大きさを確認できる。 右クリックしたまま動かすと、カメラを回転できる。 ホイールをクリックしたまま動かすと、カメラを上下左右に並行移動でき、ホイールを回すと、中心に拡大縮小できる。
また、配置されているオブジェクトをクリックすることで、モードに応じた矢印などのUIが表示される。
キーバインド キー 操作 Q ハンドモード(シーンカメラを上下左右に平行移動する) W 移動モード(オブジェクトの位置を調整する) E 回転モード(オブジェクトの回転を調整する) R 拡大モード(オブジェクトの大きさを調整する) T Rect Tool(UIなどのサイズを調整する) Y Transformモード(オブジェクトの位置・回転・大きさを調整する) 右クリック+WASD シーンカメラを現在位置から上下左右に動かす
Inspector - インスペクタ
[編集]初期レイアウトでは右に配置。
選択中のGameObjectの詳細や、追加されているComponentの状態を参照・変更できる。
Project - プロジェクト
[編集]初期レイアウトでは下に配置。
プロジェクトフォルダ内に存在するファイルが表示される。 Windowsのエクスプローラーからここにファイルをドラッグ&ドロップすることで、現在のフォルダ位置にファイルを複製できる。 データを作成する場合はAssets内に配置すること。PackagesはPackage Manager等で管理されるため、意図せずデータが失われる可能性がある。
Console - コンソール
[編集]初期レイアウトでは下の2タブ目に配置。
スクリプトやエディタのエラー、その他デバッグ中のログはここに出力される。 ほとんどのエラーは長文で混乱するが、最初の1,2行目だけ注目することでほとんどの原因は判明する。
他にも様々なウインドウが存在する。
プロジェクトの保存
[編集]Unityでは配置されているオブジェクトの内容や位置などを「Sceneファイル(.scene)」で管理している。
現在開いているシーンの保存は、他ソフトと同様Ctrl+Sで行う。 もし別のSceneファイルとして保存したい場合はCtrl+Shift+Sを入力し、シーン名と保存場所を指定し、保存する。混乱を避けるため、「Scenes」といったフォルダ下に保存することを推奨する。
シーンファイルを保存せずに終了すると、オブジェクトの変更点や、その中のComponentの状態変更が反映されず、元に戻ってしまうので注意すること。
GameObjectを動かす
[編集]ここでは、床と坂道を配置し、ボールを転がす単純なギミックを作成する。
Step.1 オブジェクトを配置
[編集]Unityではデフォルトで立方体、球体、平面などのメッシュを配置することができる。床を配置してみよう。
- Hierarchyタブにカーソルを合わせ、右クリック
- 3D Object -> Plane
- 床が生成される。Sceneウインドウ内の矢印もしくはInspectorのTransformのPositionで位置を調整する(今回はX:0, Y:0, Z:0 に配置)
白い床が中心に配置されたはずだ。Inspectorにいくつか項目が追加されているが、これらは「Component(コンポーネント)」と呼ばれる、いわば部品のようなものだ。それぞれ解説する。
PlaneのデフォルトのComponent コンポーネント名 説明 Transform 位置(Position)回転(Rotation)大きさ(Scale)を設定する。
ほとんどのGameObjectに最初から備わっており、削除できない。UIの場合は「Rect Transform」となる。Mesh Filter メッシュ(3Dデータの一部)を設定する。
削除すると形が消失し、見えなくなる。Mesh Renderer モデルの見え方を設定する。
Materialsでモデルの色や画像、Lightingで影の当たり方などが設定できる。Mesh Colilder Colider(コライダー)の一種。当たり判定。
オブジェクト同士の衝突判定に使用される。この他にも「Box Collider」「Sphere Collider」等が存在する。
その中でもBox Colliderは負荷が少ないため、よく使われる。
では次に、このPlaneの上に坂を配置する。 三角形はデフォルトでは存在しないため、同じくPlaneで代用する。
- Hierarchyタブにカーソルを合わせ、右クリック
- 3D Object -> Plane
- 床が生成される。Sceneウインドウ内の矢印もしくはInspectorのTransformのPositionで位置と回転を調整する。(Position(X:-7, Y:2, Z:0)、Rotation(X:0, Y:0, Z: -30) に配置)
- 床と坂と区別できるよう、名前をつける。Hierarchyから「Plane(1)」を選択し、F2を押すと名前が入力できるので、名前をつける。(今回は「Saka」とする)
床と坂が配置された。 最後に、坂の上の転がるような位置にボールを配置しよう。
- Hierarchyタブにカーソルを合わせ、右クリック
- 3D Object -> Sphere
- ボールが生成される。Sceneウインドウ内の矢印もしくはInspectorのTransformのPositionで位置を調整する(X:-9, Y:5, Z:0 に配置)
これでオブジェクトは全て配置し終えた。
テストプレイの方法
[編集]Unityではエディタ上で、アプリの動作をすぐに確認できる。 テストプレイはCtrl+Pで開始できる。
Ctrl+P 再生 / 停止 Ctrl+Shift+P 一時停止 Ctrl+Alt+P ステップ再生(1フレームずつ動かす)
さて、プレイしてみよう。どうだろうか。
...動かない。
Step.2 重力を追加
[編集]しかしこれは正常な動作である。重力を加えていないため、動かないのだ。 ボールに重力を加えよう。重力を加えるコンポーネント「Rigidbody」を追加する。
- HierarchyからSphereを選択
- Inspectorの一番下にある「Add Component」をクリック
- 選択画面が表示される。検索欄に「rigid」と入力すると「Rigidbody」が表示されるので、選択する(Rigid body 2Dではない)
これで重力が追加された。Ctrl+Pでもう一度再生してみよう。
どうだろうか? ここまで正しく操作できていれば、
ボールが坂を転がり、床を通り、地面に落ちていく
といったような動作になるはずだ。 これで読者は晴れて、Unityの基本操作をマスターしたことになる。応用すれば、ビー玉転がしのようなものも作れる。色々工夫してみよう。
Unity C#でオブジェクトを動かす
[編集]玉転がしだけではゲームとは呼びづらいだろう。 このセクションでは、ボールをキー操作で動かす、簡単なコードを作成する。
コードエディタのセットアップ
[編集]本セクションはソースコード(C#)を作成する必要がある。 極論「メモ帳」でも開発は行えるが、利便性とエラー検知の観点から、コードエディタを利用することを勧める。 以下にMicrosoft社が提供する軽量コードエディタ「Visual Studio Code(以下、VS Code)」の、Unity向けセットアップ方法を記述する。
VS Codeのインストール
[編集]以下からVS Codeダウンロード・インストールを行う。 https://code.visualstudio.com/
もしくは、コマンドラインを利用してインストールを行うこともできる(要Windowsパッケージマネージャー)。
winget install Microsoft.VisualStudioCode
VS Codeの環境構築
[編集]必要な拡張機能をVS Codeに導入しよう。 VS Codeを起動し、以下の操作を行う。
- 左にアイコンの羅列(以下、左メニュー)があるので、その上から5番目(EXTENSIONS)を選択
- 拡張機能検索画面が表示される。「japan」と検索。
- 「Japanese Language Pack for Visual Studio Code」を選択し、青色の「Install」をクリック
- 右下にエディタ再起動通知が表示される。右下の「Change Language and Restart」をクリック
- エディタが日本語環境に変化する
これと同様の操作で、以下の拡張機能もインストールを行う。
- Unity(Microsoft)
- IntelliCode for C# Dev Kit(Microsoft)
UnityとVS Codeを連携
[編集]Unity Editorの画面に戻り、以下の操作を行う。
- 上部メニュー(リボンバー)から「Edit」を選択
- 「Preferences...」を選択(下から4番目)
- ウインドウが表示される。左から「External Tools」を選択
- 「External Script Editor」を「Visual Studio Code[バージョン名]」に変更
これでスクリプトをVS Codeで編集できるようになった。
スクリプトの作成
[編集]もしシーン内の編集を行っていたら、「GameObjectを動かす」の「Step.2 重力を追加」終了段階の状態に戻してほしい。床ひとつ、坂ひとつ、ボールひとつの状態になっていればOKだ。
シーン内で行った編集はWordとおなじくCtrl+Zで元に戻せる。余分に作成したGameObjectを削除したい場合はHierarchyからオブジェクトを選択し、Deleteキーを押すことで削除できる。
準備ができたらスクリプトを作成しよう。以下の手順で進めてほしい。
- 下側にあるProjectタブの空いてる部分で 右クリック -> Create -> Folder
- フォルダが作成される。名前を「Scripts」とする。(フォルダ名を変更しそびれた場合、再度フォルダアイコンをクリックし、F2キーを押して変更できる)
- フォルダをダブルクリックし、Scriptsフォルダ内に移動
- Projectタブの空いてる部分で 右クリック -> Create -> C# Script
- スクリプトが作成される。名前を「Ball」とする。(スクリプト名を変更しそびれた場合、スクリプトアイコンをクリックし、Deleteキーで削除後、4からやり直す)
スクリプトが正常に作成できたら、アイコンをダブルクリックしてC#ファイルを開こう。正常に作成できたら以下のようになっているはずだ。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Ball : MonoBehaviour { // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { } }
C#全体の記法やチュートリアルは WikiBooks:C# や、他サイトのチュートリアルを参照してほしい。ここではUnity特有のクラスやライブラリについて簡潔に解説を行う。
Unity固有のクラス・関数 クラス・関数名 説明 UnityEngine Unity固有の関数やクラスを利用するために必要。 MonoBehaviour UnityEngineのクラス。
UnityのGameObjectで、Componentとして使うスクリプトであることを表す。void Start() プレイ開始時の最初の1回(1フレーム)だけ実行される。
変数初期化などでよく使われる。void Update() プレイ中常に実行される。
入力の受け取りなど、常に検知させたい動作などで使われる。
デバッグ方法の確認
[編集]プログラムがどのように動作しているか知るには、まずログを出力することから覚えるべきだ。先程のコードのStartクラスに以下のように追記を行う。
//--中略 void Start() { Debug.Log("Hello, Unity!"); } //--中略
Ctrl+Sでコードを保存し、Unityエディタに戻ろう。 さて、コードはGameObjectに紐づけないと動作しない。以下の操作を行おう。
- Hierarchyタブでオブジェクト「Sphere」を選択
- Inspectorの一番下にある「Add Component」をクリック
- 選択画面が表示される。検索欄に「ball」と入力すると「Ball」が表示されるので、選択する
Ballがコンポーネントとして追加されたはずだ。Ctrl+Pで実行してみよう。
ところで、操作説明にあった「Console」タブは覚えているだろうか?エディタの下側の2タブ目に配置されてるが、ConsoleタブはCtrl+Shift+Cでも開けるので確認してほしい。
もしコードが正常に動作していたら、以下のように出力されるはずだ。
[00:00:00] Hello, Unity! UnityEngine.Debug:Log (object)
このデバッグコードは、スクリプトやGameObjectが正常に動作しているかの確認を行うのに頻繁に活用される。覚えておこう。ちなみにDebug.Logのほか、以下のような関数も存在する。上手く使い分けよう。
Debug.Log() ログを情報として出力。 Debug.LogWarning() ログを警告として出力。
Consoleでの出力では黄色のマークが併記される。Debug.LogError() ログをエラーとして出力。
Consoleでの出力では赤色のマークが併記される。
Consoleの設定によっては実行中に一時停止状態になる。
移動処理の追加
[編集]-
それでは、キー入力が行われた際、ボールが移動するコードを挿入しよう。Unityでは、キー入力を以下の関数で受け取る。
// 中略 void Update() { if (Input.GetKey(KeyCode.W)) { { } // 中略
// 中略 void Update() { //rigidbodyを取得 var rb = GetComponent<Rigidbody>(); if (Input.GetKey(KeyCode.W)) { //前 rb.AddForce(Vector3.forward); } else if (Input.GetKey(KeyCode.S)) { //後ろ rb.AddForce(Vector3.back); } else if (Input.GetKey(KeyCode.A)) { //左 rb.AddForce(Vector3.left); } else if (Input.GetKey(KeyCode.D)) { //右 rb.AddForce(Vector3.right); } } // 中略
アプリケーションのビルド
[編集]開発したアプリを実際にexeファイル等プレイできる形に出力するには、ビルドを行う必要がある。
ビルドを行うにはCtrl+Bを入力し、ビルド先のフォルダを 指定する。なお、日本語名のフォルダ下はビルド時エラーを誘発するため、避けること。 ビルド設定はCtrl+Shift+Bを入力することで開く。ほとんどのアプリ設定は右下の「Player Settings...」から編集できるだろう。
ビルドが無事終了すると、自動的にWindowsエクスプローラーが開き、保存したアプリケーションのフォルダが開かれる。 ビルドに失敗した場合、Consoleウインドウにエラーが出力される。エラー内容のほとんどは翻訳ソフトなどを活用したり、インターネット上でエラーメッセージを検索することで、原因が判明することが多い。