vampire-like/CLAUDE.md

5.1 KiB

CLAUDE.md

This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.

Project Overview

VampireLike is a Unity 2022.3 LTS action survival game project using a GameMain + GameFramework layered architecture. The project uses C# with 4-space indentation, K&R braces, and UTF-8 with BOM encoding.

Build & Development Commands

  • Open in Unity Editor: Unity -projectPath .
  • Open solution in IDE: VampireLike.sln
  • Run from Launcher scene: Open Assets/Launcher.unity in Editor and press Play
  • Run tests via Unity Editor: Window > General > Test Runner
  • Run EditMode tests via CLI: Unity -batchmode -projectPath . -runTests -testPlatform editmode -quit -logFile Logs/editmode-tests.log

Architecture

Code Organization

  • Assets/GameMain/Scripts/ - Game business code (UI, Entity, Procedure, Events, DataTable)
  • Assets/GameFramework/ - Shared framework/runtime and editor extensions
  • Assets/Plugins/ - Third-party plugins (e.g., DOTween)
  • Assets/Launcher.unity - Entry point scene

GameFramework (Base Framework)

The framework provides modular components accessible via GameEntry.<ComponentName>:

  • GameEntry.Event - Event system (subscribe/unsubscribe pattern)
  • GameEntry.Entity - Entity management (show/hide/instantiate pooled objects)
  • GameEntry.UI - UI form management
  • GameEntry.DataTable - Data table loading
  • GameEntry.Procedure - Finite state machine procedures
  • GameEntry.Resource - Resource loading
  • Other components: Config, Scene, Sound, Setting, ObjectPool, Fsm, etc.

GameEntry is partially generated. Custom components are initialized in GameEntry.Custom.cs.

UI Architecture (Controller/UseCase/View Pattern)

UI forms follow a layered pattern in Assets/GameMain/Scripts/UI/:

  • Controller - Inherits UIFormControllerCommonBase<Context, Form>. Handles input events, subscribes to game events, manages UI lifecycle
  • UseCase - Business logic layer (e.g., ShopFormUseCase). Pure logic without Unity dependencies
  • View - MonoBehaviour UGuiForm. Handles presentation only

Context objects (e.g., ShopFormContext) carry display data to the View layer.

Entity System

Entities are game objects managed by GameEntry.Entity:

  • Assets/GameMain/Scripts/Entity/EntityLogic/ - Entity classes (Player, Enemy, Weapon, Coin, Exp, Effect)
  • Assets/GameMain/Scripts/Entity/EntityData/ - Entity data objects (spawn configuration)
  • Weapon attack effects implement IWeaponAttackEffect interface
  • Target selectors implement ITargetSelector (NearestTargetSelector, LowestHealthTargetSelector, HighestHealthTargetSelector)

Simulation System (ECS-like)

Assets/GameMain/Scripts/Simulation/SimulationWorld.cs provides a data-oriented simulation layer:

  • Separates simulation data (*SimData structs) from presentation (MonoBehaviour entities)
  • Uses SimulationWorld.Tick() to advance simulation state
  • Data flows through: JobDataChannel -> Jobs (enemy/projectile/collision logic) -> OutputCommit -> Presentation sync
  • Enemy separation uses spatial indexing and temporal avoidance
  • Tests in Assets/Tests/Simulation/ validate simulation behavior

Component Pattern

Gameplay components in Assets/GameMain/Scripts/Components/:

  • MovementComponent - Handles movement with direction/speed
  • AttackComponent - Attack logic
  • HealthComponent - HP management
  • StatComponent - Stats with modifiers (additive/multiplicative)
  • AbsorbComponent - Pickup absorption
  • InputComponent - Player input
  • BackpackComponent - Inventory

Components use OnInit() initialization and OnUpdate() per-frame logic.

Procedure System

Procedures in Assets/GameMain/Scripts/Procedure/ manage game flow state machine:

  • ProcedureStartMenu - Menu scene
  • ProcedureStressTest - Stress test mode
  • Procedures transition via GameEntry.Procedure

Data Tables

Data tables in Assets/GameMain/Scripts/DataTable/ (DR prefix = Data Row):

  • DRBullet, DREnemy, DREntity, DRGoods, DRLevel, DRLevelRarity, DRLevelUpReward, DRMusic, DRProp, DRRole, DRScene, DRSound, DRUIForm, DRUISound, DRWeapon
  • Loaded via GameEntry.DataTable

Events

Custom events in Assets/GameMain/Scripts/CustomEvent/ follow *EventArgs naming. Subscribe via GameEntry.Event.Subscribe(EventArgs.EventId, handler).

Enum Definitions

Enums in Assets/GameMain/Scripts/Definition/Enum/: BulletType, CampType, EnemyType, GoodsType, ItemRarity, RelationType, StatType, UIFormType, WeaponType

Coding Conventions

  • C# with 4-space indentation, K&R braces
  • One main type per file, file name matches type name
  • PascalCase for public types/members, camelCase for locals/parameters
  • [SerializeField] private for Inspector exposure
  • Always preserve .meta files for Unity asset GUID references

Testing

Tests use com.unity.test-framework (NUnit). Place tests in:

  • Assets/Tests/ - General tests
  • Assets/Tests/Simulation/EditMode/ - EditMode simulation tests
  • Assets/Tests/Simulation/PlayMode/ - PlayMode simulation tests
  • Name test files *Tests.cs

Run via Unity Test Runner (Window > General > Test Runner) or CLI.

Ignore (Do Not Commit)

Library/, Temp/, Logs/, obj/, UserSettings/