Unity C#スクリプトの構造 スクリプトの作成と実行方法

スクリプトをアタッチ(Inspectorから)の画像 Unity C#入門講座
スクリプトをInspector上からGameObjectにアタッチする


Unityの本格ゲーム制作講座はこちら
【30日間の全額返金保証付き】

前回はUnityとC#について簡単に解説しました。

前回の記事↓

Unity C#言語とは
本連載では、Unity上においてのC#について解説していきます。 初めての方でもわかりやすく解説していきますので、お気軽に読んだり、実際にUnity上で動かしてみてください。 Unityにおけるプログラミング言語の役割 プログラミ...

今回の記事ではいよいよ実際にUnity上ではじめてのプログラミングに挑戦です!

Unity C#スクリプトを作成・実行していきましょう!


【Unity入門の森の最新ゲーム開発講座もお届け】

C#スクリプトを作成してGameObjectにアタッチするやり方

スクリプトの作成の方法

それでは早速Unityを起動してみましょう!

  1. Unityが起動しましたら、Unity Editor上のAssetタブ上にマウスカーソルを移動させ右クリックを押してみましょう。
    アセットタブで右クリックの画像

    アセットタブで右クリック

  2. そうしますと、画像のようなコンテキストメニューが表示されますので、その中から Create > C# Script をクリックしてください。
    コンテキストメニューのC#スクリプト作成ボタンの位置の画像

    コンテキストメニューのC#スクリプト作成ボタンの位置

  3. クリックしますとAssetタブ上に新しいファイルが作成されます。
    クリックするとC#スクリプトが作成されるの画像

    クリックするとC#スクリプトが作成される

  4. 作成された直後は作成されたファイルが選択されており、かつファイル名を変更できる状態になっていますので、付けたい名前を入力後にEnterキーを押してください。
  5. 完了

(注釈) スクリプトファイルを作成した後にファイル名を変更したい時は?

ファイル名を変更したい時は変更したいファイルの上で一回クリックしてみましょう。そうすると名前が変更できる状態になりますので、付けたい名前を入力してEnterキーを押してください。

ファイル名の変更の画像

ファイル名の変更

 

スクリプトをGameObjectにアタッチ

編集したC#スクリプトはそのままだと製作しているアプリでは使用されません。

そのため、シーン上のGameObjectにアタッチすることが必要になり、そうすることで編集したC#スクリプトを実行することができます。アタッチとはGameObjectにコンポーネントとして作成されたスクリプトを設定するという意味になります。

※GameObjectとはUnityにおいてアプリにあるものを表すもので、GameObjectをたくさん配置することでアプリを作成していくのがUnityを使用した開発の基本になります。

※コンポーネントについては後で触れますが、簡単にいいますとGameObjectに持たせた機能となります。

GameObjectの作成

作成したものをGameObjectにアタッチする時はまず、アタッチするGameObjectを作成しましょう!

GameObjectの作成手順は次の通りです。

  1. Hierarchyタブで右クリックしてコンテキストメニューを開く。
  2. 「Create Empty」以下にあるいくつかの項目をクリックすることでGameObjectが作成することができます。ここでは一番基本的な「Create Empty」をクリックして下さい。
空のGameObjectの作成の画像

空のGameObjectの作成方法

また、メニューのGameObjectの中にあるCreate Empty以下の項目をクリックすることでもGameObjectを作成することができます。

メニューからでもGameObjectを作成することが出来るの画像

メニューからでもGameObjectを作成することができます。

 

作成したGameObjectにはTransformと呼ばれるコンポーネントが既にアタッチされています。TransformはUnityEngineが提供している機能でGameObjectの位置・姿勢情報を表しているコンポーネントになります。

「Create Empty」以外の項目は既に作られたGameObjectのテンプレートのようなもので、クリックするとTransform以外のコンポーネントがアタッチされたGameObjectが作成されます。

ドラッグ&ドロップによるアタッチ

スクリプトを使用したいときはHierarcyタブでスクリプトと関連付けたいGameObjectへドラッグ&ドロップしてください。このとき、HierarcyタブのGameObject上またはInspector上のどちらでもドラック&ドロップすることができます。

スクリプトをアタッチ(ドラック&ドロップ)の画像

スクリプトをドラック&ドロップでGameObjectにアタッチする

GameObjectのInspectorタブからスクリプトをオブジェクトにアタッチ

ドラッグ&ドロップ以外の方法もあります。

  1. GameObjectを選択した時にInspectorタブの一番下側に表示される「Add Component」ボタンを押す。
  2. いろんなComponents欄が出てくるので「Scripts」を選択します。作成中のアプリに登録されているC#スクリプトの一覧が表示されます。
  3. その中から使用したいスクリプトを選択することでもアタッチ可能です。

この場合だとスクリプト名を検索する機能がついています。そのためAssetタブのディレクトリ階層を変更することなく任意のスクリプトをアタッチすることができます。また、アタッチできないスクリプトは項目には表示されません。

スクリプトをアタッチ(Inspectorから)の画像

スクリプトをInspector上からGameObjectにアタッチする

アタッチしたスクリプトを外したい時は?

一度、GameObjectにアタッチしたスクリプトは次の手順で外す(デタッチ)ことができます。

  1. Inspectorタブの各コンポーネント欄の右上にあるメニューボタン(縦に三つ点が並んでいるアイコン)をクリック
  2. 開くメニューの「Remove コンポーネント」ボタンをクリックする
  3. スクリプトが外れる
スクリプトのデタッチする画像

GameObjectにアタッチされているスクリプトをデタッチする

アタッチする時はスクリプトの中にコンポーネントを作る必要がある

GameObjectにアタッチしたいスクリプトは次の条件を満たしたクラスを記述している必要があります。

  • 編集中のスクリプトファイル名と一致するクラス名を持つクラスを定義していること
  • そのクラスがUnityEngine.MoneBehaviourを継承していること

※クラス名にはファイルの拡張子の部分(名前の後の「.」から始まるテキスト)は含める必要はありませんので注意してください。

※クラスやクラスの継承といったプログラミングの専門用語が出てきましたが、それにつきましては今後の記事で解説していきます。

もし、この条件を満たしていない場合はドラック&ドロップすることもできません。またそのような時はInspector上で表示されるスクリプト一覧にも表示されません。なので、アタッチできない時はファイル名とコンポーネントのクラス名が一致していることを確認してください。

また、このように定義されたクラスをUnityではコンポーネント(Component)として扱われます。GameObjectにアタッチしたいスクリプトはコンポーネントとして作成しなければいけません。

以後、GameObjectにアタッチするスクリプトをコンポーネントとして呼ぶ場合がありますので覚えておいて下さい。

C#スクリプトの構造を理解する

スクリプトを作成した直後のファイルの内容は以下のものになっています。

下にファイル名を「Sample.cs」とした場合のものを例に挙げます。

それでは、ファイルの内容について説明していきたいと思います。

C#スクリプトは大きく分けて次の形に分かれます。

  • ファイルの先頭部分に他のファイルなどに書かれた内容から名称を省略して使用したいものを書くusing文
  • 実際に行われる処理を書くclass以降

ファイルの先頭にはusingキーワードを列挙していく

usingキーワードとは編集中のスクリプト以外で実装されたアプリの機能を使用するために呼び出すC#の機能になります。

ですので、上のサンプルコードでは次の三つのアプリ機能を使用するとき、名称を省略して書くことが出来るようになっています。

  • System.Collections
  • System.Collections.Generic
  • UnityEngine

Systemから始まるものはC#の標準ライブラリに属するものになっており、Unity以外でC#を使用する時でも使用できます。サンプルコード上ではSystem.XXXのアプリ機能は使用されていませんが、よく使われているためあらかじめ記述されています。

UnityEngineの方はUnityが提供しているアプリ機能となっています。サンプルコードではMonoBehaviourがUnityEngineの機能として使用されています。

※usingキーワードはそれ以外の部分でも使われます。プログラミング言語では同じ単語でも使用する場所で意味が異なる場合があります。

もし、サンプルコードのusingキーワードを使用していない場合は次のようになります。

※ちなみに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が英語のままになっていますが、言語設定によっては日本語の場合もありますのでそちらも随意読み変えて下さい。

  1. メニューのPreference(設定)をクリック
    テキストエディターの設定その1の画像

    メニューのUnity > Preference(設定) ボタンをクリック

  2. Editor項目をクリック
    テキストエディターの設定その2の画像

    Extenal Tools(外部ツール)ボタンをクリック

  3. その中のText Editorの部分を使用したいものに変更して下さい。
    テキストエディターの設定その3の画像

    External Script Editorの項目をクリックし、使用したいテキストエディターを選択する

テキストエディターの確認・設定は以上になります。

プログラミングしてみよう!

それではプログラミングを初めていきたいと思います。

まず次のサンプルコードのようにSample.csファイルを編集して下さい。

ちなみに//で始まる部分はコメントと言ってソースコードに説明を書き加えるためのものでコンパイルからは無視されます。

編集しコンパイルに成功した場合は、SampleコンポーネントをアタッチしたGameObjectのInspectorに「Value」という項目が追加されます。

Inspectorに項目が追加されるの画像

スクリプトに書いた「Value」という内容がInspectorに反映される。(※画像のものはValueの値を変更しています。)

これは上のサンプルコードの六行目の内容をUnity Editorが読み取った結果になります。

この「Value」をC#ではメンバ変数といいます。

コンパイルに成功直後の「Value」には0.1という値が設定されています。

0.1はサンプルコードの0.1fと書かれた部分と対応しています。初回のコンパイルが成功した後にこの値を変更した時はInspector上の値は変更されませんので注意して下さい。

また、Inspector上からこの値を変更させることができます。

「Value」を変更しても何が変わったのか分かりづらいので、次のサンプルコードに書き換えてみましょう!

7行目のColorメンバ変数が追加されたものになります。

コンパイルが成功しますと、Inspectorに「Color」の項目が追加され、色をカラーパレットかスポイトツールで設定できるようになります。初めはScript上でColor.whiteと設定しているため白色が設定されています。

Color項目を追加しようの画像

Colorメンバ変数を追加した後のInspector

カラーパレットを開いた時の画像

クリックするとカラーパレットが開く。右端のアイコンはスポイトツールになります。

 

今回のSampleクラスのValueやColorメンバ変数のように、Unity Editorによって解釈されInspector上に反映される内容としては以下のものになります。まだ説明していないものも含まれていますので、軽く流していただいてOKです。

  • コンポーネントのpublicなメンバ変数
  • コンポーネントのUnityEngine.SerializeFieldAttributeを指定されたメンバ変数

また、ここでは解説しませんが、Inspectorに表示される内容をカスタマイズする方法もUnityは提供しています。詳しく知りたい時はUnityEngine.RangeAttributeやUnityEditor.Editor、UnityEditor.PropertyDrawerなどで検索してみるといいでしょう。

C#スクリプトを実行してみる

ここまでInspector上に反映されるものを見てきました。次は実際にアプリ上で実行されるものをプログラミングしていきましょう。

次のようにサンプルコードを編集してみましょう!

アプリで実行されるスクリプトの実行方法

スクリプトを実行したいときはUnity Editorの画面上あたりにある再生ボタンを押してください。

アプリ再生ボタンの画像

画面上部の再生ボタンを押すことでアプリを実行できます。

アプリで使われる全てのスクリプトにコンパイルエラーがなければ、Unity Editorが再生モードに切り替わります。コンパイルエラーがある場合は再生ボタンは押すことができないので注意して下さい。

再生ボタンを押した後の画面の画面

再生ボタンを押した後は自動的にGameビューに切り替わります。

再生モードではUnity Editorは実際にアプリが実行された状態と同じ環境になりアプリの挙動を確認できます。またSceneビューからGameビューに自動的に画面が切り替わります。

停止したい場合はもう一度再生ボタンを押して下さい。

コンポーネントのUpdateメソッドについて

ここまでのサンプルコードを実行しますと、SampleコンポーネントをアタッチしたGameObjectのInspectorを見てもらうと一番上にあるコンポーネントであるTransformのposition(位置データ)が変わっていますので、確認してみて下さい。

Transformが更新され続けている画像

ここまでのサンプルコードを実行するとSampleコンポーネントをアタッチしたGameObjectのTransformのpositionが更新され続ける。

なぜこうなるかといいますと、SampleクラスのUpdateメソッドで Transformのpositionの値を更新し続けているからです。

このコードではpositionのxの値のみを更新し続けています。

箱を移動させてみる。

画面が何も変わらないのは少し地味なので、今度は画面に何かを表示してみましょう。

次の手順を行って下さい。Unity Editorを再生している場合は停止してから行って下さい。再生したまま行いますと、停止時に再生中に行った作業内容が全て削除されるので注意して下さい。

Hierarchyタブで右クリックしコンテキストメニューを開き、3D Object > Cubeをクリックします。

3DObject_Cubeをクリックすると箱が表示される画像

3D Object > Cubeをクリックすると画面に箱が表示される。

Hierarchyタブに「Cube」というGameObjectが追加され、画面に箱が表示されます。

先ほど作ったGameObjectはもう必要ないので右クリック→Deleteを選択して消しておきましょう。

追加された「Cube」に「Sample」コンポーネントをアタッチして、再生ボタンを押してみて下さい。Sampleコンポーネントの内容がここまでのサンプルコードと同じならGameビューにて画面中央から左右どちらかに移動する様子が見ることができます。

もし移動しなかったり、見えない場合はSampleコンポーネントのValueの値を変更してみて下さい。Valueの値を0.01といった小さな値にするとゆっくりと箱が移動する様子を見ることができます。

箱が移動する動画の画像

箱が移動する

コンポーネントのStartメソッドについて(箱の色を変えてみる)

ちなみに箱の色も変化させることができます。次のようにSampleコンポーネントを編集して下さい。

上のサンプルコードでコンパイルすることができましたら、次の手順を行った後に再生ボタンを押してみて下さい。もちろん手順を行う前にUnity Editorの再生を停止しなかった時は作業内容がリセットされますので注意して下さい。

  1. 箱を表すGameObject「Cube」を選択して下さい。
  2. InspectorのSampleコンポーネントにMeshという項目が追加されていますので、そちらに「Cube」をドラッグ&ドロップして下さい。
Meshにアタッチする動画

「Cube」のSampleコンポーネントのMeshメンバ変数に「Cube」の箱をアタッチする

手順が終わった後に再生しますと、箱の色がSampleコンポーネントのColorと似た色に変化します。同じ色ではなく似た色になるのは3Dレンダリングのライティング(光環境)の影響を受けているためです。
Unityの機能を覚えていくうちに指定した色と同じ色になるように設定することも可能になります。

箱の色が変わるの画像

実行してすぐに箱の色がColorメンバ変数と似た色に変わる

色が変化するのは上のサンプルコードの中で、SampleクラスのStartメソッドでSampleクラスのMeshメンバ変数に設定されているマテリアルの色をSampleクラスのColorメンバ変数と同じになるように設定しているからです。

ちなみにこの記事の初めの方で作成したSampleコンポーネントをアタッチした空のGameObjectを削除せず残っている場合、再生するとエラーが発生します。

これはSampleコンポーネントのMeshメンバ変数の値が設定されていないため発生するエラーとなっています。もしGameObjectを残したままエラーを回避したい時は空のGameObjectからSampleコンポーネントをデタッチしましょう。

Meshメンバ変数をアタッチしていないとエラーが発生するの画像

SampleコンポーネントのMeshメンバ変数をアタッチしていないとエラーが発生する

エラーの確認にはメニューのWindow > General > Consoleをクリックすることで開かれるConsoleタブで確認することができます。

また、画面下側に表示されるログをクリックすることでもConsoleタブを開くことができます。この時はエラーが発生したスクリプトの場所まで自動的に開いてくれますので便利です。

Consoleタブの開き方の画像

メニューのWindow > General > ConsoleをクリックすることでConsoleタブを開くことが出来る。

編集モードで実行できるスクリプトの作成方法

Unity Editorでは編集モードの時にでもスクリプトに命令を実行させることが可能です。

この機能のことをUnityではEditor拡張と呼ばれております。Editor拡張を利用することで以下のことができます。

  • コンポーネントのInspectorの見た目を変更できる。
  • こちらがレイアウトを指定したタブウィンドウを作成できる。

こちらは説明すると長くなりますので、ここでは紹介だけに留めておきます。

まとめ

長くなりましたが、この記事はここまでとなります。

基本的には次の順序でC#スクリプトを作成・実行することができます。

  1. スクリプトを作成
  2. 作成したスクリプトをコンパイルエラーなしになるように編集
  3. 編集したスクリプトを適当なGameObjectにアタッチする

また、まだ解説していないC#の機能がたくさん出てきました。

  • usingキーワード
  • クラス
  • クラスの継承
  • 名前空間
  • メンバ変数
  • メソッド
  • 箱を移動させるコードや色を変える部分の計算方法

これらについても、詳しい文法に関しては以降の記事で説明していくのでぜひそちらも読んでみてください。

それでは、次の記事に行ってみましょう。

次の記事:

Unity C#のコンパイルエラーの種類と対処法について
前回ははじめてのUnity C#プログラミングに挑戦しましたね。 前回の記事↓ プログラミングではコンパイルエラーが付き物です。 コンパイルエラーはスクリプトの書き方が間違っていることを私たちに教えてくれる機能となります。コンパイ...

初心者向けUnityC#入門講座に戻る>>


【Unity入門の森の最新ゲーム開発講座もお届け】

コメント

タイトルとURLをコピーしました