Unity #2 Advent Calendar 2017、12月1日の記事です。
Unity #2 Advent Calendar 2017一発目なのでかなりライトな感じでまとめています。
難しいことは他のUnityスゴクデキル方々が書いてくれると信じてます。
今年、日本で初めてUnity認定試験が行われました。
基本ゲームジャムしかUnityを触らない、なんちゃってUnityエンジニアの自分もギリギリで無事合格し、2年間はUnity Certified Developerと名乗れるようになりました。
Unity Certified Developer
Certificate ID: 201708UCD2731
せっかく合格したので、今回はUnity認定試験の範囲の一つ、スクリプトの勉強するべき範囲と個人的に感じている認定試験の合格のメリットについて書いていこうかなと思います。
Unity認定試験 全試験範囲の勉強方法
まずは認定試験の全試験範囲で共通する勉強方法について書きます。
いきなりこんなことを書くのはアレですが、すでに他の方が勉強方法について書かれているので、そちらを見ていただければと思います。ありがたいことに、個人的におススメの勉強方法は全て書かれています。
・Unity認定試験、受けてきました
たなかゆうさん tanaka's Programming Memo
プログラミングについてのメモ。
・Unity開発者認定試験に合格しました
TECH Projin
勉強方法は大雑把にまとめると、以下の感じです。
・試験範囲を元にUnityを触って覚える
・アセットストアにある認定試験コースウェアのサンプルプロジェクトの中身を見て覚える
・Unity認定試験に関する教材を購入して勉強する
・Unity認定トレーニングセンターが開催している認定試験のセミナー受ける(VRプロフェッショナルアカデミーさんのUnity認定試験/合格対策講座など)
試験の教材ですがお金をかけても問題ない方であれば、公式の認定試験コースウェアを購入するのが一番です。
Unity認定試験コースウェアについて
Unity認定試験公認のオンライン教材です。
認定試験コースウェアはUnity Plusサブスクリプションでは1ヶ月視聴可能、Unity Proサブスクリプションでは3ヶ月視聴可能となっています。
日本語版はこちらから申請できます。
※将来的にこの申請は不要となるそうです。
ライセンスキーはサブスクリプションを購入したときに受信したメールに記載されています。
忘れてしまった方は、「Your license key to access your Unity seat」というタイトルで受信されているハズなので、メールを検索してみましょう。
※間違ってライセンスキーのメールを破棄した方はお問い合わせをしたほうがいいかもしれません……
また、Unity認定トレーニングセンターに指定している企業からも購入可能となっています。
・VRプロフェッショナルアカデミー
お値段は18,000円(税別、3ヶ月利用可能)となっています。
スクリプト 勉強範囲まとめ
Qiitaの記事なのでスクリプトに範囲を限定して、ここだけはちゃんと抑えるように、という点を記載します。
このあたりはコースウェア、トレーニングセンターを受ければわかりますが、有料であるため、さすがにその中身を全て書き出すわけにはいかないので、少々濁した感じで書きます。
スクリプト試験範囲
試験範囲からスクリプト(プログラム)部分を引用します。
トピック | サブトピック | 認定の目的 |
---|---|---|
Camera API | ScreenPointToRay | 既存コードの用途を確認する |
GameObject | コンポーネント | コードの特定の行を完成させる |
メソッド/関数 | 宣言と使用 | メソッドの用途を説明する 結果を見てメソッドを識別する |
MonoBehavior API | Awake | 結果を見てメソッドを識別する 希望する結果によってメソッドを選ぶ |
MonoBehavior API | FixedUpdate | 特定のメソッドの有効性を評価する |
オブジェクト指向プログラミング | オブジェクト | 与えられたコードからクラスの定義を確認する |
クォータニオン(四元数) | 利用方法 | クォータニオンについて説明する |
Time | DeltaTime | DeltaTimeについて説明する |
Unityインタフェース | ファイルの管理 | コード内のpublic変数の違いを区別する 新規スクリプトを作成する |
変数 | 浮動小数点 | コード内の変数を確認し置換する |
変数 | 整数 | コード内の変数を確認し置換する |
変数 | Vector3 | 変数を定義する |
スクリプト範囲の試験難易度
問題自体はすごく優しいです。
プログラムを学校、もしくは業務で行っている方であれば、UnityのAPIに関する部分さえ把握すれば何の問題はありません。
APIもUnityのスクリプトを書く人あれば誰でも知っているような内容であり、iOSの証明書設定や最適化等の専門知識は一切問われません。
あくまでUnityでゲームを作る上で誰もが通る初歩中の初歩、必要最低限のAPIや機能の知識を問われているイメージです。
スクリプト範囲の大雑把な勉強内容まとめ
各項目で必要なことを大雑把にまとめます。
Unityの中の人ではないので、ここに書かれていない分野の問題が出てくるかもしれませんのであらかじめご了承ください。
正確に知りたい方はコースウェアを購入していただいたほうが確実です。
確実に言える事は、動画教材に出てくる部分のみ、試験に出題されます。
「重要」と書かれているものは、試験に出てくるかもよ、というものです。
※「自分が試験を受けたときに問題として出た記憶がある」だけなので、今後の試験では出てこないかもしれません。
1.アクセス修飾子
簡単に説明すると以下の通り。
・private
他のスクリプトから参照できない(重要)
・public
他のスクリプトから参照できる(重要)
・protected
自クラスと継承したスクリプトは参照できる。継承していないスクリプトからは参照できない。
・internal
プロジェクト内部のみ参照できる。知らない人は「そんなのあるんだー」程度の認識で問題ありません。
最低限、privateとpubllicの違いを把握しましょう。
2.変数
試験に出る変数の型を覚えましょう。
最低限覚えたほうがいいのは以下の通りです。
・integer(int)
整数型。小数点は扱えない(重要)
C#なら「int a = 1;」のように定義
・float
浮動小数点型。小数点が扱える。(重要)
C#なら「float a = 1.0f;」のように定義。(重要)
数字の後ろに「f」と書かれていたらfloat型である、と覚えればok。
・Boolean(bool)
「true」か「false」、この二つしか入らない。
C#なら「bool a = true」「bool b = false」のように定義
試験上では、boolと定義している変数で上記以外の書き方がある場合は間違いであるという認識で問題ない。
・string
文字列の型。(重要)
文字型と書かれていたら「char」である。
char型に関しては「そんなのあるんだー」という認識で問題ない。
C#なら「string a = "Hello world!"」のように定義。
「string a = "Hello" + "World!"」と書くこともでき、変数aの中身は「HelloWorld!」になる。
・Vector3
簡単に説明するなら、3つのfloatを1セットとして定義している型。
「1.0f, 1.0f, 1.0f」が一セットという感じ。
Vector3が使用されている例として、ゲームオブジェクトの位置情報(X, Y, Z)など。
スクリプト初心者の方でわかりにくければ、位置情報にVector3という型が使われている、という認識でOK
C#なら「Vector3 a = new Vector3(2f, 3f, 1f)」のように定義。
Vector3の初期化(試験の場合、3つのfloatに0fをセットする)方法を必ず覚えること!
Vector3 a = new Vector3(0f, 0f, 0f);
Vector3 a = Vector3.zero;
Vector3 a = default(Vector3);
試験範囲のバージョンが現行バージョンより古いため、スクリプトの書き方が少し違う場合もあります。
しかし、Vector3型は一つしか引数を設定すると必ずエラーが起きる、つまり**「Vector3 a = Vector3(0);」のような書き方はできない**という点を覚えてもらえれば大丈夫です。
・Transform
オブジェクトの位置、回転、スケールの情報をまとめた型。
GameObjectなら「transform」という名前の変数を必ず持っている。
※TranceformのVariables
以下のTranceformの変数は必ず覚えておくこと
変数名 | 型 | 簡単な説明 |
---|---|---|
transform.potison | Vector3 | ワールド空間における位置情報 |
transform.rotation | Quaternion | ワールド空間における回転情報 |
transform.localScale | Vector3 | スケール情報 |
・配列(Array)
変数の配列です。配列を超簡単に説明すると
[0, 1, 2, 3……]
のように、複数の値を持てるということです。
C#なら
// intの配列 例:[0, 1, 2]
int[] a;
// stringの配列 例:["hello", "world"]
string[] b;
// floatの配列 例:[0f, 1f, 2f]
float[] c;
のように定義します。
4.変数の計算
変数を利用した簡単な計算問題があるのでざっと書いていきます。
・代入
まず、変数の代入について。変数同士の計算の前に、変数の代入を覚えます。
プログラムをやっていない人だとややこしいのですが、変数に値を代入する場合は「=」を書きます。
int a = 1;
簡単な例ですが、このように書きます。上記の例では変数aに1が入っています。
変数同士が同じ値か比較する場合は別の書き方をしますが、これは後述に記載します。
・数値
(1)足し算
int a = 1;
int b = 1;
int c = 0;
c = a + b;
上記の例だと、変数cには2が入っています。
(2)引き算
int a = 5;
int b = 4;
int c = 0;
c = a - b;
上記の例だと、変数cには1が入っています。
(3)乗算
いわゆる掛け算です。掛け算はプログラム上では以下のように書きます。
int a = 5;
int b = 4;
int c = 0;
c = a * b;
上記の例だと、変数cには20が入っています。
試験ではなぜ「*
」なのかと問われることはまずないので、「*
」が「×」と同じということを覚えてもらえれば問題ありません。
(4)除算
いわゆる割り算です。割り算はプログラム上では以下のように書きます。
int a = 10;
int b = 2;
int c = 0;
c = a / b;
上記の例だと、変数cには5が入っています。
試験ではなぜ「/」なのかと問われることはまずないので、「/」が「÷」と同じということを覚えてもらえれば問題ありません。
まず代入のやり方、4つの計算式を覚えてもらえれば問題ありません。
5.クォータニオン(四元数)
クォータニオンと書かれていると「計算するのか……」と身構えるかもしれませんが、試験範囲内でのクォータニオンはtransform.rotationのことを指します。(重要)
transform.rotatioの型は「Quaternion」である、ということを覚えましょう。
Quaternionのスクリプトマニュアルがありますが、個人的にこれはざっと眺める程度で問題ありません。
6.変数同士の比較(演算子)
試験に出る範囲での、変数同士の比較のやり方を記載します。
後述する条件分岐、ループ文に使います。
演算子の意味を問う問題がいくつか出ていたので、知らないのであれば演算子を覚えましょう。
(1)変数が同じ値か否か
変数が同じか否かを判定します。演算子は「==」を利用します。
int a = 1;
int b = 1;
bool c;
c = a == b;
上記の場合、変数cにはtrueが入ります。
(2)変数が違う値か否か
変数が違うか否かを判定します。演算子は「!=」を利用します。
int a = 3;
int b = 1;
bool c;
c = a != b;
上記の場合、変数cにはtrueが入ります。
(3)論理否定演算子
難しい文字ですが簡単にいえば「bool変数にtrueが代入されていればfalse扱い」に「bool変数にfalseが代入されていればtrue扱い」にするということです。
変数に代入された値が反転させて扱う、と覚えてもらえれば試験は大丈夫です。
論理否定演算子は「!」を使います。
bool a = true;
bool b = !a;
上記の場合、変数bにはfalseが入ります。
論理否定演算子はbool以外でも扱うことがありますが、試験範囲ではひとまず、こういう演算子であるということさえ覚えてもらえれば問題ありません。
(4)比較演算子
変数同士の比較です。以下の4つを覚えましょう
演算子 | 説明 |
---|---|
< | より大きい |
> | より小さい |
<= | 以下 |
>= | 以上 |
例として、> 演算子を書くと
int a = 10;
int b = 5;
bool c;
c = a > b;
になります。
上記の例だと、変数aに代入された値が変数bより大きいので、変数cにはtrueが入ります。
これ以外にもいろんな演算子がありますが、試験ではひとまずこの範囲だけ覚えていれば問題ないかなと思います。
7.条件分岐(if文)
処理の条件分岐にif文を使います。
認定試験の場合、プログラムを一から書く問題は出ないので、「if文の概念」と「どうやって書くのか」を把握していれば問題ありません。
ざっと簡単に概要を書くと、もし○○の場合、この処理を行い、違う場合は○○の処理を行う、という感じです。
基本的なif文の書き方です。
bool a = true;
int b = 1;
if (a == true) {
b = 0;
}
「もし○○の場合、この処理を行い、違う場合は○○の処理を行う」というのはこのように書きます。
bool a = true;
int b = 1;
if (a == true) {
b = 0;
} else {
b = 2;
}
「もし○○の場合、この処理を行い、もし違う場合、○○の場合であればこの処理を行う」というのはこのように書きます。
bool a = true;
int b = 1;
if (a == true) {
b = 0;
} else if (a == false) {
b = 2;
}
分岐条件が二つ以上ある場合、以下のように定義します。
string a = "hallo";
string b = "hallo";
string c = "world";
if (a == b && a == c) {
c = a + b;
}
AND演算子「&&」は2つの条件がtrueである場合、trueを返します。
どちらか違う、もしくは両方違う場合はfalseを返します。
string a = "hallo";
string b = "hallo";
string c = "world";
if (a == b || a == c) {
c = a + b;
}
OR演算子「||」は2つの条件で、両方ともtrue、もしくはどちらかがtrueである場合、trueを返します。
両方違う場合はfalseを返します。
8.ループ文
ループ文は簡単に説明すると、ある条件を満たすまで処理を繰り返すことです。
ループはwhileとfor、二つあるので概念をおぼえましょう。
(1)while文
まずwhileです。試験に出る範囲で簡単に概要を説明すると、「条件を満たし続ける(trueである)限り処理を続ける」というものです。
int a = 0;
while(a < 100) {
a = a + 5;
}
上記の例だと、変数aが100より小さい場合、ずっと5を加え続けるという処理になります。
(2)for文
for文は、試験に出る範囲で簡単に概要を説明すると、「設定した回数分、処理を繰り返す」というものです。
whileとの違いをざっと説明すると、whileは「いつループが終わるかはわからない」、forは「処理を固定回数繰り返す」という違いです。
int a = 0;
for(int i = 0; i < 100; i++) {
a = a + 5;
}
上記の例だと、100回、変数aに5を加えるという処理になります。
9.メソッド
メソッドを簡単に説明すると、複数の命令がまとめられたものです。
void init() {
transform.position = new Vector3(0f, 0f, 0f);
Vector3 pos = transform.position + 2f;
}
このように{}で複数の命令がまとめられているものですね。
Unityにおけるメソッドには、大雑把にいうと「自分で作る」のと「Unityで特定条件を満たすと自動的に呼ばれる」の二種類があります。
(1) Unityで特定条件を満たすと自動的に呼ばれるメソッド
まず、Unity側から呼ばれるメソッドを覚えましょう。
試験範囲では以下のメソッドと呼び出されるタイミングさえ覚えれば大丈夫です。
メソッド名 | 呼ばれるタイミング |
---|---|
Awake | Startの前、プレハブのインスタンス化直後に一度だけ(重要) |
Start | スクリプトのインスタンスが有効後、最初のフレームのアップデート前 Awakeより後に呼ばれる(重要) |
Update | フレームごと 主に物理演算に関わらない、フレームごとに更新が必要な処理を書く(重要) |
FixedUpdate | 固定のフレームごとに この直後に物理演算が呼び出されるため、主に物理演算に関わる処理を書く(重要) |
他のメソッドや、詳細な説明はスクリプトリファレンスを読んでください。
(2) カスタムメソッド・引数と戻り値
カスタムメソッドは文字通り、自分で作るメソッドです。
void Init() {
transform.position = new Vector3(0f, 0f, 0f);
Vector3 pos = transform.position + 2f;
}
メソッドを呼び出す際、あらかじめ処理に必要な変数を定義していると、外部からそのメソッドが呼び出す時に必要な値を渡すことができます。これを引数と言います。
引数の設定は()内に書くことです。
void Start() {
Writelog("Hello World!");
}
void Writelog(string message) {
Debug.Log(message);
}
上記の例だと、messageが引数です。
引数は複数設定することができます。
void Start() {
Writelog("1", "Hello World!");
}
void Writelog(string id, string message) {
Debug.Log(id + ":" + message);
}
例としてこのような感じです。
またメソッドを外部から呼び出された場合、値を返すこともできます。
これを戻り値と言います。
void Update() {
int i = GetNumber();
}
int GetNumber() {
return 1;
}
メソッドに戻り値の型を定義し、戻す値は「return」で定義します。
戻り値の型に「void」が定義されている場合、メソッドは値を返しません。(重要)
void Start() {
return;
}
上記に書いたとおり、voidはreturnを書いても何も返しません。
メソッドは値を戻したり、戻さなかったりするということを覚えましょう。(重要)
10.Camera API(ScreenPointToRay)
スクリプトリファレンスのカメラからの Rayを見ましょう。
マニュアルに書かれている通り、マウス位置にあるオブジェクトを取得したい場合、rayというシーン上のコライダーに衝突した値を取るレイキャストを使用します。
Ray ray = camera.ScreenPointToRay(Input.mousePosition);
試験ではマウス位置にあるオブジェクトを取得したい場合、ScreenPointToRayを使う、と覚えましょう。
11.Time.deltaTime
最後のフレームを完了するのに要した時間を秒数値で取得します。
deltaTimeは「フレーム」で時間を計っています。(重要)
12.GameObject.GetComponent
ゲームオブジェクト内にあるコンポーネントにスクリプトで取得、参照したい場合、GameObject.GetComponentメソッドを使用します(重要)
void Start() {
Rigidbody rb = GetComponent<Rigitbody>();
}
上記は取得例です。
13.コルーチン
最後にコルーチンです。
コルーチンを大雑把に説明すると、メソッドの処理途中で一時的に中断したり、あとから中断行から再開できる仕組みのことです。
void Start() {
StartCoroutine("Sample");
}
IEnumerator Sample(){
Debug.Log("1回目");
// 一時中断し、次のフレームで処理を再開
yield return null;
Debug.Log("2回目");
// 一時中断し、5フレーム後に処理を再開する
yield return new WaitForSecond(5f);
Debug.Log("3回目");
}
作成したコルーチンのメソッドを開始するには、StartCoroutineを呼び出します。
コルーチンのメソッドは「IEnumerator」を戻り値の型として指定します。
試験ではコルーチンの概要と、StartCoroutineでコルーチンを開始する、コルーチンのメソッドの戻り値はIEnumeratorであることをまず覚えれば問題ないかと思います。(重要)
個人的に感じるUnity認定試験 合格のメリット
実際にUnity認定試験に合格して、個人的に感じるメリットです。
1.合格から2年間はUnity Technologies公認の開発者だと認められる。
一番のメリットはやはり、Unity Technologies公認の開発者だと認められる点だと思います。
期限があり、合格日から2年間です。
安くないお金を払っているので、有意義に使いましょう。
2.認定開発者の検索(Unity Certification Lookup)で自分の名前が表示される
合格しCertificate IDが発行されると、Unity Certification Lookupで自分の情報が表示されるようになります。
この利点は検索結果のURLを、自分のサイトに掲載したり、SNS投稿できたり、他の人にURLを送ることで認定開発者であることを教えることができる点です。
https://certification.unity.com/certification-lookup?last_name=Ogino&certification_id=201708UCD2731
(2019年10月13日まで見れると思います)
こんな風にです。ある意味ドヤ要素ですね。
3.メールの署名に使用できる
Certificate ID発行後、メールの署名にデジタル署名バッジとUnity認定開発者であることを表示するようにUnity Technologiesから推奨されます。ご丁寧にメール署名の表示例も用意されています。
書類は英語で来るので、簡単な日本語訳を掲載します。
合格者はデジタル署名バッジの画像をこちらからログインすることで入手可能です。
・バッジ(画像)の最適な表示
バッジは「Unity Certified Developer」が自分のテキストサイズとほぼ同じようなサイズで表示する
・署名
自分のUnity Certification number(Certification IDのこと)を必ず記入すること
Certification Lookupの検索結果ページのURLを直リンクさせる
・署名のフォントに
一番左がUnityテクノロジー推奨のフォント。左から順におすすめ
Roboto→Proxima→Nova→Avenir→Helvetica→Arial
例として自分のメール署名を掲載します。
こういうメール署名が送れるのはいいですね。ドヤ要素の一つです。
4.Unity Connectでプロファイルに掲載できる
Unity ConnectのプロファイルにUnity Certified Developerであることを表示するように推奨されています。
資格のところにCertification IDとUnity Certification Lookupの検索結果URLを記載しましょう。
何か影響があるかもしれません。
5.SNSのプロフィール等に掲載できる
Unity Connect以外でもSNSのプロフィールにUnity Certified Developerであることを表示するように推奨されています。
公式に案内されるのはLinkedInですが、Facebook、Twitter等、普段利用しているSNSのプロフィール欄にCertification IDとUnity Certification Lookupの検索結果URLを掲載しましょう。
#まとめ
一通りスクリプトの勉強箇所と個人的合格のメリットを書きました。
ここに書いてあることはスクリプトを勉強したことがある人にとっては基礎中の基礎にあたる部分であり、初心者向けの内容となっています。認定試験ではその部分が問われており、スクリプトのAPIを利用した応用に関する知識を問う問題ほぼないと思ってもらっていいです。
認定試験では全体的に「その分野を触る上でほぼ確実に触るであろう最低限の機能」「ゲーム製作を仕事にする上で必要な基礎知識」を問われているため、問題自体はきわめて簡単です。
ただ、とにかく試験範囲が広いため、各分野の広く基礎的な知識を身につける必要はあります。
「一度触れば誰でもわかるが、全く触ったことが無ければ解けない問題」という感じです。
Qiitaではスクリプトの部分を書きましたが、実際の試験はライティング、オーディオ、パーティクルなど幅広く問題が出題されるので、スクリプト部分だけでも全体の10%ぐらいしかありません。
試験料金は安くはないので、ここに書かれた部分と合格した先人達が公開している貴重な情報、VR Professional Academyさんが開催しているUnity認定試験対策講座、サブスクリプション所持者はコースウェアを利用して、是非一発合格を目指して頑張ってください!
どうあれ、Unity Certified Developerであることがドヤれるのが一番だとw
明日はkazutomoさんの「GS2 で魔法石を実装する話」についてです。楽しみにしています!