This guide covers the `CustomPlayerPrefs` system in Unity 6000.0.36f1, enabling saving/loading of component attributes to/from `SaveData.json` via a labeled Inspector UI. Supports `int`, `float`, `string`, `bool`, `Vector2`, `Vector3`, `Quaternion`, `Color`, `Vector4`, and enums, with robust debugging logs. Ideal for persistent game data like player stats or positions.
## Overview
- **Purpose**: Save/load attributes to JSON with an intuitive interface.
- **Features**:
- Labeled Inspector dropdowns (e.g., “Property 1: Player_Transform_position”).
- Auto-generated unique keys.
- Supports `Color`, `Vector4`, enums.
- Logs save format (GameObject, Component, Property, Type, Key, Value).
- Saves to `Assets/SaveData/` (Editor) or `Application.persistentDataPath` (Builds).
- Buttons for Save, Load, Clear, View JSON.
- **Scripts**:
- `CustomPlayerPrefs`: JSON save/load with serializable key-value pairs.
- `CustomPlayerPrefsEditor`: Labeled Inspector UI.
- **Appendix**: Script code, examples.
## Prerequisites
- **Unity Version**: 6000.0.36f1.
- **Knowledge**: Unity Editor, GameObjects, Components, C#.
- **Project Setup**: Project with GameObjects having public fields/properties.
- **Player Settings**: Set **Company Name** (e.g., `MyGameCompany`), **Product Name** (e.g., `PlayerPrefsProject`) in `Edit > Project Settings > Player`.
- **File Access**: Write permissions for `Assets/SaveData/` (Editor), `%userprofile%\AppData\LocalLow\` (Builds).
## Installation
1. **Create Scripts**:
- In `Assets`, create `Scripts` and `Editor` folders.
- In `Scripts`: `CustomPlayerPrefs.cs`.
- In `Editor`: `CustomPlayerPrefsEditor.cs`.
- Copy contents from appendix.
2. **Set Company/Product Name**:
- `Edit > Project Settings > Player`.
- Set **Company Name**, **Product Name**.
- Save project.
3. **Verify Compilation**:
- Save scripts.
- Check Console for errors.
## Setup in Unity
1. **Manager GameObject**:
- Create `PlayerPrefsManager`.
- Add `CustomPlayerPrefs` component.
2. **Test Components**:
- Create `Player` GameObject.
- Add scripts, e.g.:
- `PlayerHealth`: `speed` (float), `playerColor` (Color).
- `SampleScript`: `myVector` (Vector4).
- Attach to `Player` (see appendix).
3. **Configure CustomPlayerPrefs**:
- Select `PlayerPrefsManager`.
- Expand `Properties To Save`.
- Add elements (e.g., “Property 1: Player_PlayerHealth_speed”):
- **Target GameObject**: Drag `Player`.
- **Component**: Select `PlayerHealth`, `SampleScript`.
- **Property**: Select `speed`, `playerColor`, `myVector`.
- **Key**: E.g., `Player_PlayerHealth_speed`.
- Ensure unique keys.
## Usage in a Game
### In the Editor
- **Testing**:
- Inspector buttons:
- **Save Preferences**: Saves to `Assets/SaveData/SaveData.json`.
- **Load Preferences**: Loads from `SaveData.json`.
- **Clear Preferences**: Deletes `SaveData.json`.
- **View JSON File**: Opens file location.
- Example:
- Set `speed` to `14.77`, `playerColor` to `RGBA(0, 0.13, 0.755, 1)`, `myVector` to `(3.19, 6.21, 6.67, 12.05)`.
- Click “Save Preferences”.
- Verify `Assets/SaveData/SaveData.json`.
- Change values, click “Load Preferences”, confirm reversion.
- Console log:
```
[CustomPlayerPrefs] Saving Save Format:
Index | GameObject | Component | Property | Type | Key | Value
------|------------|-----------|----------|------|-----|------
1 | Player | PlayerHealth | speed | Single | Player_PlayerHealth_speed | 14.77
2 | Player | PlayerHealth | playerColor | Color | Player_PlayerHealth_playerColor | RGBA(0.000, 0.130, 0.755, 1.000)
3 | Player | SampleScript | myVector | Vector4 | Player_SampleScript_myVector | (3.19, 6.21, 6.67, 12.05)
```
- **Documenting**:
- Copy Console log to Obsidian:
```markdown
# Save Data Structure
## Version 1.0 (2025-05-28)
[Paste log]
## Notes
- Stored in `Assets/SaveData/SaveData.json` (Editor) or `%userprofile%\AppData\LocalLow\...` (Builds).
- `playerColor` uses `_r`, `_g`, `_b`, `_a`.
```
- **Debugging**:
- Check Console for “Saved X properties”, “JSON content to write”.
- Verify `SaveData.json` path.
### In Code
- **Methods**: Use `SavePreferences()`, `LoadPreferences()`, `ClearPreferences()`.
- **Integration**: Save at checkpoints, load on start (see `GameManager` in appendix).
### In UI
- **Buttons**: Link to `CustomPlayerPrefs` methods for save/load/clear.
## Best Practices
- **Persistent Manager**: Use `DontDestroyOnLoad`.
- **Unique Keys**: E.g., `Player_SampleScript_myVector`.
- **Supported Types**: `int`, `float`, `string`, `bool`, `Vector2`, `Vector3`, `Quaternion`, `Color`, `Vector4`, enums.
- **JSON Setup**: Ensure save path permissions.
- **Documentation**: Log save format.
- **Persistence**: Save before load; avoid manual `SaveData.json` deletion.
- **Limitations**: JSON for small/medium data; extend for arrays.
## Example Scenario
### Setup
- **Scene**: `Player` GameObject.
- **Components**: `PlayerHealth` (`speed`, `playerColor`), `SampleScript` (`myVector`).
- **Manager**: `CustomPlayerPrefs` on `PlayerPrefsManager`.
### Configuration
1. Select `PlayerPrefsManager`.
2. Add `Properties To Save`:
- “Property 1: Player_PlayerHealth_speed”: `Player`, `PlayerHealth`, `speed`.
- “Property 2: Player_PlayerHealth_playerColor”: `Player`, `PlayerHealth`, `playerColor`.
- “Property 3: Player_SampleScript_myVector”: `Player`, `SampleScript`, `myVector`.
### Testing
- **Editor**:
- Set `speed` to `14.77`, `playerColor` to `RGBA(0, 0.13, 0.755, 1)`, `myVector` to `(3.19, 6.21, 6.67, 12.05)`.
- Click “Save Preferences”, check `SaveData.json`.
- Change values, click “Load Preferences”, verify reversion.
- **Build**:
- Build/run, save/load, check `%userprofile%\AppData\LocalLow\.../SaveData.json`.
## Troubleshooting
- **Issue: Empty SaveData.json**:
- **Cause**: JSON serialization failure.
- **Fix**:
- Ensure `CustomPlayerPrefs.cs` uses `List<KeyValuePair>`.
- Check Console for “JSON is empty”.
- Verify `Properties To Save` (non-null components, valid properties).
- Ensure public fields (e.g., `public Color playerColor;`).
- Delete `SaveData.json`, resave.
- Example log:
```
[CustomPlayerPrefs] JSON is empty before writing to file.
```
- **Issue: NullReferenceException in Inspector**:
- **Fix**: Ensure `CustomPlayerPrefsEditor.cs` has null checks.
- **Issue: Compilation Errors**:
- **Fix**: Ensure `using System.Linq;` in `CustomPlayerPrefs.cs`.
- **Error: KeyNotFoundException**:
- **Fix**: Delete empty `SaveData.json`, resave, verify keys.
## Extending the System
- **New Types**: Add `Matrix4x4`.
- **Enum Arrays**: Support `Enumerations[]`.
- **Storage**: Binary files.
- **Dynamic**: Runtime assignment.
## Conclusion
`CustomPlayerPrefs` provides robust JSON persistence with debugging and a labeled Inspector.
## Appendix
- **[[CustomPlayerPrefs.cs]]**: JSON save/load, debug logs.
- **[[CustomPlayerPrefsEditor.cs]]:** Labeled Inspector, “View JSON”.
- **Example: PlayerHealth.cs**: `speed`, `playerColor`.
- **Example: SampleScript.cs**: `myVector`.
- **Example: GameManager.cs**: Key press save/load.
- **Example: DontDestroyOnLoad**: Persistence code.
- **Example: Enum Array Support**: `Enumerations[]`.
- **Example: Dynamic GameObject Assignment**: Runtime assignment.