だらだら〜自由自在〜

インディーゲーム制作チーム GAME GABURI でプログラム担当してます

雨天だ

東海地方は豪雨ですか?会社なんかに行かなくてよかった。

MemoryLeake

System系のスクリプトを集約させるオブジェクト、SystemObjectというのがあり。そのオブジェクトには

  • MainSystem

というMonoBehaviour継承のスクリプトをアタッチしてある。このMainSystemに他のSystemスクリプト(Scriptable継承)を保持させ、MainSystem自身のUpdateなどで更新処理を行わせている。
このあたりは先日決めたとおり、ひとつのBehaviour継承スクリプトと複数のScriptable継承スクリプトでGameObjectを構成させるため。元はBehaviour継承スクリプトの塊だったSystemObjectに修正を加えた結果だ。
この修正を行うことでMemoryLeakが起きることとなった、何がLeakするようになったかと言うと。Scriptable継承スクリプト達がLeakを起こすようになった。Leakを起こすようになると、UnityEditor上でCtrl+SでSaveをするときに出力ウィンドウにLeakをした旨とLeakしているスクリプトが表示される。
俺は以下のように修正をした。これでUnity側で適切なタイミングで解放をやってくれるらしい

class MainSystem : MonoBehaviour {
~~~
	[SerializeField]
	private BulletSystem	_bulletSystem = new BulletSystem();	// ←こいつがLeakする
~~~
}

class MainSystem : MonoBehaviour {
~~~
	[SerializeField]
	private BulletSystem	_bulletSystem = null;
~~~
	void Awake()
	{
		_bulletSystem = ( BulletSystem )ScriptableObject.CreateInstance( "BulletSystem" );
	}
}

追記。↑は間違いだった。コレだとどうやらシリアライズが出来ないみたい。インスペクタ上ではシリアライズ(メンバ変数の値保存)ができてるように見えるのに、実行時には初期値になってしまう。なのでこうする。

class MainSystem : MonoBehaviour {
~~~
	[SerializeField]
	private BulletSystem	_bulletSystem = ( BulletSystem )ScriptableObject.CreateInstance( "BulletSystem" );
~~~
}

ScriptableObjectスクリプト

MonoBehaviour継承でなければインスペクタ上から編集できないかと思ったが、違った(ScriptableObject継承スクリプトはComponent継承でないためGameObjectにアタッチ出来ない)
MonoBehaviour継承スクリプトのPublicメンバ(PrivateでもSerializeField指定で可)にすると、普通にインスペクタ上に出てくる。でもメンバまでは見えないので一見メンバが編集不可に思える。が、インスペクタ上のScriptableObject継承スクリプトをダブルクリックする。するとインスペクタが切り割りメンバも編集可能になる。

Document

ローカルにスクリプトリファレンスがあるのを発見

C:\Program Files (x86)\Unity\Editor\Data\Documentation\Documentation.html

疑問

GameObject間の実行順序(Updateを呼ぶ順番)が知りたいかも。あとUpdateとFixedUpdateの違いを知らない。あとOnDisableとOnEnableはいついつ呼ばれるのか。

ライン移動できた

線形移動だけど。

Bulletも

Scriptable化した。