【Unity入門】プログラムを書いてみよう【C#基本】

今回はプログラムを書いてみましょう。最初は難しいプログラムを書く必要はないので安心してください。プログラムが書けるようになるとゲームの幅が広がりますよ。

この記事は本のように順を追って解説しています。この記事は途中のページになります。この記事を見ていて、現在の状況がわからない場合や忘れてしまった事などが出てきたら↓のリンクから目次ページへ飛べますので立ち戻って見てください。

<Visual Studioを導入しよう>

まずはプログラムを書くための準備をしましょう。VisualStudioをダウンロードしてください。これはプログラムを書きやすくするためのツールです。

こちらのページを開いてください。VisualStudioのホームページです。すでにインストールが完了している方は飛ばしていただいて大丈夫です。

(何か強いこだわり等がある人もVisualStudioの使用をオススメします。別に好きなエディタ使っても構わないのですがブレークポイントを張れないと思うので)

visual studio

Visual Studio IDEのCommunity 20XXをダウンロードしてください
画像はMacのですが、Windowsも大して変わらないかと思います。

install visual studio

続行を押してください。

install

インストールでOKです。

インストールが完了したらUnityを開きます。

preferences

上部メニューからUnity>Preferencesを選択してください

external script editor

左側のExteranalToolsを選択して、ExternalScriptEditorでVisualStudioを選択します。
これで設定はOKです。

<プログラムを作ってみよう>

設定が完了したらUnity側のプロジェクトウィンドウで右クリック>Create>C# Scriptというのをクリックします。

見てわかると思いますが、Unityでプログラムを組む際はC#というコンピュータ言語を使用します。

(JavaScriptは廃止になりました)

create script

名前は適当でOKです。

コンピュータ言語というのはコンピュータにもわかるような言葉です。

プログラムはコンピュータに「こうしてくれ」という言葉を伝える事で動きます。コンピュータに「ああしてくれ、こうしてくれ」という事でゲームが動いていくわけですね。また、プログラムを書いたファイルの事をスクリプトと言います。

<初期状態のプログラムの中身>

作成したファイルをダブルクリックするとVisualStudioが立ち上がって↓のような画面になるかと思います。いきなりなんやらかんやら書いてあって面食らってしまうかもしれませんが、落ち着いて見れば大丈夫です。とりあえず、上から順に何が書いてあるのかを見てみましょう。

new script

using

まず、上のusing ○○ と書いてあるところを見てみましょう。

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

この2つは「C#」があらかじめ用意した機能を使用しますよ。という意味です。

using UnityEngine;

これは「Unity」があらかじめ用意した機能を使用しますよ。という意味です。

なんか色が違うのは機能が使用されていると黒くなり、使われていないと灰色になります。
まだプログラムのファイルを作ったばかりですが、この状態で既にUnityの機能が使われていることがわかります。

class

次に

public class ○○○ : MonoBehaviour

となっているところを見てみましょう。classの後は自分がつけたファイル名になっているかと思います。

C#はオブジェクト指向型のプログラミング言語です。

オブジェクト指向っていうとすごく難しい感じがしますし、ググってもわけわからない説明が多々でてきます。いろんな例え方がされていますが、自分は「設計図」と「実体」という風に例えてみたいと思います。

設計図というのはただの紙であって、それを元に組み立てる事で実体になります。オブジェクト指向もそういう物だと思ってもらえればいいかなと思います。VisualStudioで今見ているものは設計図です。

厳密にいうと違う部分が出てきますが、わかりやすく例えるためこう言っています。

オブジェクト指向を「設計図」と「実体」と例えた時、class ○○○というのは、「これは○○○という名前の設計図ですよ」という意味になります。

継承

class ○○○の後に : で区切って後ろに書いてあるやつを継承と言います。

今回の場合は「MonoBehaviour」ですね。

これはMonoBehaviourという名前の設計図が既に存在し、「その設計図を元にしますよ」という意味になります。継承を行うと元となった設計図に書いてある機能が使えます。

よくわからないと思いますが、継承によって始めから色々な機能が使えると思っていただいて大丈夫です。

public

publicというのは「公的な」という意味がありますが、プログラムでは公開と言った方が近いかもしれません。

通常スクリプトを書く際にこのpublicの部分に何も書いていないと公開していないものとして扱われます。

公開って何?って話ですが、公開していないと「このファイルのみからしかアクセスできない」という意味になります。

公開とかアクセスとかいうと、怪しく感じたりセキュリティの心配が出てきそうですが、全く関係ないので大丈夫です。例えばあるスクリプトから別のスクリプトへアクセスしたい際などは公開してないとアクセスできません。

Unityの場合ネットの向こう側に公開するという意味ではなく、開発している内部の中で公開するという形になります。公開していないと別のファイルからアクセスできないので必要があればpublicとつける必要があります。

今回の場合は何故勝手に公開されているかというと、MonoBehaviourを継承しているからです。こいつはUnity側からアクセスされる事を想定されている為、公開していないと動きません。このMoboBehaviourという設計図を元にしている以上、publicにしないとエラーになります。

よくわからない方は、外からアクセスしてもらう為にpublicにしているんだと思ってください。

範囲

public class ○○ : MonoBehaviour
{
    〜〜〜中身〜〜〜〜
}

こうなっているかと思いますが、C#では{ }でくくって範囲を表します。この場合だと一番下の「}」までが○○という設計図の中身ですよという意味になります。

<関数について>

次は中身について解説していきます。

script

classを設計図と例えるなら、↑が設計図の中身になります。

コメント

// ○○○○と書かれているのはコメントと呼ばれるもので、プログラム上特に意味を成しません

書いたプログラムを後から見てわかりやすいように(もしくは他人が見てわかりやすいように)一言メモ的な物を残しておく感じです。

//と書いた後の行は全てコメントとして扱われます。

複数の行をコメントにしたい場合は
/*
 〜この中は全部コメントになる〜
*/
でコメントにできます。

関数(メソッド)

次に

void Start()
{
}
void Update()
{
}

と書かれています。これは関数(メソッド)と呼ばれるもので、設計図に書かれた一個一個の機能と考えてもらうといいかなと思います。ただし、この2つはMonoBehaviourを継承している為、特別な機能を持ちます。

まず2つともについている「void」というものは何も返さないという意味です。

関数には呼び出し元というのが必ずいて、何かから呼び出されて中の機能を発揮します。このStartとUpdateという関数は特別な関数な為、Unity側から呼ばれます。

voidと書かれているので「Unity側に何も返しません。」という意味になります。何も返さないので今は深く考えなくても大丈夫です。

また特別なこの2つの関数は

・Startはこの設計図がゲーム内で実体化+有効の両方を満たす時Unity側から1回だけ呼ばれます。

・Updateは有効な時にゲーム中毎フレームUnity側から呼ばれます。

フレームが何かというのは↓の記事で解説していますので、興味がある方は見てみてください。

よくわからない方は、これらは設計図に書かれた1個1個の機能という事がなんとなくわかっていただければ大丈夫です。

Point

・プログラムを作成すると最初からUnityが色々用意してくれているよ!
・classは例えると設計図だよ!
・{ }で範囲を指定するよ!
・設計図の中に1つ1つの機能を書いていくよ。これを関数(メソッド)と呼ぶよ!
・//や/**/でコメントにできるよ。この部分はプログラムとは関係なくなるよ!

<プログラムを動かしてみる>

プログラムをアタッチする

ごちゃごちゃ言っててもイメージがつかないと思うのでとりあえずやってみましょうか。

今回も適当にCubeを作りたいと思います。作り方がわからない方は↓の記事を参考にしてみてください。

とりあえず、Cubeを作成しました。

Object Cube

次に先ほど作ったスクリプトをこのゲームオブジェクトにアタッチします。

ヒエラルキーウィンドウでCubeを選択した状態で、インスペクターウィンドウを見て、AddComponentの所に先ほど作ったスクリプトをドラッグ&ドロップする事でアタッチできます。

attach script

さて、アタッチした事によりこの設計図は実体化しました。実体化したものをインスタンスと言います。

このように設計図を実体化させることで使えるようになります。

文字を表示させてみよう

では、スクリプトの方に戻ってStartの所に

debug log

と打ってみてください。

Debug.Log(“”);の部分は半角でお願いします。全角でプログラムはかけないです。

Debug.LogというのはUnityの機能で「Consoleウィンドウに文字を出すよ」という意味です。

コンソールと読みます。名前がConsoleになっているウィンドウを探してみてください。「文字」であるとプログラムに認識されているところは全角でも問題ありません。

Debug.Logはコンソールウィンドウに( )の中身を文字として出します。“ ”(ダブルクォーテーション)「この中は文字ですよ」という意味です。

最後に「 ; 」(セミコロン)を書くのを忘れずに。

セミコロン「ここで1つの命令が終わりますよ。」という意味です。

↑のようにプログラムに対して「こうしてくれ」というのを命令と言います。命令はここで終わりという事をコンピュータに教えてあげないとコンピュータはわからないので、こうしてあげる必要があります。

あと、一番困るのが、全角のスペースをどこかに入れてしまった時です。明示的にこれは文字ですとした場所以外(” ”の中や、コメントの中等)で全角のスペースを押してしまった場合エラーになってしまうので気をつけましょう。スペースは何も表示されないので見つけづらいです。

プログラムを保存する

ここまで書けたら

save

ファイル>保存でセーブできます。プログラムを実行する際には保存しないと反映されないので注意してください。

ショートカットキーのCtrl + SもしくはCommand + Sでも保存できます。
ショートカットキーは便利なので覚えておいた方がいいかもしれません。

プログラムを実行する

保存ができたら再生ボタンを押してみてください。

console

コンソールウィンドウに先ほどDebug.Logの中に入れた文字が出てくるかと思います。

先ほどCubeに作ったスクリプトをアタッチしたので、スクリプト自体はインスタンス化(実体化)しているのですが、ゲームを再生すると1回リセットされてもう一回インスタンス化されます。

StartがUnityから呼ばれる条件が「このスクリプト(設計図)がゲーム内でインスタンス化(実体化)+有効の両方を満たす時」なので

ゲーム再生→スクリプトが有効かつインスタンス化した→Startが呼ばれる→Startの中に書いたDebug.Logが実行される→Consoleに「ああああ」と表示される

という流れになります。

このConsoleウィンドウ(コンソールウィンドウ)には「ログ」と言われるコンピュータからのメッセージが流れてきます。

ちなみにUpdateの中にDebug.Logを書くと楽しい事になるのでやってみたければやってみてください。再生ボタンをもう一回押せば停止します。

まぁ、なんかよくわからんという人は↓のポイントを抑えていただければOKです。

Point

・ゲームオブジェクトにプログラムをアタッチする事で実体化できるよ!
・実体化したやつの事をインスタンスと呼ぶよ!
・プログラムは保存しないと反映されないよ!
・Debug.Log( )はコンソールウィンドウに文字を表示してくれるよ!
・” ”はプログラムに「これは文字ですよ」と教えているよ!
・プログラムは半角で書いてね。全角が使えるのは文字の部分だけだよ!
・プログラム中に全角のスペースが入らないよう気をつけてね!
・命令の終わりには必ず;をつける必要があるよ!

覚える事多いですが、言っていることは簡単ですので使っているうちに慣れていけば大丈夫かなと思います。

<ゲームオブジェクトを動かしてみよう>

さて、文字を出すだけでは面白くないので今度はゲームオブジェクトを動かしてみましょう。

transform position

Updateの所に

transform.position += Vector3.right;

と打ってみてください。

このtransformってどこから来たの?って話なんですが、コンポーネントの時の話を思い出してみてください。Transformというコンポーネントがついていたかと思います。

cube global x

↑これですね。これのPositionを足し算します。という意味です。Positionはこのゲームオブジェクトの位置を表します。

このtransformというのもまた特別なやつで、普通まずはインスタンスを探してアクセス(実体を探してアクセス)しないといけないのですが、MonoBehaviourを継承しているおかげで自動で探してきてアクセス可能な状態にしてくれています。

Vector3.rightというのは(1,0,0)です。つまり、transform.position += Vector3.right;というのはx座標に1だけ足し算しますよという意味になります。+=ってなんじゃいって話ですが、これは次回解説したいと思います。

これをUpdateの中に書いているので、「毎フレームCubeのX座標を1プラスしますよ」という意味になります。この状態で再生すると

move

結構な速さで右側に移動していったと思います。それだけ1フレームというのが速いという事ですね。

こんな感じでいろんなものを動かしたり、いろんなものを制御したりできるので簡単なプログラムだけでも覚えておくとできることが増えていくのでいいと思います。

アクティブ非アクティブ

MonoBehaviourを継承している場合、有効かどうかというのはインスペクターウィンドウでチェックがついているかどうかになります。

object active inactive

↑の赤丸はゲームオブジェクト自体が有効かどうかで、下の赤丸はコンポーネントが有効かどうかです。スクリプトをゲームオブジェクトにアタッチするとコンポーネントになります。

チェックがついていると有効で、ついてないと無効です。この有効な状態をアクティブ、無効の状態を非アクティブと言います。

無効な状態にしているとその機能は動きません。

ちなみに、チェックする場所がないコンポーネントもいます。これはそれ単体では動かず、何かから呼ばれないと動かないものです。有効か無効かではなく、呼ばれるか呼ばれないかですので、自分がプログラムで意図的に呼ばないと動かないものになります。


さて、とりあえずプログラムを始める上で基本的な事を解説していきました。よくわからんよって人もいるかもしれませんが、使っていくうちに慣れていけばOKです。なんとなーく理解してください。

<わからない事があったら>

このサイトの説明ではよくわからなかったとか、もっと知りたい事などがあれば、また別の勉強方法があるので違った切り口を使ってみるのもいいと思います。

<オススメの本>

本で詳しい解説がされているので書籍を買ってみるというのも手の一つです。最近はKindle版があるので届くまで待つ事もなく場所も取らないのでとても良いです。

<オンラインスクール>

オンラインスクールでは人に質問する事ができるので、行き詰まってしまった方にオススメです。 無料体験もあるので試しに見てみるのも手ですよ




長くなってしまいましたが、今回はまだ、さわりの中のさわりしかしていないので次回もうちょっと詳しくプログラムについて解説していきたいと思います。




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