ちょっとした失敗談

使用したソフト

unity2018.13.f

こんにちは〜

タイトル決めに悩んだ結果こうなったと言う、かなり分かりづらいタイトルですが・・・汗

つい先日、C#にもコンストラクタが存在していることを知りまして、それを使えば少し変わったことが出来るのでは?と思ったので、それの日記です。

まずコンストラクタって何?と言うことですが、

コンストラクタ(構築子、英: Constructor)は、オブジェクト指向のプログラミング言語で新たなオブジェクトを生成する際に呼び出されて内容の初期化などを行なう関数、メソッドのことである。対義語はデストラクタ。

Wikipediaより)

・・・要はそのclassがnewされた時に呼び出されるものです!(多分。少なくとも自分はそう解釈している)

public class Sample : MonoBehaviour {

	public Sample(){ //これがコンストラクタ
	}

}

まぁ書き方としてはこんな感じで、普段のvoidの位置がclass名になるんですね。

これで自分は何をしたかったのかと言いますと、Gameobjectではなく、classを生成して操作出来るのでは?という挑戦です。

 

まずはCubeの主となるclassの作成です。ファイル名はCube.csとしておきますね。

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

public class Cube : MonoBehaviour {
	[SerializeField]
	private GameObject cube; //実際に生成するオブジェクト

	public Cube(Vector3 InstancePlace){
		cube = Instantiate(cube, InstancePlace, Quaternion.identity); //Cubeを生成
	}

	void Start () {}
	void Update () {} //今は使わないけどとりあえず書いておく
}

とりあえずコードはこれだけです。後はInspector上に表示されているcubeに、prefab化しておいたCubeオブジェクトを入れたら、完成です。

次にこのコード(オブジェクト)を生成するコードを書いていきましょう。

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

public class Main : MonoBehaviour {
	
	Cube cube;
	
	// Use this for initialization
	void Start () {
		cube = new Cube(new Vector3(0, 0, 0)); //Cubeクラスの生成
	}
}

これをMain Camera等にアタッチさせて、準備完了です。

これでスタート時にCube classがnewされてゲームオブジェクトを生成出来るのでは?と思い実行してみました。

結果は、何も起きませんでした。

何がおかしいのだろうと考えていたところ、CubeファイルのInspecter上に、

「Default references will only be applied in edit mode.」

と書かれているんですよね。

ちゃんとした意味はあまり理解していないのですが、恐らくここで入れても何も起きないのでは?と言う結論に。。。

と言うことで次はコード上で先に代入してみようかと。

少し調べてみると、どうやらPrefab上のオブジェクトを取得するにはResourcesを使えば良いのだとか。

それで書き換えたコードがこちら

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

public class Cube : MonoBehaviour {
	[SerializeField]
	private GameObject cube = Resources.Load("Cube") as GameObject; //書き換え部分

	public Cube(Vector3 InstancePlace){
		cube = Instantiate(cube, InstancePlace, Quaternion.identity); 
	}

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

あ、ちなみに取得するオブジェクトはAssets/Resourcesフォルダに入れないといけないらしいので、Prefab化したオブジェクトはそちらへ移動させました。

これでcubeにはPrefabしたCubeオブジェクトが入るので、生成されるのでは?

結果は生成できませんでした。

何がいけないのか。

コンソールにwarningエラーが出ていたので、それを見てみると、

You are trying to create a MonoBehaviour using the 'new' keyword. This is not allowed. MonoBehaviours can only be added using AddComponent(). Alternatively, your script can inherit from ScriptableObject or no base class at all

と。

要するに、MonoBehaviourを継承したclassはnewで生成できないようです。。。

つまり、MonoBehaviorを継承しなければ使えるのでは?

ただその代わりStart関数やUpdate関数などが呼び出されなくなってしまうという、そうなると生成できてもこの先で詰むことになるんですよね。

仕方ないので今回はここで断念です。。。

今度MonoBehaviorを一切使わないコードでも作りましょうか。。。(笑)

それでは、またいつか〜( ´ ▽ ` )ノ

 

(2018/6/17 追記:)

MonoBehaviorを継承せずに実行したらInstantiateに成功しました。

Startとかその辺使わなければこの方法も使えるかも?





↓もしこの記事が参考になったら、下のいいねボタンを押していただけると非常に助かります!(ログイン不要)↓

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です