簡単にインスタンスの生成の仕方
はじめに
はじめまして、コーディング課の一回生のHiroakiです!!
入部してからもう7ヵ月経過して、そろそろプロジェクトが大きくなってきてる人がいるのではないでしょうか?それにつれてスクリプトのアタッチする数が多くなって大変になっている人がいると思います。今回はそんな人向けに記事を書いていこうと思います。
どうすればいいの?
スクリプトをアタッチするにはMonoBehaviourを継承しなければなりません、逆説的に言えば、MonoBehaviourを継承しなければアタッチする必要がないということです。しかし、どうやって、MonoBehaviourを継承していないクラスをアタッチしてもないのに使うことができるのでしょうか?
MonoBehaviour継承クラスが継承していないクラスのインスタンスを所持し、使えばいいのです。
具体的なやり方
まずはコードを見てもらって、それについて解説していこうと思います。
using UnityEngine;
public class Test
{
private string _text;
public Test(string text)
{
_text = text;
}
public void Print()
{
Debug.Log(_text);
}
}using UnityEngine;
public class MonoTest : MonoBehaviour
{
[SerializeField] private string _text;
private Test _test;
void Start()
{
_test = new Test(_text);
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
_test.Print();
}
}
}まずはTestクラスから見ていこうと思います。
見ての通り、このクラスはmonoBehviourを継承していません。なので、これをインスタンス化する必要があります。インスタンス化を行うときにコンストラクタというものが必要になります。
public Test(string text)
{
_text = text;
}これがコンストラクタです。文法としては、
public クラス名(引数){ 処理 }
となります。これはインスタンス化を行ったときに自動的に呼ばれます。
これでTestクラスの解説は終わりにして、MonoTestクラスの解説に移ろうと思います。
private Test _test;
これはTestという型の_testという名前の変数名を宣言しています。(型がクラスのときはインスタンス名といったりする。)
これにはまだ中身がないので入れてあげなければなりません。(これがインスタンス化です)
それがStartの中にある
_test = new Test(_text);
これで中身を作ってあげます。
文法としては
インスタンスを入れる変数(今回はTest型の_test) = new 生成するインスタンスのクラス名(コンストラクタで要求されている引数);
今回はTestクラスがコンストラクタでstringを求めているため、_textを引数に入れてあげています。
次に、どうやってメソッドを使うのかですが、普段はメソッド名(引数);という風に使ってる思うのですが、他のクラスのメソッドを使うには誰のメソッドか教えてあげる必要があります。
_test.Print();
今回は_testというインスタンスのPrint()を使うと教えてあげています。
以上がMonoBehaviour継承クラスが継承していないクラスでインスタンスを所持し、使う方法です。
終わりに
いかがだったでしょうか?
C#の勉強を始めると、インスタンス化について学ぶことになると思いますが、Unityから始めるとMonoBehaviour継承クラスはインスタンス化を出来ない関係から、存在さえ知らないということが起こり得てしまうと思います。規模がでかくなるとあまりにもインスペクターにアタッチする作業が大変になり、アタッチ忘れによりnull参照エラーが頻発してしまうと思います。そのような事態になったら、MonoBehaviourを継承していないクラスを使ってみたらいかがでしょうか?

