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.