# GYROSCOPE TILT GAME - COMPLETE SETUP GUIDE

> **Unity 6 (6000.x) Specific Guide**
> This guide uses Unity 6's new **Build Profiles** system (replaces old Build Settings).
> If you're on Unity 2022 or older, some menu names will be different.

## 📋 TABLE OF CONTENTS
1. [Overview](#overview)
2. [Unity Scene Setup](#unity-scene-setup)
3. [Build Profiles](#build-profiles-unity-6)
4. [Testing on Device](#testing-on-device)
5. [How to Play](#how-to-play)
6. [Customization](#customization)
7. [Troubleshooting](#troubleshooting)

---

## 📖 OVERVIEW

### What This Game Does:
- Detects when you tilt your phone around the Z-axis (portrait to landscape)
- Counts successful tilts (crossing -45° or +45°)
- Tracks time spent holding tilt position
- Hybrid scoring: Complete 10 tilts AND hold for 15 seconds total

### Scripts Included:
1. **GyroTiltController.cs** - Handles all gyroscope input, calibration, and tilt detection
2. **TiltGameManagerAutoStart.cs** - Game logic with auto-start (no UI needed)

### What You'll See:
- Debug text overlay showing angles, score, and objectives
- Optional 3D cube that rotates with your phone
- Game auto-starts after 2 seconds
- Game auto-restarts after completion

---

## 🎮 UNITY SCENE SETUP

### STEP 1: Create GameManager

1. **Create Empty GameObject:**
   - Right-click in **Hierarchy** → **Create Empty**
   - Name it: `GameManager`
   - Position: `(0, 0, 0)`

2. **Add GyroTiltController Script:**
   - Select `GameManager` in Hierarchy
   - In Inspector, click **Add Component**
   - Type: `GyroTiltController`
   - Press Enter

3. **Configure GyroTiltController:**
   ```
   ✓ Enable Gyro On Start: CHECKED
   Smoothing: 0.5
   Left Tilt Threshold: -45
   Right Tilt Threshold: 45
   Deadzone Angle: 10
   Visual Target: (leave empty for now - we'll add in Step 2)
   Visual Rotation Multiplier: 1
   ```

4. **Add TiltGameManagerAutoStart Script:**
   - With `GameManager` still selected
   - Click **Add Component**
   - Type: `TiltGameManagerAutoStart`
   - Press Enter

5. **Configure TiltGameManagerAutoStart:**
   ```
   Gyro Controller: [Drag "GameManager" from Hierarchy here]
   Game Duration: 30
   Target Tilt Count: 10
   Target Hold Time: 15
   Points Per Tilt: 10
   Points Per Second Hold: 5
   Completion Bonus: 100
   Auto Start Delay: 2
   ```

   **IMPORTANT:** You MUST drag the `GameManager` GameObject into the "Gyro Controller" field!

---

### STEP 2: Create Visual Indicator (Optional but Recommended)

This creates a 3D object that rotates when you tilt your phone.

1. **Create 3D Cube:**
   - Right-click Hierarchy → **3D Object** → **Cube**
   - Name it: `TiltIndicator`

2. **Position It:**
   - Select `TiltIndicator`
   - In Inspector, set Transform:
     ```
     Position: X=0, Y=0, Z=5 (in front of camera)
     Rotation: X=0, Y=0, Z=0
     Scale: X=0.5, Y=2, Z=0.1 (makes it arrow-like)
     ```

3. **Optional - Add Color:**
   - In Project window: Right-click → **Create** → **Material**
   - Name: `TiltMaterial`
   - Select it, set Albedo color to bright cyan or any color you like
   - Drag `TiltMaterial` onto `TiltIndicator` in Scene view

4. **Connect to GyroTiltController:**
   - Select `GameManager` in Hierarchy
   - Find the **GyroTiltController** component in Inspector
   - Drag `TiltIndicator` from Hierarchy into the **Visual Target** field
   - Now the cube will rotate with your phone!

---

### STEP 3: Verify Camera Exists

- You should already have **Main Camera** in your scene
- If not: GameObject → Camera
- Default position is fine: `(0, 1, -10)`

---

### STEP 4: Save Your Scene

1. **File** → **Save As**
2. Name: `TiltGame`
3. Save location: `Assets/Scenes/TiltGame.unity`

---

### ✅ FINAL HIERARCHY CHECK

Your Hierarchy should look like this:

```
Scene: TiltGame
├── Main Camera
├── Directional Light (default)
├── GameManager
│   ├── GyroTiltController (script component)
│   └── TiltGameManagerAutoStart (script component)
└── TiltIndicator (Cube)
```

That's it! Only 3-4 GameObjects needed.

---

## 📱 BUILD PROFILES (Unity 6)

Unity 6 uses **Build Profiles** instead of the old Build Settings window.

### STEP 1: Open Build Profiles Window

1. **File** → **Build Profiles**
2. The Build Profiles window opens (replaces old Build Settings)

---

### STEP 2: Create Android Build Profile

1. In Build Profiles window, click **Create Build Profile** (or the **+** button)
2. Select **Android** from the list
3. The Android build profile is created and activated automatically

**For iOS (if targeting iPhone):**
1. Click **+** button in Build Profiles window
2. Select **iOS**
3. You'll need a Mac and Xcode for the actual build

---

### STEP 3: Add Scene to Build Profile

1. In Build Profiles window, make sure your **Android** profile is selected (highlighted)
2. Look for the **Scenes in Build** section
3. Click **Add Open Scenes** button (or drag scene from Project window)
4. You should see `Scenes/TiltGame` in the list with a checkmark

---

### STEP 4: Configure Player Settings

1. In Build Profiles window, with Android profile selected, find the **Player Settings** section
2. Or go to: **Edit** → **Project Settings** → **Player** → **Android tab** (Android icon)
3. Configure these settings:

```
Company Name: YourName
Product Name: TiltGame
Version: 1.0

Resolution and Presentation:
  Default Orientation: Portrait
  (or Auto Rotation if you want flexibility)
  Allowed Orientations for Auto Rotation:
    ✓ Portrait
    ✓ Landscape Left
    ✓ Landscape Right

Other Settings (scroll down):
  Minimum API Level: Android 7.0 'Nougat' (API Level 24) or higher
  Target API Level: Automatic (highest installed)

  Scripting Backend: IL2CPP (recommended) or Mono
  ARM64: ✓ (required for Google Play)
```

---

### STEP 5: Build to Device

**Option A: Build And Run (Recommended)**

1. **Enable USB Debugging on your Android phone:**
   - Settings → About Phone → Tap "Build Number" 7 times
   - Settings → Developer Options → Enable "USB Debugging"

2. **Connect phone via USB cable**

3. **In Unity:**
   - Make sure Android build profile is **active** (selected in Build Profiles window)
   - Click **Build and Run** button in Build Profiles window
   - Choose save location for APK (e.g., `Builds/TiltGame.apk`)
   - Click Save
   - Wait for build (2-10 minutes first time)
   - App automatically installs and launches on phone!

**Option B: Build APK Only**

1. In Build Profiles window, click **Build** button
2. Choose save location (e.g., `Builds/TiltGame.apk`)
3. Click Save and wait for build to complete
4. Transfer APK to phone (Google Drive, email, USB, etc.)
5. Install manually on phone

**Option C: Quick Build (Unity 6 Feature)**

1. Use keyboard shortcut: **Ctrl+B** (Windows) or **Cmd+B** (Mac)
2. Builds to the last used location automatically
3. Super fast for testing iterations!

---

### Unity 6 Build Profiles - What's New?

Unity 6's Build Profiles are better than old Build Settings:

✅ **Multiple profiles:** Create Android, iOS, and PC builds without switching platforms constantly
✅ **Faster switching:** No more waiting 5 minutes to switch platforms
✅ **Per-profile settings:** Different scenes/settings for each platform
✅ **Keyboard shortcuts:** Ctrl+B for quick builds

**Example workflow:**
1. Create Android profile (for phone testing)
2. Create Standalone profile (for PC testing)
3. Switch between them instantly - no re-importing!

---

## 🎮 HOW TO PLAY

### When You Launch the App:

#### **First 2 Seconds:**
```
Debug text shows:
  "Game starting soon..."
  "Hold device and press CALIBRATE if needed"

Raw Z: 12.3°          ← Your current tilt angle (raw sensor data)
Smoothed Z: 11.8°     ← Filtered angle (smoother, less jittery)
State: Neutral        ← Current tilt state
```

**What to do:** Hold your phone in a comfortable position (portrait, landscape, whatever you prefer)

---

#### **Game Starts (After 2 Seconds):**
```
GAME ACTIVE
Time: 30.0s           ← Countdown timer
Score: 0              ← Your current score
Tilts: 0/10          ← Tilt count / target
Hold: 0.0s/15s       ← Hold time / target
```

**Objective:** Complete BOTH goals before time runs out:
- ✅ Cross tilt threshold 10 times (left or right)
- ✅ Hold tilted position for 15 seconds total (cumulative)

---

#### **How to Score Points:**

1. **Tilt Scoring (+10 points each):**
   - Tilt phone LEFT past -45° → triggers "TILT LEFT"
   - Tilt phone RIGHT past +45° → triggers "TILT RIGHT"
   - Each crossing = 1 tilt counted
   - Console shows: `>>> TILT #1! +10 points`

2. **Hold Time Scoring (+5 points per second):**
   - Stay tilted past threshold (left OR right)
   - Timer accumulates while holding
   - Points added continuously: `+5, +10, +15...`

3. **Completion Bonus (+100 points):**
   - Complete BOTH objectives before 30 seconds
   - Automatically awards 100 bonus points
   - Shows: `★★★ ALL OBJECTIVES COMPLETED! ★★★`

---

#### **Visual Feedback:**

- **Tilt Angle Number:** Updates in real-time as you tilt
- **State Indicator:** Shows "Neutral", "TiltLeft", or "TiltRight"
- **Cube Rotation:** The TiltIndicator cube rotates matching your phone tilt
- **Score Counter:** Updates continuously
- **Green Text:** Objectives turn green when completed

---

#### **Game Over:**
```
GAME OVER
Final Score: 245
Restarting in 5s...
```

Game automatically restarts after 5 seconds!

---

### Controls Summary:

| Action | What Happens |
|--------|--------------|
| Tilt left (past -45°) | +1 tilt, +10 points, state = TiltLeft |
| Tilt right (past +45°) | +1 tilt, +10 points, state = TiltRight |
| Hold tilt position | Hold time increases, +5 pts/second |
| Return to neutral | State = Neutral, hold time stops |
| Complete objectives | Game ends, +100 bonus |
| Time reaches 0s | Game ends, no bonus |

---

## ⚙️ CUSTOMIZATION

### Make Game Easier/Harder:

Open Unity, select `GameManager`, modify these values:

**Easier:**
```
TiltGameManagerAutoStart:
  Game Duration: 45 (more time)
  Target Tilt Count: 5 (fewer tilts needed)
  Target Hold Time: 10 (less hold time needed)

GyroTiltController:
  Left Tilt Threshold: -30 (easier to trigger)
  Right Tilt Threshold: 30
```

**Harder:**
```
TiltGameManagerAutoStart:
  Game Duration: 20 (less time)
  Target Tilt Count: 15 (more tilts needed)
  Target Hold Time: 20 (more hold time needed)

GyroTiltController:
  Left Tilt Threshold: -60 (harder to trigger)
  Right Tilt Threshold: 60
```

---

### Adjust Smoothing:

**Jittery/Jumpy rotation?**
```
GyroTiltController:
  Smoothing: 0.7-0.9 (more smoothing, less jitter)
```

**Laggy/Slow response?**
```
GyroTiltController:
  Smoothing: 0.1-0.3 (less smoothing, faster response)
```

---

### Change Scoring:

```
TiltGameManagerAutoStart:
  Points Per Tilt: 20 (instead of 10)
  Points Per Second Hold: 10 (instead of 5)
  Completion Bonus: 500 (instead of 100)
```

---

### Adjust Auto-Start Delay:

```
TiltGameManagerAutoStart:
  Auto Start Delay: 5 (wait 5 seconds instead of 2)
```

Set to `0` to start immediately!

---

### Change Game Duration:

```
TiltGameManagerAutoStart:
  Game Duration: 60 (1 minute game)
```

---

## 🔧 TROUBLESHOOTING

### Problem: "Gyroscope not supported"

**Cause:** Device doesn't have gyroscope sensor (rare on modern phones)

**Fix:**
- Test on a different phone
- Verify gyro exists: Install "Sensor Kinetics" app from Play Store
- Most phones from 2015+ have gyroscope

---

### Problem: Tilt detection feels backwards

**Cause:** Different phone orientation than expected

**Fix Option 1 - Recalibrate:**
- Hold phone in your preferred "neutral" position
- (Future version will have calibrate button)

**Fix Option 2 - Swap thresholds in code:**
```
Left Tilt Threshold: 45
Right Tilt Threshold: -45
```

---

### Problem: Cube doesn't rotate

**Cause:** Visual Target not assigned

**Fix:**
1. Select `GameManager`
2. Find `GyroTiltController` component
3. Drag `TiltIndicator` into "Visual Target" field
4. If field is grayed out, make sure TiltIndicator exists in Hierarchy

---

### Problem: No tilts detected when I tilt phone

**Cause 1:** Threshold too high
```
Solution: Lower thresholds to -30 / +30
```

**Cause 2:** Wrong axis
```
Solution: Check you're tilting around Z-axis (portrait ↔ landscape)
Not tilting forward/backward (that's X-axis)
```

**Cause 3:** Inside deadzone
```
Solution: Lower deadzone from 10 to 5
```

---

### Problem: Game doesn't start

**Cause:** Gyro Controller reference missing

**Fix:**
1. Select `GameManager`
2. Find `TiltGameManagerAutoStart` component
3. Make sure "Gyro Controller" field has `GameManager` assigned
4. If it says "None", drag `GameManager` from Hierarchy into that field

---

### Problem: Compilation errors in Unity

**Cause:** TiltUI.cs or TiltGameManager.cs are active (they need TextMeshPro)

**Fix:**
These files should be disabled (renamed to `.DISABLED` extension).
Only these scripts should exist:
- ✅ GyroTiltController.cs
- ✅ TiltGameManagerAutoStart.cs

If you see TiltUI.cs, rename it to TiltUI.cs.DISABLED

---

### Problem: Gyro drifts over time

**Cause:** Gyroscope sensors have slight drift

**Fix:**
- Calibration helps reset the drift
- In current version, game auto-calibrates on start
- Future: Add manual calibrate button

---

### Problem: Can't install APK on phone

**Cause:** "Install from unknown sources" disabled

**Fix:**
1. Settings → Security
2. Enable "Unknown Sources" or "Install Unknown Apps"
3. Allow installation from your file manager app

---

### Problem: Screen auto-rotates during gameplay

**Cause:** Orientation set to Auto Rotation

**Fix:**
- Unity: Player Settings → Default Orientation → Portrait
- Or: Lock orientation in phone settings during gameplay

---

### Problem: Build fails / Unity crashes

**Solutions:**
1. Close Unity, delete `Library` folder, reopen project
2. Update Android SDK/NDK (Unity Hub → Installs → Add Modules)
3. Lower graphics quality: Edit → Project Settings → Quality → Set to "Low"
4. Check disk space (need ~5GB free)
5. **Unity 6 specific:** Make sure Build Profile is active (highlighted in Build Profiles window)
6. **Unity 6 specific:** Check that scene is in the Build Profile's "Scenes in Build" list

---

## 📊 UNDERSTANDING THE DEBUG TEXT

### Upper Section (Always Visible):
```
Raw Z: -23.4°          ← Direct sensor reading (updates ~100 times/sec)
Smoothed Z: -21.8°     ← Filtered value (what game uses for detection)
State: TiltLeft        ← Current tilt state (Neutral/TiltLeft/TiltRight)
```

**What the angles mean:**
- `0°` = Neutral position (as calibrated)
- Negative (-45°) = Tilted LEFT (counterclockwise)
- Positive (+45°) = Tilted RIGHT (clockwise)
- Range: -180° to +180°

---

### Lower Section (During Gameplay):
```
GAME ACTIVE            ← Game state indicator
Time: 18.3s            ← Countdown (turns red below 10s)
Score: 145             ← Current score (yellow)
Tilts: 7/10           ← Progress (turns green when complete)
Hold: 9.2s/15s        ← Progress (turns green when complete)
```

---

## 🎯 TIPS FOR BEST EXPERIENCE

1. **Calibrate at start:**
   - Hold phone comfortably when game starts
   - This becomes your "0 degrees" reference

2. **Smooth tilting:**
   - Tilt smoothly, not jerky
   - Cross the threshold clearly (go past -45° or +45°)

3. **Alternate left/right:**
   - Tilt left, back to center, tilt right, repeat
   - Gets tilts quickly while building hold time

4. **Hold at threshold:**
   - After tilting past threshold, hold position
   - Accumulates hold time while waiting to tilt back

5. **Watch the cube:**
   - Visual indicator helps you see current tilt
   - When cube is heavily tilted, you're in scoring zone

---

## 📝 GAME STRATEGY

### Beginner Strategy: "Slow and Steady"
- Tilt left → hold 2 seconds → center
- Tilt right → hold 2 seconds → center
- Repeat 10 times
- Time: ~25-30 seconds (good if you're methodical)

### Advanced Strategy: "Fast Tilts"
- Rapid tilts left-right-left-right (get to 10 tilts fast)
- Then hold at either threshold for remaining hold time
- Time: ~15-20 seconds (requires practice)

### Perfect Strategy: "Hybrid"
- Tilt left → hold 1.5s
- Tilt right → hold 1.5s
- Repeat 10 times (10 tilts × 1.5s × 2 = 30s hold time!)
- Completes both objectives simultaneously

---

## 📂 FILE STRUCTURE

```
Assets/
├── Scenes/
│   └── TiltGame.unity          (Your game scene)
├── Scripts/
│   ├── GyroTiltController.cs   (Gyro input handler)
│   └── TiltGameManagerAutoStart.cs (Game logic)
└── Materials/ (optional)
    └── TiltMaterial.mat        (Color for cube)

Builds/
└── TiltGame.apk                (Android build output)
```

---

## 🚀 QUICK START CHECKLIST

Before building, verify:

- [ ] Scene saved as `TiltGame.unity`
- [ ] `GameManager` exists in Hierarchy
- [ ] `GameManager` has 2 scripts: GyroTiltController + TiltGameManagerAutoStart
- [ ] `TiltGameManagerAutoStart` → Gyro Controller field = `GameManager`
- [ ] `TiltIndicator` (cube) exists
- [ ] `TiltIndicator` assigned to GyroTiltController → Visual Target
- [ ] Scene added to Build Profile
- [ ] Android Build Profile created and active
- [ ] Player Settings configured (Orientation, API Level)
- [ ] Phone connected via USB (for Build And Run)
- [ ] USB Debugging enabled on phone

---

## 🎓 NEXT STEPS / ENHANCEMENTS

Want to improve the game? Here are ideas:

### Easy Additions:
- Add UI buttons (requires setting up TextMeshPro)
- Add sound effects on tilt
- Change cube to arrow 3D model
- Add particle effects on successful tilt

### Medium Additions:
- Add difficulty levels (Easy/Medium/Hard)
- Add high score tracking (PlayerPrefs)
- Add different game modes
- Add vibration feedback on tilt

### Advanced Additions:
- Online leaderboards
- Multiple levels with increasing difficulty
- Power-ups (2x points, slow time, etc.)
- Tutorial sequence for first-time players
- Settings menu (adjust thresholds, smoothing)

---

## 📞 NEED HELP?

If you encounter issues not covered in Troubleshooting:

1. Check Unity Console for error messages
2. Verify all steps were followed exactly
3. Try on a different Android device
4. Rebuild after cleaning (delete Library folder)

---

**Created for Unity 6 (6000.2.8f1)**
**Works on Android 7.0+ and iOS 11+**
**Last Updated: 2025-11-15**

---

## 🎉 YOU'RE READY!

Follow the steps above and you'll have a fully working gyroscope tilt game.

**Estimated Setup Time:** 10-15 minutes
**Estimated Build Time:** 5-10 minutes (first build)

Have fun tilting! 📱🎮
