HOME » » » » HERE

ゆにすち入門編(この画像は、https://www.pakutaso.com/さまから借用しています)

こんにちわ、横浜すみっこクリエイターととです。

Unityでゲームを制作して販売するまでの軌跡を描くゆにすち!入門編です!

今回は、Unityでオブジェクトを動かすために必須のC#スクリプトについて、その作成方法自動生成される中身についてみていくことにしましょう。

スクリプトが何かについては、過去の投稿「Visual Studio Code 導入!」で解説していますが、Unityで何かを動かすためのプログラムコードのことです。C#というプログラミング言語で記述していきます。

また、スクリプトファイルの作り方についても、「Unity と Visual Studio Code の連携!」で触れていますが、Visual Studio Code(以降、「VS Code」といいます。)の動作確認のためだったので解説も浅めでした。スクリプトファイルにフォーカスを当てて、いま一度解説していきます。

ゆにすち!シリーズとは

このシリーズではUnityでSTEAM販売を目指す!略してゆにすち!と銘打ち、モデリングもプログラミングも企画も販売も何から何までぜ~んぶド素人のととが、PCゲームを考え、制作して、販売するまでの風景を履歴として残していくものです。

この入門編では、Unityの基本的な使い方やゲームの構造について学んでいきます。

この記事のポイント!

  • スクリプトファイルは、アセットとして作成する!
  • ライブラリーは、よく使われる機能をひとまとめにしたもの!
  • using ~は、プログラムの先頭に記述してライブラリーを呼び出す!
  • クラスは、プログラムの基本単位であり、どのように動かしたいかを記述する処理のカタマリ!
  • スコープは、他のコードからの参照範囲のこと!
  • アクセス修飾子publicがついていると、すべてのスコープからアクセス可能!
  • 継承をすると、別のクラスの性質を引き継いで使える!
  • コメントで、プログラムに一切影響しないメモを残せる!
  • メソッドは、処理をさせるコードブロック!
  • Start()メソッドは、クラスが呼ばれた瞬間に1回だけ実行される!
  • Update()メソッドは、フレームごとに更新される!
  • スクリプトファイル名とクラス名は一致している必要がある!

スクリプトの作成

スクリプトファイルは、アセットとして作成します。

一般的に、スクリプトファイルは「Scripts」というフォルダーの中に生成していきます。まずはフォルダーを作成しましょう。

ゆにすち(「フォルダー」を作成します) 新しいフォルダーを作成

プロジェクトウィンドウの「Assets」内で右クリックして、作成 > フォルダーをクリックします。

ゆにすち(フォルダー名を変更します) フォルダー名を「Scripts」に変更

作成されたフォルダー名を「Scripts」に変更しておきます。

次に、スクリプトファイルを作成します。フォルダーをダブルクリックして、「Scripts」階層に入ります。

ゆにすち(「C# スクリプト」を作成します) 「C# スクリプト」を作成

もう一度右クリックして、今度は作成 > C# スクリプトをクリックします。

ゆにすち(ファイル名が編集できる状態です) 編集待ち状態のファイル

ファイルが作成されますが、ファイル名が編集できる状態になっていると思います。デフォルトで「NewBehaviourScript」となっていますが、一度も確定しないままで* ファイル名を変更する必要があります。

ファイル名が自動生成されるコードにも影響するため、一度確定してしまうとコードの修正が必要になります。詳しくは後述します。
ゆにすち(ファイル名を変更します) ファイル名を「SampleScript.cs」に変更

ファイル名を「SampleScript.cs」に変更しておきましょう。これでスクリプトファイルが準備できました。

スクリプトファイルの中身をのぞいてみる!

作成したスクリプトファイルを開いてみましょう。ファイルをダブルクリックします。

ゆにすち([VS Code]でスクリプトファイルを開きます) VS Codeで開かれたスクリプトファイル

このブログに沿って来ていれば、VS Codeで開かれていると思います。バラしながら確認してみましょう。

ちなみに、5行目のclassの後ろがSampleScript以外になっている方がいるかもしれません。その理由と対処方法については、記事後半で説明します。

スクリプトの意味

using ~

1~3行目の部分です。

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

using ~は、現時点ではひとまず使いたい機能を呼び出すための記述と捉えておけばよいでしょう。

C#では、ライブラリーというよくつかわれる機能をひとまとめにしたものが用意されています。using ~は、このライブラリーを呼び出すキーワードです。

ここで一つ注意事項があります。ライブラリーはプログラムの一番最初に読み込む必要がある* ということを覚えておいてください。

呼び出す前に記載すればよいのではなく「すべての要素の前に記述する」というルールになっています。

using ~は、具体的にどのような役割をしているでしょうか。ためしにusing ~の3行を消してみましょう。

ゆにすち(using ~ の3行を削除しました) using 文を削除

MonoBehaviorに波線が引かれ、エラーが発生しました。カーソルを合わせて少し待つと、エラーの詳細が表示されます。

ゆにすち(波線部のエラー詳細が表示されます) エラー詳細

MonoBehaviorが見つからない、とあります。実はこのMonoBehaviorは、先ほど消してしまったusing UnityEngine;の1文によって使えるようになっていたのです。そうならないためにも、このプログラムでは「XXというライブラリーを使いますよ~」とあらかじめ宣言しておく、というわけです。

消してしまった3行は、Ctrl + Zで元に戻しておきましょう。

public class ~ {}

5行目から、続く中カッコ({})で括られた範囲についてです。

public class SampleScript: MonoBehavior
{
  ~
}

この部分はクラスという、処理のカタマリです。正確にはpublic: MonoBehaviorを除いた、次の部分がクラスの記述です。

class [クラス名]
{
  ~
}

このカタマリの中に、どのように動かしたいかを書いていくことになります。 クラスはプログラムの基本単位と考えてよいでしょう。

ではpublic: MonoBehaviorはどのような役割を持っているのでしょうか。

まずpublicですが、これはアクセス修飾子と呼ばれるものの一つです。

プログラムでは、このクラス* が他のどのコードから確認できるか、という参照範囲を決める必要があります。例えば、ゲームのセーブデータをだれでも不正にいじることができてしまったら困りますよね?この参照範囲をスコープと呼びます。アクセス修飾子によって、スコープを決めることができるというわけです。

publicがつくと、どこからでも参照できるようになります。

Unityと「スクリプトファイル」は別々のプログラムなので、認識できるようにpublicがついているというわけです。

クラスだけでなく、メソッドやフィールド(解説はいずれ)などにも付与できます。

次に: MonoBehaviorです。クラス名の後にコロン(:)がついている場合、他のクラスを継承していることを示します。継承というのは、と或るクラスの性質を引き継ぐという意味です。

つまり、「MonoBehavior」という親クラスがあって*、その機能を今回作成した「SampleScript」という子クラスでも使用できるよ、という意味になります。

Unityが用意してくれています。

// ~

7行目と13行目のスラッシュ(/)2つです。

コメントという「メモ書き」で、プログラムには一切影響しません。記述したコードの意味などを忘れないよう残しておくことができます。コメントには日本語も使用できます。

コメントには2つの記述方法が用意されています。

// 1行コメント。改行するまでコメントとして扱われます /* 複数行コメント
   改行しても、コメントとして扱われます。
   コメントを終了するには → */

余談になりますが、記述されたコードを一時的にコメントとして無効化することをコメントアウトと呼びます。

void Start() {}

8行目から、続く中カッコ({})で括られた範囲の部分です。

void Start()
{
  ~
}

スクリプトには、メソッドという「何かの処理をさせるコードブロック」があります。メソッドについては改めて機会を設けて説明しますが、Start()もメソッドです。

Unityにおいて、このStart()メソッドは別な意味を持っています。

Start()メソッドの{}中に書かれた処理は、クラスが呼ばれた瞬間、自動的に1回だけ実行される* という特徴を持っています。

正確には「最初の1フレーム目に1回だけ」です。

シーンが始まった瞬間の初期化など使います。

void Update() {}

14行目から、続く中カッコ({})で括られた範囲です。

void Update()
{
  ~
}

こちらもStart()メソッド同様に、特別な意味があります。

Update()メソッドは、フレームが更新される度に実行される* メソッドです。

正確にはStart()メソッドが呼び出された次のフレームから毎回呼ばれます。

オブジェクトの姿勢など連続的に変化をもたらす処理に使用します。

ファイル名とクラス名の一致

スクリプトを正しく動かすには、

ファイル名とクラス名が完全に一致*

している必要があります。

1つのファイル内に複数クラスが存在する場合は、「MonoBehavior」を継承しているクラス名を指します。

スクリプトファイルを作成した時に確定したファイル名が、そのままクラス名として自動生成されます。前述したとおり、ファイル名を一度「NewBehaviorScript」で確定してしまったり、ファイル名を変更した場合、クラス名は自動修正されないため、不一致となって正常に動作しなくります。

ファイル名とクラス名を一致させておきましょう。

まとめ

今回は、Unityでオブジェクトを動かすのに欠かせないスクリプトについて、作成方法と自動生成される中身をのぞいてみました。数十行ですが、ライブラリー参照、スコープ、クラス、継承、メソッドなど、いろいろな要素が組み合わせって表現されていることが確認できました。

次回予告

Next time on... スクリプトをオブジェクトにアタッチ!

今回作成したスクリプトに少し手を加えて、動作するかやってみましょう。
では、今回はこの辺で。

コメント