# PUNPrefabKey

## PUN Prefab Key Component

The **PUN Prefab Key** component provides a simple, consistent way to identify prefabs when using the **Photon PUN 2+ integration**.

It ensures each networked prefab has a stable string identifier (or *key*) that can be referenced during registration and instantiation.

***

### 1. Overview

When using Photon PUN, every networked object must be referenced by a **unique name string** for registration and instantiation.

By default, PUN uses the **GameObject’s name**, but this can become unreliable when:

* Prefabs are renamed or duplicated.
* Nested prefab variants share the same name.
* You want to define shorter or consistent keys for external systems.

The `PUNPrefabKey` component solves this by providing a serialized, editor-visible field for an explicit identifier.

***

### 2. Component Reference

```csharp
#if PUN_2_OR_NEWER
using UnityEngine;

namespace MegaCrush.Spawner.PunAdapter
{
    /// <summary>
    /// Attach to a prefab to give it a stable PUN key.
    /// Falls back to GameObject.name if empty.
    /// </summary>
    public sealed class PUNPrefabKey : MonoBehaviour
    {
        [SerializeField] private string id;
        public string Id => string.IsNullOrWhiteSpace(id) ? gameObject.name : id;
    }
}
#endif
```

***

### 3. How It Works

When the **PUN Pool Prefab Provider** or **PUN Bootstrap** registers prefabs, it queries each prefab for a `PUNPrefabKey` component.

* If the component exists and its `id` field is set, that string is used as the **registration key**.
* If `id` is empty, it automatically falls back to the prefab’s `GameObject.name`.

This ensures the same prefab key is used consistently at both registration and instantiation.

***

### 4. Usage

1. **Attach** the component to any prefab that will be networked via Photon PUN.

   ```
   Add Component → PUN Prefab Key
   ```
2. **Set a unique Id** in the inspector (for example, `Enemy_Grunt`, `Pickup_Medkit`, etc.).
   * Leave empty if you want to use the prefab name as the key.
3. During runtime, the PUN integration uses that ID automatically when registering prefabs with the pool.

***

### 5. Benefits

| Without PUNPrefabKey                             | With PUNPrefabKey              |
| ------------------------------------------------ | ------------------------------ |
| Prefab key = GameObject name only                | Explicit, serialized key value |
| Fragile if renamed or duplicated                 | Stable even after renames      |
| Requires matching names across scenes and assets | Independent, consistent IDs    |
| Harder to track in large libraries               | Easy to audit via inspector    |

***

### 6. Integration Notes

* Works automatically with:
  * `PUNPrefabRegistrar.RegisterFromScene()`
  * `PUNPoolPrefabProvider`
  * `PunBootstrap` sample scene
* The `PUNPrefabKey` does **not** affect local instantiation or object pooling — it only influences prefab registration and lookup.
* You can safely omit it if you rely entirely on prefab names, but it’s highly recommended for larger projects or shared prefab sets.

***

### ✅ Summary

The **PUN Prefab Key** component helps make Photon PUN integrations robust and maintainable by decoupling network identifiers from prefab names.

> **Best practice:**\
> Add a `PUNPrefabKey` to every networked prefab and assign a clear, stable ID.\
> This keeps prefab registration consistent even as your project grows.
