前回はUnityとC#について簡単に解説しました。
前回の記事↓
今回の記事ではいよいよ実際にUnity上ではじめてのプログラミングに挑戦です!
Unity C#スクリプトを作成・実行していきましょう!
C#スクリプトを作成してGameObjectにアタッチするやり方
スクリプトの作成の方法
それでは早速Unityを起動してみましょう!
- Unityが起動しましたら、Unity Editor上のAssetタブ上にマウスカーソルを移動させ右クリックを押してみましょう。
- そうしますと、画像のようなコンテキストメニューが表示されますので、その中から Create > C# Script をクリックしてください。
- クリックしますとAssetタブ上に新しいファイルが作成されます。
- 作成された直後は作成されたファイルが選択されており、かつファイル名を変更できる状態になっていますので、付けたい名前を入力後にEnterキーを押してください。
- 完了
(注釈) スクリプトファイルを作成した後にファイル名を変更したい時は?
ファイル名を変更したい時は変更したいファイルの上で一回クリックしてみましょう。そうすると名前が変更できる状態になりますので、付けたい名前を入力してEnterキーを押してください。
スクリプトをGameObjectにアタッチ
編集したC#スクリプトはそのままだと制作しているアプリでは使用されません。
そのため、シーン上のGameObjectにアタッチすることが必要になり、そうすることで編集したC#スクリプトを実行することができます。アタッチとはGameObjectにコンポーネントとして作成されたスクリプトを設定するという意味になります。
※GameObjectとはUnityにおいてアプリにあるものを表すもので、GameObjectをたくさん配置することでアプリを作成していくのがUnityを使用した開発の基本になります。
※コンポーネントについては後で触れますが、簡単にいいますとGameObjectに持たせた機能となります。
GameObjectの作成
作成したものをGameObjectにアタッチする時はまず、アタッチするGameObjectを作成しましょう!
GameObjectの作成手順は次の通りです。
- Hierarchyタブで右クリックしてコンテキストメニューを開く。
- 「Create Empty」以下にあるいくつかの項目をクリックすることでGameObjectが作成することができます。ここでは一番基本的な「Create Empty」をクリックして下さい。
また、メニューのGameObjectの中にあるCreate Empty以下の項目をクリックすることでもGameObjectを作成することができます。
作成したGameObjectにはTransformと呼ばれるコンポーネントが既にアタッチされています。TransformはUnityEngineが提供している機能でGameObjectの位置・姿勢情報を表しているコンポーネントになります。
「Create Empty」以外の項目は既に作られたGameObjectのテンプレートのようなもので、クリックするとTransform以外のコンポーネントがアタッチされたGameObjectが作成されます。
ドラッグ&ドロップによるアタッチ
スクリプトを使用したいときはHierarcyタブでスクリプトと関連付けたいGameObjectへドラッグ&ドロップしてください。このとき、HierarcyタブのGameObject上またはInspector上のどちらでもドラック&ドロップすることができます。
GameObjectのInspectorタブからスクリプトをオブジェクトにアタッチ
ドラッグ&ドロップ以外の方法もあります。
- GameObjectを選択した時にInspectorタブの一番下側に表示される「Add Component」ボタンを押す。
- いろんなComponents欄が出てくるので「Scripts」を選択します。作成中のアプリに登録されているC#スクリプトの一覧が表示されます。
- その中から使用したいスクリプトを選択することでもアタッチ可能です。
この場合だとスクリプト名を検索する機能がついています。そのためAssetタブのディレクトリ階層を変更することなく任意のスクリプトをアタッチすることができます。また、アタッチできないスクリプトは項目には表示されません。
アタッチしたスクリプトを外したい時は?
一度、GameObjectにアタッチしたスクリプトは次の手順で外す(デタッチ)ことができます。
- Inspectorタブの各コンポーネント欄の右上にあるメニューボタン(縦に三つ点が並んでいるアイコン)をクリック
- 開くメニューの「Remove コンポーネント」ボタンをクリックする
- スクリプトが外れる
アタッチする時はスクリプトの中にコンポーネントを作る必要がある
GameObjectにアタッチしたいスクリプトは次の条件を満たしたクラスを記述している必要があります。
- 編集中のスクリプトファイル名と一致するクラス名を持つクラスを定義していること
- そのクラスがUnityEngine.MonoBehaviourを継承していること
※クラス名にはファイルの拡張子の部分(名前の後の「.」から始まるテキスト)は含める必要はありませんので注意してください。
※クラスやクラスの継承といったプログラミングの専門用語が出てきましたが、それにつきましては今後の記事で解説していきます。
もし、この条件を満たしていない場合はドラック&ドロップすることもできません。またそのような時はInspector上で表示されるスクリプト一覧にも表示されません。なので、アタッチできない時はファイル名とコンポーネントのクラス名が一致していることを確認してください。
また、このように定義されたクラスはUnityではコンポーネント(Component)として扱われます。GameObjectにアタッチしたいスクリプトはコンポーネントとして作成しなければいけません。
以後、GameObjectにアタッチするスクリプトをコンポーネントとして呼ぶ場合がありますので覚えておいて下さい。
C#スクリプトの構造を理解する
スクリプトを作成した直後のファイルの内容は以下のものになっています。
下にファイル名を「Sample.cs」とした場合のものを例に挙げます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Sample : MonoBehaviour { // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { } } |
それでは、ファイルの内容について説明していきたいと思います。
C#スクリプトは大きく分けて次の形に分かれます。
- ファイルの先頭部分に他のファイルなどに書かれた内容から名称を省略して使用したいものを書くusing文
- 実際に行われる処理を書くclass以降
ファイルの先頭にはusingキーワードを列挙していく
usingキーワードとは編集中のスクリプト以外で実装されたアプリの機能を使用するために呼び出すC#の機能になります。
ですので、上のサンプルコードでは次の三つのアプリ機能を使用するとき、名称を省略して書くことが出来るようになっています。
- System.Collections
- System.Collections.Generic
- UnityEngine
Systemから始まるものはC#の標準ライブラリに属するものになっており、Unity以外でC#を使用する時でも使用できます。サンプルコード上ではSystem.XXXのアプリ機能は使用されていませんが、よく使われているためあらかじめ記述されています。
UnityEngineの方はUnityが提供しているアプリ機能となっています。サンプルコードではMonoBehaviourがUnityEngineの機能として使用されています。
※usingキーワードはそれ以外の部分でも使われます。プログラミング言語では同じ単語でも使用する場所で意味が異なる場合があります。
もし、サンプルコードのusingキーワードを使用していない場合は次のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public class Sample : UnityEngine.MonoBehaviour { // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { } } |
※ちなみにusingキーワード以外にもマクロと呼ばれるものの定義も先頭に書く必要があります。マクロの場合はコメント以外の全ての要素より先に書く必要があります。
usingキーワードの後にクラスを定義していき、そのクラスの中に変数や処理を書いていく
usingキーワードの後には、名前空間やクラスの定義を書いていきます。
※名前空間やクラスなどのプログラミング用語が出てきますが、詳しい説明は後の記事で解説していくのでひとまずこのように書くものと思ってください。
サンプルコードでは「Sample」と名付けられたクラスのみが定義されています。そのSampleクラスの中にはStartメソッドとUpdateメソッドが定義されています。
StartメソッドとUpdateメソッドには何も処理が書かれてないので、スクリプトを作成した直後はSampleクラスは何もしないメソッドを2つ持っている状態になってます。
C#スクリプトを編集してプログラミングする方法
それでは早速、初めてのプログラミングをやってみましょう!
まず、編集したいスクリプトファイルをダブルクリックしましょう!
すると、Unity Editorに設定されているテキストエディタが開きます。
このファイルを編集することでプログラミングを行うことができます。
開くテキストエディタにつきましては、ご使用中のPCによって異なるため使い方などの説明は省略させていただきますのでお願いします(また別記事で解説するかもしれません)。
ここではUnity Editorによって開かれるテキストエディタの設定方法についてのみ解説していきます。
Unity Editorで使用するテキストエディタの確認・設定方法
Unity Editorが使用するテキストファイルの確認・設定のやり方としては次の手順になります。
筆者が使用しているPCがMacOSですが、Windowsでも似たような内容になります。また、Unityが英語のままになっていますが、言語設定によっては日本語の場合もありますのでそちらも随意読み変えて下さい。
- メニューのPreference(設定)をクリック
- Editor項目をクリック
- その中のText Editorの部分を使用したいものに変更して下さい。
テキストエディターの確認・設定は以上になります。
プログラミングしてみよう!
それではプログラミングを初めていきたいと思います。
まず次のサンプルコードのようにSample.csファイルを編集して下さい。
ちなみに//
で始まる部分はコメントと言ってソースコードに説明を書き加えるためのものでコンパイルからは無視されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Sample : MonoBehaviour { public float Value = 0.1f; // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { } } |
編集しコンパイルに成功した場合は、SampleコンポーネントをアタッチしたGameObjectのInspectorに「Value」という項目が追加されます。
これは上のサンプルコードの六行目の内容をUnity Editorが読み取った結果になります。
1 |
public float Value = 0.1f; // <- これをメンバ変数といいます。 |
この「Value」をC#ではメンバ変数といいます。
コンパイルに成功直後の「Value」には0.1という値が設定されています。
0.1はサンプルコードの0.1f
と書かれた部分と対応しています。初回のコンパイルが成功した後にこの値を変更した時はInspector上の値は変更されませんので注意して下さい。
また、Inspector上からこの値を変更させることができます。
「Value」を変更しても何が変わったのか分かりづらいので、次のサンプルコードに書き換えてみましょう!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Sample : MonoBehaviour { public float Value = 0.1f; public Color Color = Color.white; // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { } } |
7行目のColorメンバ変数が追加されたものになります。
1 |
public Color Color = Color.white; |
コンパイルが成功しますと、Inspectorに「Color」の項目が追加され、色をカラーパレットかスポイトツールで設定できるようになります。初めはScript上でColor.white
と設定しているため白色が設定されています。
今回のSampleクラスのValueやColorメンバ変数のように、Unity Editorによって解釈されInspector上に反映される内容としては以下のものになります。まだ説明していないものも含まれていますので、軽く流していただいてOKです。
- コンポーネントのpublicなメンバ変数
- コンポーネントのUnityEngine.SerializeFieldAttributeを指定されたメンバ変数
また、ここでは解説しませんが、Inspectorに表示される内容をカスタマイズする方法もUnityは提供しています。詳しく知りたい時はUnityEngine.RangeAttributeやUnityEditor.Editor、UnityEditor.PropertyDrawerなどで検索してみるといいでしょう。
C#スクリプトを実行してみる
ここまでInspector上に反映されるものを見てきました。次は実際にアプリ上で実行されるものをプログラミングしていきましょう。
次のようにサンプルコードを編集してみましょう!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Sample : MonoBehaviour { public float Value = 0.1f; public Color Color = Color.white; // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { transform.position += new Vector3(Value, 0, 0); } } |
アプリで実行されるスクリプトの実行方法
スクリプトを実行したいときはUnity Editorの画面上あたりにある再生ボタンを押してください。
アプリで使われる全てのスクリプトにコンパイルエラーがなければ、Unity Editorが再生モードに切り替わります。コンパイルエラーがある場合は再生ボタンは押すことができないので注意して下さい。
再生モードではUnity Editorは実際にアプリが実行された状態と同じ環境になりアプリの挙動を確認できます。またSceneビューからGameビューに自動的に画面が切り替わります。
停止したい場合はもう一度再生ボタンを押して下さい。
コンポーネントのUpdateメソッドについて
ここまでのサンプルコードを実行しますと、SampleコンポーネントをアタッチしたGameObjectのInspectorを見てもらうと一番上にあるコンポーネントであるTransformのposition(位置データ)が変わっていますので、確認してみて下さい。
なぜこうなるかといいますと、SampleクラスのUpdateメソッドで Transformのpositionの値を更新し続けているからです。
このコードではpositionのxの値のみを更新し続けています。
1 2 3 4 5 |
// Update is called once per frame void Update() { transform.position += new Vector3(Value, 0, 0); } |
箱を移動させてみる。
画面が何も変わらないのは少し地味なので、今度は画面に何かを表示してみましょう。
次の手順を行って下さい。Unity Editorを再生している場合は停止してから行って下さい。再生したまま行いますと、停止時に再生中に行った作業内容が全て削除されるので注意して下さい。
Hierarchyタブで右クリックしコンテキストメニューを開き、3D Object > Cubeをクリックします。
Hierarchyタブに「Cube」というGameObjectが追加され、画面に箱が表示されます。
先ほど作ったGameObjectはもう必要ないので右クリック→Deleteを選択して消しておきましょう。
追加された「Cube」に「Sample」コンポーネントをアタッチして、再生ボタンを押してみて下さい。Sampleコンポーネントの内容がここまでのサンプルコードと同じならGameビューにて画面中央から左右どちらかに移動する様子が見ることができます。
もし移動しなかったり、見えない場合はSampleコンポーネントのValueの値を変更してみて下さい。Valueの値を0.01といった小さな値にするとゆっくりと箱が移動する様子を見ることができます。
コンポーネントのStartメソッドについて(箱の色を変えてみる)
ちなみに箱の色も変化させることができます。次のようにSampleコンポーネントを編集して下さい。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Sample : MonoBehaviour { public float Value = 0.1f; public Color Color = Color.white; public MeshRenderer Mesh; // Start is called before the first frame update void Start() { Mesh.material.color = Color; // 箱の色を変えるコード } // Update is called once per frame void Update() { transform.position += new Vector3(Value, 0, 0); } } |
上のサンプルコードでコンパイルすることができましたら、次の手順を行った後に再生ボタンを押してみて下さい。もちろん手順を行う前にUnity Editorの再生を停止しなかった時は作業内容がリセットされますので注意して下さい。
- 箱を表すGameObject「Cube」を選択して下さい。
- InspectorのSampleコンポーネントにMeshという項目が追加されていますので、そちらに「Cube」をドラッグ&ドロップして下さい。
手順が終わった後に再生しますと、箱の色がSampleコンポーネントのColorと似た色に変化します。同じ色ではなく似た色になるのは3Dレンダリングのライティング(光環境)の影響を受けているためです。
Unityの機能を覚えていくうちに指定した色と同じ色になるように設定することも可能になります。
色が変化するのは上のサンプルコードの中で、SampleクラスのStartメソッドでSampleクラスのMeshメンバ変数に設定されているマテリアルの色をSampleクラスのColorメンバ変数と同じになるように設定しているからです。
1 2 3 4 5 |
public MeshRenderer Mesh; // Start is called before the first frame update void Start() { Mesh.material.color = Color; // 箱の色を変えるコード } |
ちなみにこの記事の初めの方で作成したSampleコンポーネントをアタッチした空のGameObjectを削除せず残っている場合、再生するとエラーが発生します。
これはSampleコンポーネントのMeshメンバ変数の値が設定されていないため発生するエラーとなっています。もしGameObjectを残したままエラーを回避したい時は空のGameObjectからSampleコンポーネントをデタッチしましょう。
エラーの確認にはメニューのWindow > General > Consoleをクリックすることで開かれるConsoleタブで確認することができます。
また、画面下側に表示されるログをクリックすることでもConsoleタブを開くことができます。この時はエラーが発生したスクリプトの場所まで自動的に開いてくれますので便利です。
編集モードで実行できるスクリプトの作成方法
Unity Editorでは編集モードの時にでもスクリプトに命令を実行させることが可能です。
この機能のことをUnityではEditor拡張と呼ばれております。Editor拡張を利用することで以下のことができます。
- コンポーネントのInspectorの見た目を変更できる。
- こちらがレイアウトを指定したタブウィンドウを作成できる。
こちらは説明すると長くなりますので、ここでは紹介だけに留めておきます。
まとめ
長くなりましたが、この記事はここまでとなります。
基本的には次の順序でC#スクリプトを作成・実行することができます。
- スクリプトを作成
- 作成したスクリプトをコンパイルエラーなしになるように編集
- 編集したスクリプトを適当なGameObjectにアタッチする
また、まだ解説していないC#の機能がたくさん出てきました。
- usingキーワード
- クラス
- クラスの継承
- 名前空間
- メンバ変数
- メソッド
- 箱を移動させるコードや色を変える部分の計算方法
これらについても、詳しい文法に関しては以降の記事で説明していくのでぜひそちらも読んでみてください。
それでは、次の記事に行ってみましょう。
次の記事:
コメント