FYI, I just used a START to hook instead of Update in a game and it worked.
Code:
// RVA: 0x123456 Offset: 0x123456 VA: 0x123456
private void Start() { }
Can't hurt to try if you have a START. Good luck
WE do not need to call START. START only execute one frame. It is not part of the frame loop. If Start has a heavy workload (like loading assets, initializing objects, or performing expensive calculations), it can
delay the first frame, making the FPS lower for that frame. It's only being called one per frame. It is a bad way to hook it, it's only useful if you have a specific goals such as debugging or logging before it becomes active OR prevent "specific" components from initializing. Reasons not to use Start is Start() only runs
once when the script initializes. If you need repeated control, it’s better to hook methods like Update() or other event-based functions. If multiple scripts depend on Start(), changing behavior in one can cause
unexpected side effects in others, which will be very hard to debug. Neither with Awake, it initializes first before Start() can be executed. Overall, your choices are LateUpdate or Update in total. FixedUpdate is okay, it does not have a frames per second to execute, as it is only for Unity's "Physics". FixedUpdate()
does not have a fixed FPS because it runs based on a
fixed time step, not per frame. It is mainly used for
physics calculations because Unity’s physics engine (PhysX) runs in sync with FixedUpdate(). FixedUpdate() is a
Unity lifecycle method that is called at
a fixed time interval, independent of the
frame rate (FPS). It is primarily used for
physics-related updates such as Rigidbody movement and force calculations. Yes, FixedUpdate would work, but you will only get bugged Hooking and other methods that will not execute as properly as intended.
Your only options are using Update or LateUpdate, or find a update class and create a function within FindObjectsOfType/FindObjectOfType to get the instance of the class you want to modify and hook it from there.