diff --git a/.gitignore b/.gitignore index fb42be6..74e70de 100644 --- a/.gitignore +++ b/.gitignore @@ -61,3 +61,4 @@ crashlytics-build.properties # Temporary auto-generated Android Assets /Assets/StreamingAssets/aa.meta /Assets/StreamingAssets/aa/* +.deepseek/ diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..9985dd0 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,129 @@ +# Project Instructions + +This file provides context for AI assistants working on this project. + +## Project Overview + +**HapticSystem** is a Unity-based haptic feedback framework built on the Lofelt Nice Vibrations SDK. It provides a data-driven, cross-platform haptic playback system for iOS and Android. + +## Project Type: Unity (C#) + +- **Engine**: Unity (see `ProjectSettings/` for version) +- **Language**: C# (.NET Framework / Mono) +- **Solution**: `HapticSystem.sln` + +## Architecture + +### Layered Design + +``` +┌─────────────────────────────────────────┐ +│ HapticInvoker (MonoBehaviour) │ ← Scene-level entry point +├─────────────────────────────────────────┤ +│ HapticSystem (MonoBehaviour, │ ← Core singleton; dispatches by type +│ DontDestroyOnLoad) │ +├──────────────────┬──────────────────────┤ +│ Generated Layer │ Handwritten Core │ +│ HapticObject.cs │ HapticSettings │ +│ (auto-gen from │ (ScriptableObj) │ +│ data table) │ IBinarySerializable │ +├──────────────────┴──────────────────────┤ +│ ResourceLoader │ ← Sync/async resource cache +├─────────────────────────────────────────┤ +│ Lofelt Nice Vibrations SDK │ ← Native haptic engine +│ (Plugins/Android, iOS, macOS, Win) │ +└─────────────────────────────────────────┘ +``` + +### Key Namespaces + +| Namespace | Purpose | +|-----------|---------| +| `OCES.Haptic` | Core haptic system, data models, binary serialization | +| `OCES` | Shared utilities (ResourceLoader) | + +### Data Flow + +1. **Data source**: `DataTables/HapticManagement.xlsx` — Excel table defining haptic objects +2. **Auto-generation**: Row data is serialized to binary (`.bytes`) and the `HapticObject.cs` model is generated +3. **Build artifact**: Binary files placed under `Assets/Resources/HapticData/`; `.haptic` files under `Assets/Resources/Haptics/` +4. **Runtime**: `HapticSystem.Awake()` loads `HapticObjectConfig` from Resources via `IBinarySerializable`, then dispatches `Play()` calls based on `HapticType` + +### Haptic Types + +| Type | Enum Value | Behavior | +|------|-----------|----------| +| `Preset` | 0 | Plays a built-in Lofelt preset (enum-mapped string) | +| `Emphasis` | 1 | Transient haptic with amplitude + frequency | +| `Constant` | 2 | Continuous haptic with amplitude + frequency + duration | +| `Advance` | 3 | Plays a `.haptic` file with fallback preset | + +## Source Tree (relevant paths) + +``` +Assets/ +├── Resources/ +│ ├── HapticData/ # Binary config files (auto-generated from Excel) +│ └── Haptics/ # .haptic resource files (e.g., NVDice, NVHeartbeats) +├── Scenes/ +│ └── HomeScene.unity # Demo scene with HapticInvoker +├── Scripts/OCES/Haptic/ +│ ├── Generated/ +│ │ └── HapticObject.cs # Auto-generated — DO NOT EDIT +│ ├── Handwritten/ +│ │ ├── HapticSystem.cs # Core singleton: load config, dispatch Play +│ │ ├── HandwrittenDefinitions.cs # IBinarySerializable, HapticType enum, FileManager +│ │ ├── HapticSettings.cs # ScriptableObject: config + resource paths +│ │ └── Editor/ +│ │ └── HapticSettingsProvider.cs # Project Settings integration +│ └── HapticInvoker.cs # Debug component: UI input → haptic playback +├── Scripts/OCES/ +│ └── ResourceLoader.cs # Cached sync/async Resources loader +├── Settings/ +│ └── HapticSettings.asset # HapticSettings instance (config paths) +└── Plugins/ + ├── Android/libs/LofeltHaptics.aar + ├── iOS/LofeltHaptics.framework/ + ├── macOS/libnice_vibrations_editor_plugin.dylib + └── Windows/x64/nice_vibrations_editor_plugin.dll +``` + +## Build & Test Commands + +```bash +# Build Android APK (output: Build/HapticSystemDemo.apk) +# Use Unity Build Settings or command-line: +# /Applications/Unity/Hub/Editor//Unity.app/Contents/MacOS/Unity \ +# -quit -batchmode -projectPath . -buildTarget Android \ +# -executeMethod + +# Build iOS Xcode project (output: Build/iOS/) +# Configured via Unity Build Settings → iOS → Build +``` + + + +## External Dependencies + +- **Lofelt Nice Vibrations**: Cross-platform haptic SDK (native plugins for Android/iOS/macOS/Windows) + - Assembly Definition: `Assets/Scripts/Lofelt/NiceVibrations/Lofelt.NiceVibrations.asmdef` + +## Guidelines + +- **Do not edit `Assets/Scripts/OCES/Haptic/Generated/`** — these files are auto-generated from the data table +- Data-driven: add/modify haptic definitions in `DataTables/HapticManagement.xlsx`, then regenerate +- Follow existing naming conventions: PascalCase for public, camelCase for private fields, `m_` prefix for member fields +- `HapticSystem` is a singleton (DontDestroyOnLoad) — access via `HapticSystem.Instance` +- All haptic types implement `IBinarySerializable` for runtime data loading +- Keep changes focused and atomic + +## Important Notes + +- Haptic data files live under `Resources/` so they are included in builds and loadable via `Resources.Load` +- `.haptic` files are Lofelt's proprietary haptic clip format +- The `HapticInvoker` component in HomeScene is for debugging only — production should use `HapticSystem.Instance.Play(id)` directly +- Editor integration at: **Project Settings → Haptic Settings** (via `SettingsProvider`) +- `HapticSettings` asset location: `Assets/Settings/HapticSettings.asset` + +### Version Control +This project uses Git. See `.gitignore` for excluded files.