雨天だ
東海地方は豪雨ですか?会社なんかに行かなくてよかった。
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化した。