A playable 3D island exploration game for macOS, built with Unity 6 and Unity MCP CLI.
This project also contains Sky Strike, an arcade flight-combat game (Ace Combat-style) set on the same island — see the Sky Strike section below.
- Procedural Island Terrain - Irregular hills generated with layered Perlin noise and ridged features, surrounded by ocean
- Projected-Grid Ocean - Infinite screen-space ocean (no plane edge): Gerstner waves, world-space micro-normals, depth shore foam, horizon melt
- Poly Haven CC0 Assets - Trees, rocks, and cliffs from Poly Haven (CC0 licensed), automatically placed and grounded on the terrain
- FPS Walking - First-person controller with WASD movement, mouse look, sprint, head bob, and terrain following
- Dynamic Performance Scaling - Monitors FPS and drops render resolution to 50% when the scene gets heavy, restores when performance recovers
- HUD - Shows FPS, render scale state, and controls
| Key | Action |
|---|---|
| WASD | Move |
| Mouse | Look around |
| Shift | Sprint |
| Esc | Toggle cursor |
Open Builds/IslandExplorer.app directly.
- Open the project in Unity Hub (requires Unity 6000.3.x)
- Run menu: Island Explorer > 1. Import Poly Haven Models (creates prefabs from FBX assets)
- Run menu: Island Explorer > 2. Setup Scene (configures URP and scene)
- Press Play
# Install Unity MCP CLI
npm install -g unity-mcp-cli
# Build macOS player
/Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/MacOS/Unity \
-projectPath /path/to/IslandExplorer \
-batchmode -quit \
-executeMethod "IslandExplorerSetup.BuildMacOS"Assets/
Scripts/
GameManager.cs - Scene orchestrator (auto-creates at startup)
IslandTerrain.cs - Procedural terrain with Perlin noise hills
FPSController.cs - First-person walking controller
OceanRenderer.cs - FFT-style ocean mesh and material setup
PropPlacer.cs - Scatter and ground props on terrain
PerformanceScaler.cs - Dynamic half-resolution scaling
HUDController.cs - FPS and status overlay
Editor/
IslandExplorerSetup.cs - URP setup, scene config, macOS build
ModelImporter.cs - Poly Haven FBX to prefab pipeline
Materials/
Ocean.shader - Custom URP ocean shader with shore foam
Models/ - Poly Haven CC0 assets (trees, rocks, cliffs)
Resources/Prefabs/ - Runtime-loadable prefabs from FBX models
Scenes/
IslandExplorer.unity - Main scene
All 3D models and textures from Poly Haven (CC0 license):
- Trees: island_tree_01, island_tree_02
- Rocks: boulder_01, rock_07, rock_09, rock_moss_set_01
- Cliffs: coastal_cliff_01, coastal_cliff_02, rock_face_01
An arcade flight-combat MVP (Ace Combat-style gameplay, original code and procedural models) set above the same island. Wave-based dogfighting with missile lock-on, gun tracers, evasive bandit AI, and an AC-style HUD.
- F-15-style airframes — modeled in Blender via a headless bpy
pipeline (
Tools/blender_f15.py, run withblender --background --python): superellipse-lofted fuselage, beveled cropped-delta wing, stabilators, twin canted fins, rectangular intakes, canopy, twin nozzles, scorched tail sleeve, full smart-UV unwrap — exported asAssets/Models/Jets/F15_Blender.fbx.Assets/Editor/BlenderJetBuilder.csassembles it into gameplay prefabs (auto orientation fix, skin materials per part, decals, hit collider); the older ProBuilder path (JetModelingTool) remains as fallback. - High-detail cockpit —
Tools/blender_cockpit.pybuilds a full IP (canopy bow, HUD combiner, MFDs, scope, switches, gauges, seat/stick) toF15_Cockpit.fbx→Resources/Prefabs/Jets/PlayerCockpit; runtime falls back to procedural frame if missing. Toggle with V. Player in air-superiority gray, bandits in a dark aggressor scheme. - Painted skin textures — procedurally painted at editor time
(
JetTexturePainter, no source images): irregular panel layout with random access panels, rivet rows, per-panel tint variation, grime/streaks (albedo + tangent normal map + metallic/smoothness mask); scorched bare-metal tail sleeve around the exhausts; wing-top and fin insignia decals (low-visibility star-and-bars for the player, red star for bandits). Meshes carry cylindrical (fuselage) and planar (wings) UVs; variant schemes are tints over the shared skin set. - HDRI sky — Poly Haven CC0 pure-sky 2k HDRI (
qwantani_noon_puresky, fallbacks:kloppenheim_06_puresky/kloppenheim_02) so the island and ocean read cleanly without a suburban ground plate (download_realism.pyfetches them). - PBR terrain — real grass/sand/rock textures with normal maps (Poly Haven CC0) instead of solid colors.
- Ocean (projected grid) — full rewrite: NDC mesh ray-cast onto the sea plane (fills the horizon at any altitude, no finite-plane edge or UV tiles), 8-component Gerstner displacement, world-space micro-normals, depth-based shore foam, sun glint, horizon melt into the sky.
- Clouds — soft billboard clusters using procedural value-noise puff
textures and a custom transparent shader (
SkyStrike/CloudSprite). - Post-processing — URP HDR + global volume: ACES tonemapping, Bloom, vignette, color grade; SMAA on the chase camera.
Scene content is generated at startup: a 2048m island with a shoreline airbase (auto-sited, terrain-flattened runway, tower, hangars, apron, parked jet) on the ground, and 34 billboard cloud clusters (600-1250m) in the air.
| Key | Action |
|---|---|
| Mouse | Pitch / roll (banked turns auto-yaw) |
| W / S | Throttle up / down (brake on ground) |
| Shift | Afterburner |
| A / D | Rudder (ground steering) |
| Mouse pull | Rotate at >230 km/h (takeoff) |
| G | Landing gear up/down |
| T | Auto takeoff (on runway; any stick input aborts) |
| P | Autopilot: altitude + heading hold |
| O | AP waypoint mode: fly to / orbit current target |
| L | Auto land: approach, glide, flare, touchdown, rollout |
| V | Cockpit / chase view (RMB free-look in cockpit) |
| Space | Fire missile (needs lock for homing) |
| LMB / Left Ctrl | Gun |
| F | Flares (deflect incoming missiles) |
| Tab | Cycle target |
| Esc | Toggle cursor |
| R | Restart after mission failed |
- Takeoff from the island airbase (runway spawn); land with gear down, slow and gentle, anywhere flat — belly landing is fatal.
- Automation: T = auto takeoff (throttle, roll, rotate, climb-out, then AP); P = autopilot altitude/heading hold; O = AP waypoint (intercept and orbit the current target); L = auto land (picks runway direction, 2.5 km approach fix, horizontal-distance glide slope with terrain protection, sink-rate flare, touchdown, rollout, go-around on overshoot). Any stick input aborts and hands back manual control.
- Bandits patrol, pursue, evade, and fire guns; when tailed they launch homing missiles — watch for the MISSILE warning with bearing arrows and pop flares (F) or outmaneuver.
- Wave-based scoring: +100 per kill, +250 per wave clear, +8 missiles per wave.
- Procedural sound: engine (throttle/AB-linked), lock seek/lock tones, missile alert, gun, explosions.
Open Builds/SkyStrike.app directly.
- Open the project, then run menu: Sky Strike > 1. Setup Scene
(creates
Assets/Scenes/SkyStrike.unity; already generated in this repo) - Open the SkyStrike scene and press Play
Menu Sky Strike > Dev (all off by default, memory-only flags):
| Toggle | Effect |
|---|---|
| Auto Takeoff On Start | Engage T 2s after play |
| Auto Land After Takeoff | After climb-out, engage L (T→L loop) |
| Start On Final Approach | Teleport to 2.2 km final + auto land |
| Log Auto Land | 1 Hz [AutoLand] console logs |
| No Enemies | Skip combat waves |
| Terrain Diagnostics | One-shot terrain/sky dump at start |
| Reset All Dev Flags | Clear everything |
# Regenerate scene + ProBuilder jet prefabs (batch run)
unity run /path/to/IslandExplorer --non-interactive -- \
-executeMethod SkyStrikeSetup.SetupScene \
-logFile /path/to/IslandExplorer/Builds/skystrike_setup.log
# Build macOS player
unity build /path/to/IslandExplorer --non-interactive \
--target StandaloneOSX \
--execute-method SkyStrikeSetup.BuildMacOSNote: the
unity command/evallive-Editor workflow (com.unity.pipeline) currently cannot bind its HTTP server on this machine (Mono HttpListener wildcard-bind failure on ports 7800-7849);Assets/Editor/PipelineServerBootstrap.csretries the server start automatically when the environment allows it.
Assets/
Scripts/SkyStrike/
SkyStrikeGameManager.cs - Orchestrator: world, waves, score, game over
FlightController.cs - Flight + ground + auto land (approach/final/flare)
SkyStrikeDev.cs - Runtime dev flags (defaults all false)
ChaseCamera.cs - Chase cam + cockpit view (V), post FX + SMAA
WeaponSystem.cs - Lock-on, missiles, gun, flares
Missile.cs - Homing missile (player & enemy variants)
EnemyAI.cs - Bandit AI: patrol / pursue / evade / missile shots
ThreatWarningSystem.cs - Incoming-missile tracking + flare deflection
SkyStrikeHUD.cs - AC-style HUD (lock, warnings, gear, rwy guide)
SfxManager.cs - Sound playback (engine/lock/alert/one-shots)
ProceduralAudio.cs - Synthesized clips (no audio assets)
AfterburnerFX.cs - Throttle-driven additive AB flames
LandingGearVisual.cs - Gear extend/retract animation
JetModelFactory.cs - Loads Blender FBX prefabs (procedural fallback)
JetMeshBuilder.cs - Loft + prism geometry (fallback path)
AirbaseBuilder.cs - Ground scene: site pick, terrain flatten, runway
SkyEnvironment.cs - Air scene: billboard cloud clusters
ExplosionFX.cs - Particle explosions, tracers
Editor/
SkyStrikeSetup.cs - Scene creation + macOS build (CLI entry points)
SkyStrikeDevMenu.cs - Editor menu for SkyStrikeDev flags
JetModelingTool.cs - ProBuilder jet modeling -> prefab assets
JetTexturePainter.cs - Procedural F-15 skin textures (panel/rivet/grime)
RealismSetup.cs - HDRI skybox, HDR, post volume, import settings
PipelineServerBootstrap.cs - Retries com.unity.pipeline server startup
Resources/Prefabs/Jets/ - PlayerJet / EnemyJet (ProBuilder prefabs)
Resources/Textures/Jets/ - Painted F-15 skin (albedo/normal/mask)
Resources/Textures/Terrain/ - Terrain PBR textures (Poly Haven CC0)
Textures/Sky/ - HDRI sky (Poly Haven CC0)
Materials/Jets/ - Jet material assets
Materials/CloudSprite.shader - Transparent cloud billboard shader
Scenes/
SkyStrike.unity - Sky Strike scene
Sky Strike reuses IslandTerrain, OceanRenderer, and PropPlacer from
Island Explorer for its 2048m island backdrop. download_realism.py
fetches the HDRI sky and terrain textures from Poly Haven (CC0).