AutoPuppetを作っているときにAddComponentをしている部分があるのですが、AddComponentをしたScriptとAddComponentで加えたScriptのライフサイクルを少し勘違いしていて、ハマったので備忘録がてらにまとめておきます。
現象
public class Main : MonoBehaviour { void Awake () { gameObject.AddComponent<Foo>(); } void FixedUpdate () { // 何かの処理 } void Update () { // 何かの処理 } } public class Foo : MonoBehaviour { void Awake () { // 何かの処理 } void Start () { // 何かの処理 } }
勘違いしていたところ
- Main.Awake()
- Sub.Awake()
- Foo.Start()
- Main.FixedUpdate()
- Main.Update()
だと思っていたのですが、実際は
- Main.Awake()
- Sub.Awake()
- Main.FixedUpdate()
- Foo.Start()
- Main.Update()
FxiedUpdateの方が他のScriptのStartよりも早く呼ばれることに気づいていませんでした。これのせいでバグが発生してしまいました。
ライフサイクルまだ理解しきれていなかった (涙)
対処法
Foo.Start()をFoo.Awake()にする
これでFixedUpdateより前にFooで準備するメソッドを実行できます。
Foo.Start()を廃止してInitializeメソッドみたいなのを作って、それを実行する
MainでAddComponentした直後にFoo.Initialize()を実行する
MainのFixedUpdateはStartから1フレーム後に実行されるようにする
苦肉の策ですね 笑
感想
そもそもAddComponentをしていた理由はパペットごとに付けるScriptが多いので、手動でつけるは面倒だったので、ソースコードに直接AddComponentを記述する自動化処理をしていましたが、それがちょっとあだになってしまいました!
AddComponentは便利ですが、自分の知識不足があだになってしまいましたので備忘録として残しておきます!