2421 文字
12 分

【ゲーム開発のためのC#入門講座・応用強化編】ライブラリについて知っておこう【#1】

ようこそ、応用強化編へ!#

この応用強化編では、実際にUnityでゲーム開発を行うにあたって知っておきたい知識やテクニックを学習します。

技術的には応用拡張編で十分なのですが、例えば外部にデータを保存する方法はセーブ&ロード機能を作るなら不可欠ですよね。他にも、プログラムの動作チェックに重要なデバッグの方法など、応用拡張編までで習得した技術をさらに補強していきます。

とはいえ、もういい加減ゲーム作りたくてうずうずしている、はやくUnityに触りたいという人もきっといるはず。

応用強化編はコンパクトにまとめていきたいと思うので、よろしくお願いします。

という訳で、初回はライブラリです。

ライブラリって?#

ライブラリとは、他で利用する前提で作成したクラスをまとめたものを指します。

本来はこのライブラリを読み込まないと、他の人が作ったプログラムというものは一切使えません。

ただ、VisualStudioで作成したプロジェクトはデフォルトでいくつかのライブラリを参照するようになっています。だから名前空間Systemに所属するConsoleクラスやRandomクラス、それから複数データをまとめるコレクションListなどが当たり前のように使えるようになっているんですね。

一方で、他に使いたいライブラリがある場合は自分達で導入する必要があります。

導入方法は3パターン。

  1. 参照設定をするだけでOKなパターン
  2. 管理ツールなどを使ってダウンロードする必要があるパターン
  3. 対象プロジェクトやフォルダパスを指定するパターン

ひとつずつ見ていきましょう。

導入パターン①参照設定をするだけでOKなパターン#

一部のライブラリはいつでも参照設定(そのライブラリを使いたいかどうかの設定)を行うだけで利用できます。

メニュー「プロジェクト」の「プロジェクト参照の追加」を選択してみましょう。

プロジェクト参照の追加

COMという欄を見ると、色んなものがずらっと並んでいます。これは主に外部ツールを動かすためのライブラリです。

例えば下記のMicrosoft Excel 16.0 Object Libraryを追加すると、Excelファイルを生成したり操作したりすることができます。

参照マネージャー画面

よくExcelの自動操縦なんてことがVBA(Excel備え付けのプログラミング言語)やPythonで行われていますが、これを使えばC#でも可能なんですね。ゲーム開発とは関係ないですが、興味あればやってみるのも面白いと思います。

// 下記名前空間を宣言すれば、
using Microsoft.Office.Interop.Excel;

// ↓こんな風にプログラムでExcelを操作できるよ!
Application excelApp = new Application();
Workbook workbook = excelApp.Workbooks.Open("FilePath");
Worksheet worksheet = workbook.Worksheets[0];
worksheet.Cells[1, 1].Value = "hoge";
workbook.Save();

excelApp.Quit();

導入パターン②ダウンロードする必要があるパターン#

Unityではこちらのパターンで活用する機会が多いと思います。

例えば、非同期処理(Aの処理をしている間に、Bの処理をするなど、同時並行で処理を行う方法のこと)というちょっと難しいことをやるために、C#ではTaskというクラスが用意されています。ただ、これはUnityで使うには無駄が多く、処理が重くなってしまうというネックがあるんですね。

そこで、C#オリジナルのTaskよりもUnityに特化した軽量版TaskであるUniTaskというライブラリが公開されています。

このUniTaskを利用したい場合、NuGetという専用の管理ツールを使ってダウンロードします。

メニュー「ツール」の「NuGet パケット マネージャー」から「ソリューションのNuGetパッケージ管理」を選択してみましょう。

NuGetパッケージマネージャー

画面左上の参照を選択の上、検索欄にUniTaskと入れてみましょう。

すると下記のようにUniTaskが出てくるので、画面右側でチェックを入れると、インストールボタンを押せるようになります。

UniTaskインストール画面

もしUnityで将来的に非同期処理をやりたくなったら、このUniTaskを使ってみるとよいでしょう。

非同期処理については、絶対にゲーム開発に必要という訳ではなく、非常にプログラムが複雑化するため、現時点では解説しません。いずれ専門技術編というパートでご紹介したいと考えています。ご興味ある方はもう少々お待ちください。

導入パターン③対象プロジェクトやフォルダパスを指定するパターン#

自分自身でライブラリを作ることももちろんできます。

プロジェクトの種類でクラスライブラリというものを選択すると、画面やコンソールなど一切存在しない、純粋に機能をまとめるだけのプロジェクトファイルを作成することができます。

クラスライブラリのプロジェクト作成画面

試しにプロジェクトを作成し、メニューからソリューションのビルドを行ってみてください。その上で、環境構築編のラストでやったように、作成されたファイルを確認してみましょう。

生成されたライブラリ

ここで作成されている拡張子「dll」のファイルが、作成したライブラリをまとめたファイルとなります。

もし他のプロジェクトでこのライブラリを活用したい場合は、先程の参照の追加メニューからこのファイルパスを指定し、ライブラリを取り込んで使えるようにする、という流れになります。

Windowsの中には無数の拡張子dllのファイルがありますが、それはWindowsで提供される様々なアプリケーションを動かすためのライブラリだったんですね。

なお、実は別々のプロジェクトファイルとして作成せずとも、ひとつのソリューションの中に種類の異なるプロジェクトを持つこともできます。

複数プロジェクトを持つソリューション

ソリューションとプロジェクトって何が違うんだろうと疑問に思われていた方がいるかもしれませんが、プロジェクトがライブラリやアプリケーションの管理単位で、さらにそれを統合してひとつのシステムを構築するのがソリューションの役割なんですね。

同じソリューション内にある別のプロジェクトに所属するプログラムを参照する場合、プロジェクトという欄からライブラリ参照ができるので、他の手順よりも簡単です。

複数プロジェクトを持つソリューション

ただ、大規模なゲーム開発にならない限りは、あまり複数のプロジェクトファイルを必要とすることもないかなと思います。

じゃあなぜこの話を出したかというと、この「複数のプロジェクトファイル」や「異なるプロジェクトで作成されたライブラリ」を利用することで、初めて意味を持つアクセス修飾子が存在するからです。

アクセス修飾子「internal」#

「internal」は同プロジェクト内に限定し、どこからでもアクセス可能とするアクセス修飾子です。

初めてクラスを作った時に出てきてましたね。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Csharp4_6
{
    // ↓初期設定は「internal」だったね!
    internal class Random
    {
    }
}

対象のプロジェクト内でしか使わない、使わせたくないものに適用すると便利なアクセス修飾子です。

が、先程もお伝えした通り規模のでかい開発にならないと複数のプロジェクトファイル等を利用する機会ってほぼないんですよね。そうすると実質publicと何も変わりありません。

なので最後まで後回しにして、このタイミングで紹介させていただくこととしました。

改めて、4種類のアクセス修飾子を確認してみましょう。

アクセス修飾子アクセス可能範囲
publicどこからでも可
internal同プロジェクト内のみ可
protected自クラスまたは子クラスのみ可
private自クラスのみ可

このアクセス修飾子を組み合わせたもう二種類のアクセスレベルがあるのですが、あまり使う機会はないので、この4つさえ覚えといてもらえればバッチリです。

Unityでの活躍ポイント#

Unityでの活躍ポイントは先程紹介したUniTaskなどを使いたい時です。

また、恐らく最後のおまじないであるinternalの意味を紹介したかったので、今回の記事を設けました。

この「ライブラリ」については実際にゲーム開発を進めていかないとぴんとこない部分が大きいと思います。なので、今はあくまで知識として頭の片隅にでも置いておいていただければありがたいです。

まとめ#

  • ライブラリとは、他で利用する前提で作成したクラスをまとめたもの
  • 拡張子dllは作成したライブラリをまとめたファイルを意味する
  • Unityでも使える便利なライブラリもあるので、必要に応じて使ってみよう

次回はプログラム調査の要「デバッグ」の方法について学習します。お楽しみに!

それでは、今回もお疲れ様でした!

また次の記事でお会いしましょう!