godot-genre-battle-royale
0
总安装量
4
周安装量
安装命令
npx skills add https://github.com/thedivergentai/gd-agentic-skills --skill godot-genre-battle-royale
Agent 安装分布
opencode
4
gemini-cli
4
codex
4
github-copilot
3
kimi-cli
3
Skill 文档
Genre: Battle Royale
Expert blueprint for Battle Royale games with zone mechanics, large-scale networking, and survival gameplay.
NEVER Do
- NEVER sync all 100 players every frame â Use relevancy system: only sync players within visual range. Far players update at 4Hz, nearby at 20Hz+.
- NEVER make zone center fully random â New circle must overlap significantly with old circle, or players teleport. Limit offset to
current_radius - target_radius. - NEVER use client-side hit detection â Client says “I shot at direction X”, Server validates “Did it hit?”. Prevents cheating.
- NEVER spawn loot without pooling â 1000+ loot items cause GC spikes. Pool loot pickups and reuse instances.
- NEVER forget VisibilityNotifier3D for distant players â Disable
_process()and AnimationPlayer for players behind or far away. Saves 60-80% CPU.
Available Scripts
MANDATORY: Read the appropriate script before implementing the corresponding pattern.
kill_feed_bus.gd
Global elimination signal bus with match stat tracking. Single emission point for UI/logging, sorted killer rankings for end-game summary.
storm_system.gd
Dynamic zone shrinking with damage interpolation. Tweens center/radius smoothly, scales damage by zone size for end-game intensity.
Core Loop
- Deploy: Player chooses a landing spot from an air vehicle.
- Loot: Player scavenges weapons and armor.
- Move: Player runs to the safe zone to avoid taking damage.
- Engage: Player fights others they encounter.
- Survive: Player attempts to be the last one standing.
Skill Chain
| Phase | Skills | Purpose |
|---|---|---|
| 1. Net | godot-multiplayer-networking |
Authoritative server, lag compensation |
| 2. Map | godot-3d-world-building, level-of-detail |
Large terrain, chunking, distant trees |
| 3. Items | godot-inventory-system |
Managing backpack, attachments, armor |
| 4. Combat | shooter-mechanics, ballistics |
Projectile physics, damage calculation |
| 5. Logic | game-manager |
Managing the Storm/Zone state |
Architecture Overview
1. The Zone Manager (The Storm)
Manages the shrinking safe area.
# zone_manager.gd
extends Node
@export var phases: Array[ZonePhase]
var current_phase_index: int = 0
var current_radius: float = 2000.0
var target_radius: float = 2000.0
var center: Vector2 = Vector2.ZERO
var target_center: Vector2 = Vector2.ZERO
var shrink_speed: float = 0.0
func start_next_phase() -> void:
var phase = phases[current_phase_index]
target_radius = phase.end_radius
# Pick new center WITHIN current circle but respecting new radius
var random_angle = randf() * TAU
var max_offset = current_radius - target_radius
var offset = Vector2.RIGHT.rotated(random_angle) * (randf() * max_offset)
target_center = center + offset
shrink_speed = (current_radius - target_radius) / phase.shrink_time
func _process(delta: float) -> void:
if current_radius > target_radius:
current_radius -= shrink_speed * delta
center = center.move_toward(target_center, (shrink_speed * delta) * (center.distance_to(target_center) / (current_radius - target_radius)))
2. Loot Spawner
Efficiently populating the world.
# loot_manager.gd
func spawn_loot() -> void:
for spawn_point in get_tree().get_nodes_in_group("loot_spawns"):
if randf() < spawn_point.spawn_chance:
var item_id = loot_table.roll_item()
var loot_instance = loot_scene.instantiate()
loot_instance.setup(item_id)
add_child(loot_instance)
3. Deployment System
Transitioning from plane to ground.
# player_controller.gd
enum State { IN_PLANE, FREEFALL, PARACHUTE, GROUNDED }
func _physics_process(delta: float) -> void:
match current_state:
State.FREEFALL:
velocity.y = move_toward(velocity.y, -50.0, gravity * delta)
move_and_slide()
if position.y < auto_deploy_height:
deploy_parachute()
Key Mechanics Implementation
Zone Damage
Checking if player is outside the circle.
func check_zone_damage() -> void:
var dist = Vector2(global_position.x, global_position.z).distance_to(ZoneManager.center)
if dist > ZoneManager.current_radius:
take_damage(ZoneManager.dps * delta)
Networking Optimization
You cannot sync 100 players every frame.
- Relevancy: Only send updates for players within visual range.
- Frequency: Update far-away players at 4Hz, nearby at 20Hz+ (Server Tick).
- Snapshot Interpolation: Client buffers headers to play them back smoothly.
Godot-Specific Tips
- MultiplayerSynchronizer: Use
replication_intervalto lower bandwidth for distant objects. - VisibilityNotifier3D: Critical. Disable
_processand AnimationPlayer for players behind you or far away. - Occlusion Culling: Essential for large maps with buildings. Bake occlusion data.
- HLOD: Use Hierarchical Level of Detail for terrain and large structures.
Common Pitfalls
- Too Main Loot: Too much loot causes lag. Fix: Use object pooling for loot pickups.
- Camping: Players hide forever. Fix: The Zone forces movement. Also, anti-camping mechanics like “scan reveals” (optional).
- Cheating: Client-side hit detection. Fix: Authoritative server logic. Client says “I shot at direction X”, Server calculates “Did it hit?”.
Reference
- Master Skill: godot-master