ひとりでのアプリ開発 - fineの備忘録 -

ひとりでアプリ開発をするなかで起こったことや学んだことを書き溜めていきます

Unity入門 - C#スクリプトの構造を見てみよう -

初めに

 Unityを使うなかでC#スクリプトを書く必要が出てきます。本記事では、C#の文構造を初心者用に書いていこうと思います。

C#スクリプトを見てみよう


 上の画像はUnityで "Hello, world." とTextに表示するための、C#スクリプトになります。これをもとに、文構造を見ていきます。

C#スクリプトは上画像の①、②、③で作られています。それぞれ

①namespace(名前空間

②class(クラス)

③method(メソッド、関数)

と呼ばれます。

namespace(名前空間)とは

 プログラムにおけるフォルダのようなものです。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

 Unityでは、C#スクリプトを作成するとデフォルトで上の3つが書かれています。今回は、UIの一つであるTextを使いたいので、UIが入っているUnityEngine.UIを自分で書き足しました。このように、プログラムは使うものをすべて書いておく必要があるのですが、その必要なものが入っているフォルダのようなものを名前空間と呼びます。
 この名前空間は自分で定義することもできますが、上の4つのように既に定義されているものもあります。初めのうちは自分で定義することもありません。とりあえず、使いたいものにアクセスするために、usingを使い、名前空間を書いておくと思っておきましょう。

class(クラス)とは
public class Helloworld : MonoBehaviour
{
  public GameObject OutputText;
  private Text _outputtext;
    // Start is called before the first frame update
    void Start()
    {
          _outputtext = OutputText.GetComponent<Text>();
          _outputtext.text = "Hello, world.";
    }

    // Update is called once per frame
    void Update()
    {

    }
}

 クラスとは、"オブジェクトの設計図のようなもの" と紹介されることが多いです。しかし、これはオブジェクト指向の概念を知らなければピンとこないと思います。そこでいったんオブジェクト指向について解説します。
オブジェクト指向とは
 オブジェクト(モノ)を組み立てるようにプログラムを書き、モノとモノの関係性を定義することでシステムを作り上げようとするシステム構成の考え方のことです。プログラミング言語の中には、オブジェクト指向の考え方をするものが多くあり、C#言語もその一つです。
 詳しくは下記リンクを見てください。
robo-done.com
〇クラスとは
 先ほど、クラスとは、"オブジェクトの設計図のようなもの" とご紹介しました。別の説明の仕方をするのであれば、"データや処理を一つにまとめるためのもの" です。
 上の例では、"public class Helloworld" と書いてあるため、Helloworldという名前のクラスがあることが分かります。これは、Text に "Hello, world." という文章を入力させる処理をまとめています。
 設計図とよばれたのは、クラスを使うことで、Text が何個あっても、すべてのTextに "Hello, world." と入力することができるためです。オブジェクトに同じ処理をする、同じオブジェクトを何個も作ることができるという意味で "設計図" と説明されています。
 また、"MonoBehavior" という文字が書いてあることが分かります。これは、基底クラス(親クラス)であることを表しています。クラスの中にクラスを作ることができるのですが、その一番大元のクラスであるということです。
 Monobehaviorについては、下記リンクの説明がわかりやすかったので載せておきます。
gimo.jp

method(メソッド、関数)とは

 クラスの中に書かれた複数の処理を一つにまとめたものです。私は関数という名前で言い慣れていますので、今後は関数と書かせていただきます。
 関数は大きく次の2種類に分けられます。

  • C#やUnityであらかじめ用意されている関数
  • 自分で新たに定義する関数
void Start()
    {
          _outputtext = OutputText.GetComponent<Text>();
          _outputtext.text = "Hello, world.";
    }

void Update()
    {

    }

 先ほどのスクリプト内にあった "Start" と "Update" はあらかじめ用意されている関数になります。UnityでC#スクリプトを作成するとデフォルトで書かれています。あらかじめ用意されている関数は特殊な関数でそれぞれ機能が与えられています。たとえば、

  • Start:クラスがインスタンス化(実体化)した瞬間に1度だけ呼び出される関数
  • Update:クラスが有効な時に、1フレームに1回呼び出される関数

となっています。上のスクリプトでは、はじめに1回 "Hello, world." と入力され、1フレームごとの処理はなにもないことがわかります。

最後に

 C#スクリプトの構造について、名前空間、クラス、関数について簡単に解説いたしました。オブジェクト指向の説明の中で、少し触れましたが、これらを使いこなし、オブジェクトを操作することで、システムを構築していくことになります。まだまだ説明できていない部分も多く、私自身、名前空間やクラスについては、まだまだ学ぶ必要があると感じています。今回は、3つの役割とオブジェクト指向の考え方だけ理解していただければと思います。