この投稿は、Unity Advent Calendar 2016の12月22日の記事です。
プログラミング未経験~初心者の方に向けて、C#のスクリプトテンプレートに書かれてある内容について解説します。
C#スクリプトテンプレートとは
Unity5.5.0では、C#スクリプトを作成すると、以下のスクリプトがテンプレートとしてが自動的に挿入されます。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SampleScript : MonoBehaviour {
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
}
テンプレートの大元が保存されている場所
C#スクリプトテンプレートの大元は、
Unityをインストールしたフォルダ/Editor/Data/Resources/ScriptTemplates/
の中に保存されています。
ファイル名は、81-C# Script-NewBehaviourScript.cs.txt
です。
「81-C# Script-NewBehaviourScript.cs.txt」を開くと、下図のようになっています。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class #SCRIPTNAME# : MonoBehaviour {
// Use this for initialization
void Start () {
#NOTRIM#
}
// Update is called once per frame
void Update () {
#NOTRIM#
}
}
なお、テンプレートは、変更したり、追加したりすることもできます。
<テンプレートの変更・追加 参考URL>
ハルシオンシステムの気ままBlog 【Unity】今更スクリプトのテンプレート変えてみたかった
Unityな日々(Unity Geek) スクリプトのテンプレートを追加する
C#スクリプトの作り方
1.[Project]ビューで、[Create]をクリックし、[C# Script]を選択します。
2.スクリプトに名前をつけます。
(ここでは「SampleScript」という名前にしました。)
3.[Inspector]ビューを見るか、または、スクリプトをダブルクリックして開くと、C#スクリプトテンプレートの内容が自動的に挿入された状態であることが確認できます。
テンプレートに書かれている内容について
1~3行目:usingで始まる行
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
プログラマーがプログラムしやすいように、C#やUnityはさまざまな機能を用意してくれています。
これらの行では、用意されている機能のうち、どの機能を使うかを指定しています。
イメージ的には、C#やUnityがプログラマーのために用意してくれている(System.Collections、UnityEngine等の)「お道具箱=便利な機能がまとめられたもの」のうち、どのお道具箱を使うか指定している、と考えると分かりやすいかもしれません。
C#スクリプトテンプレートでは、数あるお道具箱のうち、UnityでC#を書く際よく使われる「System.Collections」「System.Collections.Generic」「UnityEngine」の3つが指定されています。
usingで始まる行の追加例
あなたが書きたいスクリプトによっては、この3つのお道具箱では足りないことがあります。
そのような場合には、使いたい機能に応じて、別のお道具箱を追加してあげる必要があります。
例えば、現在日時を取得したいときなど、時間に関するコードを書きたいときは、
using System;
を追加する必要があります。
追加しなかったらどうなってしまうか
もし、using System;
を書かずに時間に関するコードを書くと、下図のようにエラーが出てしまいます。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SampleScript : MonoBehaviour {
// Use this for initialization
void Start () {
DateTime dtToday = DateTime.Today; //エラーが発生してしまいます
}
// Update is called once per frame
void Update () {
}
}
そこで、using System;
を追加すると、下図のようにエラーが出なくなります。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System; //ここを追加しました
public class SampleScript : MonoBehaviour {
// Use this for initialization
void Start () {
DateTime dtToday = DateTime.Today; //エラーが出なくなりました
}
// Update is called once per frame
void Update () {
}
}
専門用語について
ちなみに、このusingで始まる行は、専門用語では「usingディレクティブ」と言い、「名前空間」を取り込むためのものです。
「名前空間」は、初心者には少々難しい概念ですし、また、理解していなくても基本的なコードは書けるので、初心者のうちは気にしなくても良いと思います。
usingで指定した機能について
usingで指定した機能は、スクリプトの中で必ず使用しなければならない、というわけではありません。
例えば、using System;
と書いたスクリプトの中で、結局using System;
が必要となるコードを書かなかったとしても、エラーが発生したり、ゲームに支障が出ることはありません。
しかし逆に、もしそのスクリプトにとって必要な機能を指定していなかったら、上記の「using System;を書かずに時間に関するコード」を書いてしまったときのように、エラーが出てしまいます。
ですので、テンプレートに書かれてあるusing行は、不要だと思った場合も、初心者のうちは削除しない方が無難です。
5行目:public class ○○○○ : MonoBehaviour {
public class SampleScript : MonoBehaviour {
この行は、クラス名を決めるための行です。
「public class」と「: MonoBehaviour」の間に、このスクリプトの名前が自動的に書かれてあります。
このスクリプトの名前が、クラス名になります。
クラスとは
クラスは、書いたコードを管理しやすい単位で1つにまとめたものです。
クラスは、「{」で始まり、「}」で閉じられます。
public class SampleScript : MonoBehaviour { //ここからSampleScriptクラスがはじまりますよ、という意味
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
} //ここまでがSampleScriptクラスですよ、という意味
MonoBehaviourとは
MonoBehaviourは、Unityが用意しているクラスの1つです。
MonoBehaviourは、Unityでのゲーム制作においてとても重要かつ便利なクラスのため、Unityで作成するスクリプトは、基本的にMonoBehaviourの子クラスに指定することになっています。
「SampleScript : MonoBehaviour」は、「SampleScriptクラスが、MonoBehaviourの子クラスであること」を示しています。
MonoBehaviourを親クラスにすることで、MonoBehaviourクラスで定義されているたくさんの便利な機能を使うことができます。
例えば、「○秒後に、とある処理を呼び出したい」ときなどに、Invokeという関数を使いますが、この関数はMonoBehaviourクラスで定義されています。
すなわち、MonoBehaviourを親クラスにすることによって、スクリプト内でInvokeを使うことができるようになります。
public class SampleScript : MonoBehaviour { //MonoBehaviourクラスを親クラスとして継承している。
//(※MonoBehaviourクラスには、Invoke関数の定義も含まれている)
void Example () {
Invoke("Sample", 3);
}
void Sample () {
// ここに3秒後に行いたい処理を書きます
}
}
ちなみに、もしMonoBehaviourを親クラスにしなかったら(=「: MonoBehaviour」と書かなかったら)、下図のようにエラーが起きてしまい、Invokeを使うことができません。
7行目&12行目://で始まる行
// Use this for initialization
// Update is called once per frame
これらの行は、次の行(8行目「void Start () 」と、13行目「void Update () 」)の、StartとUpdateについて、英語で説明(コメント)されています。
7行目と12行目は、このテンプレートを作った人が、(恐らく、初心者にとって分かりやすいように)StartとUpdateの意味をコメントとして書いてくれているわけです。
これらのコメントをGoogleで翻訳すると、
「Use this for initialization」=「これを初期化に使用する」
「Update is called once per frame」=「更新はフレームごとに1回呼び出されます」
となります。それぞれの意味については、次の項目でもう少し詳しく解説します。
コメント行について
行内で「//」の右側に書かれてある文字は、コメントとして無視されます。
コメント行はプログラムには何の影響も及ぼしませんので、いらないと感じたら、以下のように消してしまっても大丈夫です。
(コメント行は、先ほど解説した「usingで始まる行」とは異なり、消去しても全く問題ありません。)
public class SampleScript : MonoBehaviour {
void Start () {
}
void Update () {
}
}
8~10行目&13~15行目:Start関数とUpdate関数
void Start () {
}
void Update () {
}
これらの行では、プログラムを書く際によく使われる関数のうち、「Start関数」と「Update関数」がテンプレートとして書かれています。
Startメソッド、Updateメソッドと呼ばれることもあります。
関数(メソッド)とは
行いたい処理(命令)をひとかたまりにして、(その処理を行いたいときに)呼び出せるようにしたものです。
(※数学の「関数」とは意味が異なります。)
(※関数とメソッドは、厳密には意味が異なりますが、初心者のうちはどちらも大体同じようなものだと思っていても大丈夫です。)
Start関数
Start関数内に書いた処理は、スクリプトを起動させた直後に1度だけ実行されます。
void Start () {
//ここに、起動直後に1度だけ実行したい処理を書きます(例:スタートボタンを表示する等)
}
Update関数
Update関数内には、アニメーションなど「動かし続けたい」ものや、「ずっと処理し続けたい」ことを書きます。
映画やアニメなどの動画は、1枚1枚異なる画像を、1秒間に何十枚も素早く新しい画像に更新していくことによって映像を作りだしていますが、この1枚1枚の画像を「フレーム」と呼びます。
ゲームも動画同様、フレームという単位で更新されていきます。
Update関数内に処理を書くと、その処理を毎フレームごとに繰り返してくれます。
void Start () {
//ここに、毎フレームごとに実行したい処理を書きます(例:敵キャラが歩いてやってくる等)
}
<参考URL>
Unity入門 UnityにおけるフレームとUpdate
その他の関数
テンプレートとして書かれているStart関数やUpdate関数以外にも、さまざまなタイミングで処理を行ってくれる関数が用意されています。
Start関数よりも早く処理を行ってくれるAwake関数や、オブジェクトを有効にした直後に呼び出されるOnEnable関数などがあります。
<参考URL>
イベント関数の実行順
もし、Start関数やUpdate関数以外に、自分がよく使う関数があれば、自作のテンプレートとして登録しておくのも良いかもしれません。
終わりに
プログラミング未経験者にとって、テンプレートは知らないことだらけで、とっつきにくく感じるかもしれません。
しかし、テンプレートに書かれてあることは、(テンプレートに選ばれるだけあって)プログラミングする上で便利かつ重要な基礎知識が含まれています。
ですので、それぞれの行の意味をざっくりでもいいので把握しておくと良いかと思われます。