> For the complete documentation index, see [llms.txt](https://infinitypbr.gitbook.io/magic-pig-games/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://infinitypbr.gitbook.io/magic-pig-games/magic-time-local-time-scale/local-time-scale.md).

# Local Time Scale

## Creating and Using `LocalTimeScale`

The `LocalTimeScale` class is the thing that helps objects determine their final `TimeScale` value. There are three main ways you'll utilize Local Time Scale objects.

### 1️⃣ Create a Local Time Scale Scriptable Object

Right click in your project and select `Create/Magic Time/Time Scale` to create a new Scriptable Object.

<figure><img src="/files/3znF08nzprwpDuWj4QV1" alt=""><figcaption><p>A "Global" <code>LocalTimeScale</code> can be used to handle game-wide time scaling, including pausing.</p></figcaption></figure>

Often the pre-created objects will populate the [**Magic Time Manager**](/magic-pig-games/magic-time-local-time-scale/magic-time-manager.md) and [**Magic Time User**](/magic-pig-games/magic-time-local-time-scale/magic-time-user.md) lists of "Initial Time Scales".&#x20;

{% hint style="success" %}
With this pattern, all objects will be accessing the same runtime instance of these `LocalTimeScale` objects. Use this for "Global" scales, as well as time scales that are meant to effect specific types of objects, such as "Enemies" or "Projectiles".
{% endhint %}

### 2️⃣ Magic Time User and IUseMagicTime

The interface [`IHaveLocalTime`](/magic-pig-games/magic-time-local-time-scale/magic-time-user/ihavelocaltime.md) is implemented by [`MagicTimeUser`](/magic-pig-games/magic-time-local-time-scale/magic-time-user.md). Each Magic Time User object will automatically create its own `LocalTimeScale`, which you can think of as that objects internal clock.

{% hint style="success" %}
Any object that will be changing its time scale using Magic Time should implement `IUseMagicTime`. Inheriting from `MagicTimeUser` is likely a great option most of the time.
{% endhint %}

### 3️⃣ Create at Runtime

`LocalTimeScale` objects can be created at runtime as well. Classes like the [`TimeZone`](/magic-pig-games/magic-time-local-time-scale/time-zone.md) demonstrate how this can be done.&#x20;

{% hint style="success" %}
Simialr to the **Time Zone** objects, creating your own `LocalTimeScale` enables more options and flexibility to help create the in-game experience you're looking for.
{% endhint %}

## Events & UnityEvents

Each `LocalTimeScale` includes `UnityEvents` and other events you can subscribe to.

<figure><img src="/files/DvYoSLw35e94q62101MG" alt=""><figcaption></figcaption></figure>

### Subscribing to Unity Events at Runtime

Since these objects are Scriptable Objects, in most cases you'll need to subscribe to the `UnityEvents` at runtime, specifically subscribing to the `instance` of the Scriptable Object that is created at runtime. Your object should reference the LocalTimeScale and add itself as a listener.

```csharp
// Your script which wants to subscribe to the UnityEvent
LocalTimeScale localTimeScale;
localTimeScale.OnTimeScaleChangedUnityEvent.AddListener(OnTimeScaleChanged);

// Note the UnityEvent only provides the float value
public void OnTimeScaleChanged(float value)
{
    Debug.Log($"The new value is {value}");
}
```

### Subscribing to the Events at Runtime

The `Events` also include the `LocalTimeScale` object, which is useful if you have one object that is subscribed to multiple `LocalTimeScale` objects, and needs to know which one called the event.

<pre class="language-csharp"><code class="lang-csharp"><strong>// Your script which wants to subscribe to the Event
</strong>LocalTimeScale localTimeScale;
<strong>localTimeScale.OnTimeScaleChanged += OnTimeScaleChanged;
</strong><strong>
</strong><strong>// This event also tells you which object triggered it
</strong>public void OnTimeScaleChanged(float value, LocalTimeScale localTimeScale)
{
    HandleChangedTimeScaleValues(localTimeScale); // Do something!
}
</code></pre>

## Additional Scripting

Be sure to check out the [**Local Time Scale Scripting**](/magic-pig-games/magic-time-local-time-scale/local-time-scale/local-time-scale-scripting.md) page with examples on how to use this class.

{% content-ref url="/pages/RR4kOyoXJDkh4KybbiKP" %}
[Local Time Scale Scripting](/magic-pig-games/magic-time-local-time-scale/local-time-scale/local-time-scale-scripting.md)
{% endcontent-ref %}


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## 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, and the optional `goal` query parameter:

```
GET https://infinitypbr.gitbook.io/magic-pig-games/magic-time-local-time-scale/local-time-scale.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

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.
