# Projectile Prefab Pattern

This manual explains how bullets and projectiles are built.

Current projectile prefabs:

```text
Assets/Prefabs/Combat/Rika_Bullet.prefab
Assets/Prefabs/Combat/Wizard_bullet.prefab
```

Current projectile scripts:

```text
Assets/Scripts/Combat/Bullet.cs
Assets/Scripts/Combat/EnemyProjectile.cs
```

## Core Rule

Projectiles are spawned. They are not permanently attached to characters.

Correct:

```text
Rika has PlayerShooter
Rika has FirePoint
PlayerShooter references Rika_Bullet.prefab
Attack input instantiates bullet at FirePoint
```

Wrong:

```text
Rika
└── Rika_Bullet permanently attached
```

## Player Bullet Pattern

Player bullet:

```text
Rika_Bullet
├── Transform
├── SpriteRenderer
├── Rigidbody2D
├── Collider2D trigger
└── Bullet
```

Spawned by:

```text
PlayerShooter
```

Expected behavior:

```text
Spawn at Rika/FirePoint
Move horizontally
Damage enemies
Disappear after hit
Disappear after lifetime
Cost 1 Fuel per shot
```

## Enemy Projectile Pattern

Enemy bullet:

```text
Wizard_bullet
├── Transform
├── SpriteRenderer
├── Rigidbody2D
├── Collider2D trigger
└── EnemyProjectile
```

Spawned by:

```text
WizardShooter
```

Expected behavior:

```text
Spawn at Witch/FirePoint
Move horizontally
Damage Rika
Disappear after hit
Disappear after lifetime
```

## Required Components

Projectile prefab should have:

```text
SpriteRenderer
Rigidbody2D
Collider2D
Projectile script
```

Recommended collider:

```text
Is Trigger: true
```

Recommended Rigidbody2D:

```text
Gravity Scale: 0
Collision Detection: appropriate for speed
```

## Movement Rule

Projectile movement should be controlled by its script.

Example pattern:

```text
Init(direction)
-> set local scale/flip if needed
-> set Rigidbody2D linear velocity
```

Do not move projectiles by manually dragging them in the scene.

## Direction Rule

Direction should come from the shooter.

Rika:

```text
PlayerShooter checks Rika facing direction
Bullet.Init(direction)
```

Witch:

```text
WizardShooter checks SpriteRenderer.flipX
EnemyProjectile.Init(direction)
```

For Witch, facing direction is locked once attack starts, so bullet direction should not change mid-animation.

## Lifetime Rule

Projectiles should clean themselves up.

Use:

```text
Destroy(gameObject, lifetime)
```

Why:

```text
Bullets that never destroy themselves slowly fill the scene and hurt performance.
```

## Hit Rules

Player bullet should:

```text
Damage enemy
Destroy itself on hit
Destroy itself on ground or obstacle if desired
Ignore player
```

Enemy projectile should:

```text
Damage Rika
Destroy itself on hit
Destroy itself on ground
Ignore enemy owner where possible
```

## Tags And Components

Prefer component checks over only tag checks when applying damage.

Good:

```text
Find EnemyHealth
Call TakeDamage
```

Good:

```text
Find PlayerFuel
Call TakeDamage
```

Tags can help classify objects, but damage should be applied through the health/fuel component.

## Sorting Layer

Projectiles should usually render in front of characters or as effects.

Recommended:

```text
Sorting Layer: Effects
```

If a projectile is hidden behind characters or ground, check:

```text
SpriteRenderer Sorting Layer
Order in Layer
Camera view
Scale
Sprite assigned
```

## FirePoint Rules

FirePoint is a position marker.

Rika:

```text
Rika
└── FirePoint
```

Witch:

```text
Witch
└── FirePoint
```

FirePoint should not have projectile behavior. It only marks where the projectile appears.

## Checklist For New Projectile

```text
Prefab is under Assets/Prefabs/Combat
Script is under Assets/Scripts/Combat
SpriteRenderer exists
Rigidbody2D exists
Collider2D exists
Collider is trigger if using OnTriggerEnter2D
Lifetime is set
Damage amount is set
Init(direction) or equivalent exists
Shooter prefab references projectile prefab
Shooter prefab has FirePoint assigned
Projectile tested against target and ground
```

## Summary

Projectile pattern:

```text
Shooter owns spawn timing.
FirePoint owns spawn position.
Projectile prefab owns movement, hit detection, damage, lifetime.
Target owns health/fuel response.
```
