How To Make A 2D Shooter
Created with Inkfluence AI
Building a 2D shooter game using Unity
Table of Contents
- 1. Unity 2D Project Setup & Input
- 2. Player Movement, Aiming & Shooting
- 3. Enemy Spawning & Health System
- 4. Projectile Physics, Colliders & Damage
- 5. Debugging: Layers, Nulls & Performance
First chapter preview
A short excerpt from chapter 1. The full book contains 5 chapters and 3,892 words.
What happens when your 2D shooter feels “off” even though the sprite and animation look correct? In most cases, the cause is camera setup, sprite scale/pivot, or input wiring via Unity’s Input System (new input handling).
This section sets up a clean Unity 2D project structure, configures an orthographic camera for pixel-consistent movement, and wires player movement using Unity’s Input System.
OverviewUse this section when starting a new 2D shooter project or when input/camera behavior is inconsistent across machines. It covers: (1) project settings for 2D rendering, (2) camera configuration for orthographic viewing, (3) sprite import/pivot alignment, and (4) Input System code for movement using PlayerInput an InputAction.
Quick ReferenceCamera (2D)Transform.position.z = -10 (typical)
Player movement input: Vector2 move = context.ReadValue<Vector2>();
Unity Input System components:
PlayerInput (behavior: “Send Messages” or “Invoke Unity Events”)
InputActionAsset with an action named Move
Movement API: Rigidbody2D + rb.velocity = new Vector2(x, y) * speed;
Common axis mapping: WASD/Arrow keys -> gamepad left stick -> Vector2
ParametersParameter
Type
Required
Description
move
Vector2
Yes
2D movement vector from the Move action (X=left/right, Y=down/up).
speed
float
Yes
Units per second applied. Example default: 6.0.
useFixedUpdate
bool
No
applying
inputActionName
string
Yes
Name of the action inside. Example: "Move".
deadZone
float
No
Gamepad stick dead zone. Default: 0.125 (if configured in the action).
cameraSize
float
No
Orthographic size. The default depends on your world scale; start with that 5 for many 2D setups.
cameraZ
float
No
Camera Z position. Default: -10 for typical 2D scenes.
Code Exampleusing UnityEngine;
using UnityEngine.InputSystem;
[RequireComponent(typeof(Rigidbody2D))]
public class PlayerMovement2D : MonoBehaviour
{
[Header("Movement")]
[SerializeField] private float speed = 6.0f;
[Header("Input")]
[SerializeField] private string inputActionName = "Move";
private Rigidbody2D rb;
private Vector2 moveInput;
private InputAction moveAction;
private void Awake()
{
rb = GetComponent<Rigidbody2D>();
// Assumes you assigned an InputActionAsset via PlayerInput OR created one in code.
// If using PlayerInput, you can fetch the action from PlayerInput.actions.
var playerInput = GetComponent<PlayerInput>();
if (playerInput == null)
{
Debug.LogError("PlayerMovement2D requires a PlayerInput component on the same GameObject.");
enabled = false;
return;
}
moveAction = playerInput.actions[inputActionName];
if (moveAction == null)
{
Debug.LogError($"InputAction '{inputActionName}' not found in InputActionAsset.");
enabled = false;
return;
}
// Bind callbacks to capture input as it happens.
moveAction.performed += OnMove;
moveAction.canceled += OnMove;
}
private void OnDestroy()
{
moveAction.performed -= OnMove;
moveAction.canceled -= OnMove;
}
private void OnMove(InputAction.CallbackContext context)
{
// ReadValue<Vector2>() expects the action to be configured as a Vector2 control type.
moveInput = context.ReadValue<Vector2>();
}
private void FixedUpdate()
{
// Apply in FixedUpdate for stable physics movement.
Vector2 velocity = moveInput * speed;
rb.velocity = velocity;
}
}Response Format{
"project": {
"renderingMode2D": true,
"camera": {
"projection": "Orthographic",
"orthographic": true,
"transformPositionZ": -10
},
"player": {
"components": ["PlayerInput", "Rigidbody2D", "PlayerMovement2D"]
}
},
"input": {
"inputActionName": "Move",
"expectedValueType": "Vector2",
"bindings": [
{ "source": "Keyboard", "controls": ["W", "A", "S", "D"] },
{ "source": "Gamepad", "controls": ["LeftStick"] }
]
},
"movement": {
"speed": 6.0,
"applicationLoop": "FixedUpdate",
"movementVectorMapping": { "x": "left/right", "y": "down/up" }
}
}Notes & Best PracticesInput system value type must match code: ReadValue<Vector2>() requires the Move action to be configured for Value Type = Vector2; otherwise you’ll read zeroes or get binding warnings.
Physics timing: set velocity FixedUpdate() when using Rigidbody2D to avoid frame-rate-dependent movement.
Camera consistency: keep the camera orthographic and lock its Z position; changing orthographic size alters world-to-screen scale and affects perceived speed.
Sprite pivot/import: ensure sprites have consistent pivot points (often bottom-center for ground movement) and avoid mixed pivots that make
...
About this book
"How To Make A 2D Shooter" is a technical book by Anonymous with 5 chapters and approximately 3,892 words. Building a 2D shooter game using Unity.
This book was created using Inkfluence AI, an AI-powered book generation platform that helps authors write, design, and publish complete books. It was made with the AI Documentation Generator.
Frequently Asked Questions
What is "How To Make A 2D Shooter" about?
Building a 2D shooter game using Unity
How many chapters are in "How To Make A 2D Shooter"?
The book contains 5 chapters and approximately 3,892 words. Topics covered include Unity 2D Project Setup & Input, Player Movement, Aiming & Shooting, Enemy Spawning & Health System, Projectile Physics, Colliders & Damage, and more.
Who wrote "How To Make A 2D Shooter"?
This book was written by Anonymous and created using Inkfluence AI, an AI book generation platform that helps authors write, design, and publish books.
How can I create a similar technical book?
You can create your own technical book using Inkfluence AI. Describe your idea, choose your style, and the AI writes the full book for you. It's free to start.
Write your own technical book with AI
Describe your idea and Inkfluence writes the whole thing. Free to start.
Start writingCreated with Inkfluence AI