# realvirtualBehavior Lifetime Methods

When you inherit from **realvirtualBehavior** in your scripts, the **realvirtualController** automatically invokes several core lifecycle methods at key moments. This mechanism ensures a consistent flow for starting, stopping, and updating your simulation logic.

***

### Overview of Methods

1. **AwakeAlsoDeactivated()**
   * Called by **realvirtualController** in its own `Awake()` method.
   * Runs even if the `realvirtualBehavior` component (or its GameObject) is not active.
   * Ideal for any early setup logic that normally would run in `Awake()`, but needs to occur even if disabled.
2. **PreStartSim()**
   * Called once **realvirtualController** is ready to start the simulation.
   * Use this to finalize any pre-simulation configuration, such as resetting positions or clearing caches.
3. **StartSim()**
   * Immediately after **PreStartSim()**.
   * Begin your runtime logic here—start animations, open connections, spawn objects, etc.
4. **StopSim()**
   * Called when the simulation is being paused or stopped (for instance, via the pause button).
   * Ideal for halting coroutines, stopping movements, and closing any active connections.

***

### Typical Flow

1. **realvirtualController.Awake()**
   * Calls `AwakeAlsoDeactivated()` on every `realvirtualBehavior`.
2. **realvirtualController.Start()**
   * Eventually calls `StartSim()` (after running `PreStartSim()`).
3. **realvirtualController.Pause() / StopSim()**
   * Invokes `StopSim()` on every `realvirtualBehavior`.

Here’s a simplified timeline:

```
Unity Loads Scene
└──> realvirtualController: Awake()
     ├──> Calls AwakeAlsoDeactivated() on all realvirtualBehavior scripts
     └──> Additional Initialization Steps

Later, realvirtualController: Start()
├──> PreStartSim() on all realvirtualBehavior
└──> StartSim() on all realvirtualBehavior

When Pausing or Stopping:
└──> StopSim() on all realvirtualBehavior
```

***

### Example Script

Below is an example of how you might extend `realvirtualBehavior` to respond to these calls:

```csharp
using UnityEngine;

namespace realvirtual
{
    // Inherit from realvirtualBehavior
    public class MyMachine : realvirtualBehavior
    {
        // Called by the controller in Awake(), even if 'MyMachine' is not active
        public override void AwakeAlsoDeactivated()
        {
            base.AwakeAlsoDeactivated();
            Debug.Log("MyMachine: AwakeAlsoDeactivated - Basic setup done.");
        }

        // Called just before the simulation actually starts
        public override void PreStartSim()
        {
            Debug.Log("MyMachine: PreStartSim - Final checks before sim begins.");
        }

        // Called immediately after PreStartSim
        public override void StartSim()
        {
            Debug.Log("MyMachine: StartSim - Simulation logic begins.");
        }

        // Called when the simulation is being paused or stopped
        public override void StopSim()
        {
            Debug.Log("MyMachine: StopSim - Cleaning up and halting movements.");
        }
    }
}
```

***

### When to Use These Methods

* **AwakeAlsoDeactivated()**
  * Use for setting references or configuration that must exist **regardless** of the GameObject’s active state.
  * Useful for bridging dependencies or preparing data needed by other scripts.
* **PreStartSim()**
  * Use for last-minute preparation just before the simulation becomes “live.”
  * E.g., ensuring internal caches or object pools are ready, resetting the environment, etc.
* **StartSim()**
  * Your “go” signal for the main logic—starting animations, enabling physics-based behaviors, or beginning timers.
* **StopSim()**
  * Graceful shutdown: stopping animations, saving states, cleaning up.
  * Called when the user pauses, or the simulation is otherwise halted by **realvirtualController**.

***

### Debugging with DebugMode

By enabling **DebugMode** on the **realvirtualController**, you will see logs in the Unity console showing precisely when each of these methods is invoked. This is an excellent way to confirm:

* Whether your scripts are receiving these calls in the expected order.
* If certain scripts remain disabled and thus never receive the calls.

###


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://doc.realvirtual.io/advanced-topics/for-developers/realvirtualbehavior-lifetime-methods.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
