"Sniper" is a 3D shooting range simulator developed in Unity. The core gameplay focuses on precision shooting at dynamic and physics-based targets. The project features an advanced control customization system with flexible key rebinding and a functional scene editor.
This project is a sniper shooting simulator built on the Unity engine using C#. The architecture emphasizes modularity and user experience customization.
Key Implemented Mechanics:
Shooting & Interaction System: A centralized shooting controller (ShootingController) manages hit logic and target interaction through an object identification system (ObjectIdentity). Targets support parameterized settings (e.g., movement speed and distance).
Advanced Target Types:
Kinematic Targets: The MovingTarget script implements smooth, configurable horizontal object movement using a mathematical function for seamless, jitter-free looping motion.
Physics-based Targets: The SpinnerPhysics component creates a target based on the Rigidbody and Hinge Joint physics. The object receives an initial torque and reacts realistically to impacts by getting additional physical impulses.
Dynamic Camera: The CameraMover system provides intelligent camera movement. The algorithm includes an avoidance mechanic — automatic obstacle detection using SphereCast and calculation of an alternative position to prevent the game view from being occluded by walls or other objects.
Control Customization: A full control settings screen was developed using UI Toolkit (SettingsUI). An interactive rebinding system is implemented: the user can click on an action button and reassign a key in real-time through an input waiting loop using Input.anyKeyDown. All assigned keys are serialized and saved via PlayerPrefs for persistent storage of user preferences.
Profile Management: The maps interface (MapsUI) integrates a player list editor using ListView. CRUD (Create, Read, Delete) operations for player profiles are implemented. All changes (additions, renaming, deletions) are instantly serialized to a binary data file via a custom SaveBinary helper, ensuring data persistence between game sessions.
The project demonstrates skills in working with Unity UI Toolkit, the physics engine, input systems, and data persistence patterns.