To reproduce:
  • Create a behaviour with ExecutionOrder -100000
  • Create a child of it with another behaviour with no execution order overrides
  • Create a behaviour with ExecutionOrder -100000 and
    child objects as a control
  • Create a new separate behaviour with ExecutionOrder +100000
  • Add a log to Start() to keep track of it
Expected result:
  • Behaviours with -100000 to log first
  • Behaviours with no override to log second
  • Behaviours with +100000 to log third
What actually happens:
  • Behaviours with -100000 and
    children log first
  • Behaviours with no override log second
  • Behaviours with +100000 log third
  • Behaviours with -100000
    children log fourth
This also creates another large issue
If you also try to disable those -100000 objects (with Default children) via the +100000 Start() method - the -100000 behaviour will enter a broken state where it will never initialize or receive any events no matter what.
You can toggle them on and off after - no methods will ever fire
I have created a test world that illustrates the above:
Checking the logs when loading in - you'll see a bunch of objects logging OnEnable (the ones that report
withChild False
), and a bunch of Default objects which are children of other -100000 objects.
Then they will all get disabled by the +100000 behaviour.
Clicking the sphere enables those -100000 parents, but they never log either Start() or OnEnable