Initial import of HEROLL source and design documents
This commit is contained in:
@@ -0,0 +1,32 @@
|
||||
# Heroll 视觉与表现规范
|
||||
|
||||
本目录是面向美术、动画、特效、UI 和客户端开发的执行入口。定稿方向为:
|
||||
|
||||
> **高清像素绘本式桌面冒险**:玩法世界使用清晰的像素场景、角色和特效;HUD、弹窗、卡牌及角色立绘使用粗描边卡通语言。两层共享同一套轮廓、配色和形状语义。
|
||||
|
||||
## 使用顺序
|
||||
|
||||
1. 阅读 [完整 Art Bible](../docs/2026-08-13_art-bible-heroll-report.md)。
|
||||
2. 立项或派单时从 `specs/` 选择对应规则表。
|
||||
3. 美术初稿按缩略图、灰度、色弱、实机尺寸四项检查。
|
||||
4. 动画和 VFX 以逻辑事件为准,不以动画帧作为唯一伤害触发源。
|
||||
5. 所有送审素材必须附 `assetId / biome / gameplayRole / sourceFile / exportPreset`。
|
||||
|
||||
## 可编辑规则表
|
||||
|
||||
| 文件 | 用途 |
|
||||
|---|---|
|
||||
| [UI 组件](specs/ui-components.csv) | 尺寸、状态、描边、交互与九宫格规则 |
|
||||
| [角色和怪物](specs/character-monster-rules.csv) | 体型、轮廓、角色职责和动作集 |
|
||||
| [场景主题](specs/biome-rules.csv) | 六种生物群落的色彩、材质、前中后景和危险色 |
|
||||
| [动作与特效](specs/animation-vfx-timing.csv) | 时长、预警、命中停顿、层级和性能预算 |
|
||||
| [资源导入](specs/asset-import-rules.csv) | 命名、尺寸、纹理、图集、压缩和 Addressables |
|
||||
|
||||
## 不可破坏的五条规则
|
||||
|
||||
- 世界层只允许整数倍像素缩放;禁止双线性模糊。
|
||||
- 玩法颜色必须同时有形状或图标编码,不能只靠红绿区分。
|
||||
- 任意可点击组件在 1080×1920 基准画布上不得小于 96×96 px。
|
||||
- Boss 技能预警形状必须与实际伤害区域一致,关键预警不少于 500 ms。
|
||||
- 样本资源只用于分析,不进入发行包;角色、UI、怪物、场景和文案均重新创作。
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
event,evidence_or_target,total_duration_ms,anticipation_ms,active_ms,recovery_ms,hit_stop_ms,frame_or_tick_rule,vfx_layer,performance_budget,acceptance
|
||||
DiceNormal,evidence 1267,120,650,247,0,60Hz timeline; 12-18 visible drawings/sec,WorldUI,1 trail + 1 impact + result halo,Result remains still and readable >=250ms
|
||||
DiceDouble,evidence 1267,120,650,247,0,same base as normal; add unique final beat,WorldUI,normal budget + 1 double ring,Double cue readable without text
|
||||
MoveOneTile,target 140-180,20,90,40,0,integer pixel position at settle,World,1 foot dust burst,No subpixel blur at rest
|
||||
NormalAttack,evidence median combat 833,target 180-260,80-120,350-500,60-90,damage event on logical tick not animation callback,CharacterFront,<=80 live particles,Weapon pose crosses target at active window
|
||||
CriticalAttack,target 900-1150,220-300,100-140,400-550,100-140,one camera impulse <=10px,VFXFront,<=120 live particles + 1 flash,No full-screen white frame longer than 33ms
|
||||
BossAttack,evidence example 1017,>=500,100-250,250-600,120-180,tell/active/recovery separate config,GroundTell+Character+VFXFront,<=200 live particles,Warning area equals damage area within 4px logical
|
||||
BossTileStart,evidence 1000,250,300,450,0,locks dice input until settle,WorldUI,ring + crown + one burst,Current target remains visible
|
||||
BossDeathOpen,evidence 1183,150,350,683,180,logic victory occurs before cinematic,VFXFront,<=240 live particles,No reward modal before silhouette settles
|
||||
BattleEnter,evidence 2000,0,1200,800,0,skippable after first view,Camera+HUD,parallax only; no heavy particles,Repeat entry can accelerate to <=700ms
|
||||
BattleClear,evidence 750,0,250,500,100,result fixed before banner,HUDFront,1 banner burst + confetti <=3s,Reward values never animate before commit
|
||||
DamageNumber,evidence 667,0,80,587,0,merge same-source hits within 150ms,HUDFront,<=24 visible numbers,Does not cover boss tell or player HP
|
||||
CommonCardReveal,evidence 250,40,120,90,0,12-18 visible drawings/sec,ModalFront,1 rim light,Readable item icon by 180ms
|
||||
LegendCardReveal,evidence 633,120,250,263,0,extra hold and two-stage border,ModalFront,<=80 live particles,Longer than common but skip after reveal
|
||||
UIPrimaryPress,target 180,0,70,110,0,scale 100->94->102->100%,HUD,0 particles,Feedback starts within 50ms
|
||||
TileUnlock,target 300,40,120,140,0,node state commits before animation,WorldUI,ring <=48 particles,Path and node end in stable non-glowing state
|
||||
PhysicalSlash,target 180-300,40,80,100,60-90,sprite sheet or mesh trail; alpha then additive,CharacterFront,1 sheet + <=24 sparks,Direction matches weapon and hit normal
|
||||
HealEffect,target 500-800,80,250,300,0,green plus upward motion; no red,CharacterFront,<=60 particles,Visible on grass through white/cyan core
|
||||
ShieldEffect,target 300 in + persistent + 250 out,80,120,100,0,cyan hex/arc outline; persistent opacity <=45%,CharacterUnderlay,<=32 particles persistent,Body and weapon remain legible
|
||||
GroundTelegraph,target 500-1200,full tell,0,0,0,pulse frequency accelerates toward active,GroundTell,1 decal + <=24 edge particles,Shape survives colorblind and low-VFX mode
|
||||
|
||||
|
@@ -0,0 +1,15 @@
|
||||
asset_type,naming_pattern,source_format,export_format,authoring_size,unity_import,filtering,compression,atlas_or_group,pivot_or_slice,validation
|
||||
WorldCharacter,CHR_{id}_{skin}_{action}_{frame},Aseprite or PSD,PNG RGBA,96-192px logical height,Sprite Multiple; PPU32; mesh FullRect,Point no mipmaps,ASTC 6x6 Android / ASTC 6x6 iOS,Atlas_CHR_{family},feet pivot normalized y=0.08,All frames integer aligned; no edge alpha bleed
|
||||
Monster,MON_{biome}_{family}_{variant}_{action}_{frame},Aseprite or PSD,PNG RGBA,64-144px logical height,Sprite Multiple; PPU32,Point no mipmaps,ASTC 6x6,Atlas_MON_{biome},feet pivot normalized y=0.08,Silhouette and hostile accent check
|
||||
Boss,BOSS_{id}_{phase}_{action}_{frame},Aseprite or PSD,PNG RGBA,192x137 minimum logical box,Sprite Multiple; PPU32,Point no mipmaps,ASTC 4x4,Addressables/Boss_{id},feet pivot shared across every clip,No frame exceeds box without explicit socket update
|
||||
BiomeBack,ENV_{biome}_Back_{index},PSD layered,PNG RGB,1920x1080 source or 320x180 pixel base,Sprite Single; mipmaps optional,Point when pixel base otherwise Bilinear,ASTC 6x6,Addressables/Biome_{biome},center pivot,No alpha unless parallax cutout is required
|
||||
BiomeFront,ENV_{biome}_Front_{index},PSD layered,PNG RGBA,1920x1080 source or 320x180 pixel base,Sprite Single,Point when pixel base,ASTC 6x6,Addressables/Biome_{biome},bottom center,Playable edge has >=4px value separation
|
||||
Tile,UI_TILE_{type}_{state},PSD or vector master,PNG RGBA,256x256 source,Sprite Single,Point or Bilinear by family; never mixed in same atlas,ASTC 6x6,Atlas_UI_Tile,center pivot with 4px transparent safe edge,Recognizable at 64x64
|
||||
UI9Slice,UI_PANEL_{family}_{state},PSD or vector master,PNG RGBA,minimum 96x96 source,Sprite Single,Point or Bilinear by family,ASTC 6x6,Atlas_UI_Core,border >=12px; corners never scaled,Stress test at 50%-250% size
|
||||
Icon,ICON_{domain}_{id}_{state},PSD or vector master,PNG RGBA,256x256 source,Sprite Single,Bilinear no mipmaps,ASTC 6x6,Atlas_ICON_{domain},centered optical bounds,Readable at 48x48 and grayscale
|
||||
Portrait,PORT_{character}_{expression},PSD layered,PNG RGBA,1024x1024 or 1024x768,Sprite Single,Bilinear no mipmaps,ASTC 6x6,Addressables/Portraits,anchor eyes and pointer hand,Face readable at 160px height
|
||||
VFXSheet,VFX_{element}_{shape}_{variant},Aseprite or EmberGen sheet,PNG RGBA,64-256px cells; power-of-two sheet,Sprite Multiple,Point for pixel VFX; Bilinear for soft masks,ASTC 4x4,Atlas_VFX_{element},center or impact-origin pivot,Frame count and FPS stored in clip metadata
|
||||
Font,FONT_{family}_{weight},OTF or TTF,TMP asset,CJK dynamic source + 4096 atlas,TMP Dynamic,Linear,R8 or platform default,Group_Font_{locale},fallback chain defined,No missing glyphs in zh-Hans zh-Hant en ja ko
|
||||
Animation,ANIM_{assetId}_{action}_{variant},Unity clip or Aseprite tags,AnimationClip,60Hz timeline,n/a,n/a,n/a,Controller_{assetId},events are presentation-only,No damage or reward logic depends solely on clip event
|
||||
Material,MAT_{domain}_{blend}_{variant},ShaderGraph or material,Unity Material,n/a,SRP Batcher compatible,n/a,n/a,Group_Materials,n/a,Keywords <=4 and mobile variant provided
|
||||
|
||||
|
@@ -0,0 +1,8 @@
|
||||
biome,primary_palette,secondary_palette,material_motif,back_layer,mid_layer,front_play_layer,hazard_color,ambient_motion,prohibited_conflict
|
||||
Grass,#2F315F #452283,#593994 #6DBB69,wood moss banner,soft forest silhouettes and starry violet sky,castle walls pines and hanging flags,dark green turf and readable stone edge,#F0B84B,fireflies 0.15Hz; banner sway 1.5Hz,Do not use hazard green against turf
|
||||
Desert,#C9AF60 #A78140,#66B5D2 #AAD1AE,sandstone cloth cactus,bright sky dunes and heat haze,sandstone fort purple flags and torches,warm sand with dark contact strip,#D94B50,heat shimmer <=8px; drifting dust,Gold path needs dark violet edge
|
||||
Volcano,#4B232B #77282C,#9D3236 #F36A2D,basalt lava iron,red mountain silhouettes and lava fissures,black-red fortress chains and embers,near-black basalt with orange cracks,#FFD34D,embers 0.3-0.8Hz; lava flow slow,Danger red must be yellow-core plus shape
|
||||
Stone,#242630 #34313C,#534D61 #685E79,slate ruins chains,layered cliffs in fog,heavy gray walls crates and rubble,cool slate floor with violet separation,#F29A3D,fog drift; occasional dust fall,Do not let UI slate merge into background
|
||||
Abyss,#251D47 #4D256A,#7F317F #A43E74,obsidian crystal void,haunted castle and magenta horizon,dark purple wall skull banners and cyan runes,black-violet floor with luminous seams,#52D9FF,slow rune pulse and upward motes,Magenta rewards require cyan/white outline
|
||||
Snow,#29527D #4483C9,#519FEA #86C2F3,ice stone pine,blue mountains and layered cloud,pale blue fortress snowcaps and orange torches,snow plane with navy contact shadows,#FF7A45,snow drift diagonal; breath puffs,White VFX require navy outline or additive cyan core
|
||||
|
||||
|
@@ -0,0 +1,15 @@
|
||||
asset_class,gameplay_role,world_base_box,screen_scale,silhouette_rule,shape_language,palette_rule,required_actions,special_readability,acceptance
|
||||
PlayerSword,balanced melee,96x96,1.00,weapon diagonal visible beyond body,triangle blade + round body,1 dominant + 1 accent + skin/metal neutral,idle/run/attack/hit/death/victory/skill,attack arc must read at 25% scale,Recognizable from black silhouette in <=2 seconds
|
||||
PlayerAxe,heavy burst,104x104,1.05,wide shoulders and oversized axe,square torso + wedge weapon,warm accent; lowest attack-speed cue,idle/run/attack/hit/death/victory/skill,anticipation visibly longer than sword,Distinct from sword in grayscale
|
||||
PlayerSpear,fast reach,96x112,1.00,long horizontal or 30-degree spear line,thin rectangle + diamond tip,cool accent; motion trail narrow,idle/run/attack/hit/death/victory/skill,hit point appears beyond body radius,Weapon never disappears behind body
|
||||
GuidePortrait,tutorial and narrative,760x520 UI only,n/a,head/hands/prop define pose,rounded friendly forms,shares player UI palette; max 5 local colors,neutral/point/celebrate/warn/disappointed,pointer direction aligns with target,Expression readable at 160px high
|
||||
SwarmEnemy,quantity pressure,64x64,0.65,one exaggerated feature,round or triangle single-mass,biome local color + one hostile accent,idle/move/attack/hit/death,low visual noise; no large shadow,20 units remain individually trackable
|
||||
NormalMelee,baseline threat,88x88,0.90,weapon and head separated,square body + short triangle weapon,biome local + red hostile eye,idle/move/attack/hit/death,attack facing readable before contact,Not confused with player at silhouette level
|
||||
RangedEnemy,line threat,80x96,0.90,projectile tool extends from body,thin body + straight line motif,biome local + cyan or orange projectile,idle/move/attack/hit/death,projectile origin and direction unambiguous,Projectile visible over every biome
|
||||
RushEnemy,dash threat,96x80,1.00,forward-heavy center of mass,wedge or horned triangle,high-value warm accent,idle/prepare/rush/hit/death,prepare pose >=500ms before dash,Dash path matches warning strip
|
||||
CurvedEnemy,arc threat,88x104,0.95,raised launcher or curved horn,crescent motif,biome local + violet projectile,idle/move/attack/hit/death,arc landing point visible,Arc never uses same tell as straight shot
|
||||
RestSupport,support/control,80x96,0.85,staff/banner above head,vertical line + circle,low-saturation body + bright status icon,idle/cast/hit/death,cast target linked by beam or icon,Support function readable before stats panel
|
||||
Elite,modified threat,112x112,1.20,base family plus one persistent landmark,base shape + asymmetric modifier,base palette + silver or magenta elite mark,base actions + entrance + break,modifier not only hue shift,Visible elite cue in grayscale and colorblind test
|
||||
MidBoss,encounter anchor,144x128,1.50,two landmarks and larger negative space,paired shapes or asymmetric armor,biome palette + unique high-chroma accent,idle/2 attacks/hit/break/death/entrance,unique floor shadow and nameplate,Not mistaken for scaled normal enemy
|
||||
Boss,stage climax,192x137 minimum,2.00-2.30,three-part silhouette with one iconic prop,unique motif tied to mechanic,max 6 local colors + phase accent,idle/3 attacks/hit/phase/break/death/entrance,each attack has distinct pose and ground shape,Recognizable as 32x32 silhouette; phase change visible without UI
|
||||
|
||||
|
@@ -0,0 +1,15 @@
|
||||
component,layer,reference_size_1080x1920,minimum_hit_area,outline,corner_radius,states,color_role,content_rule,motion_rule,acceptance
|
||||
TopResourceChip,HUD,220x72,220x72,4px tinted ink,16px,normal/change/insufficient,currency,icon+value; max 7 digits; use compact suffix after 999999,change pulse 180ms; value roll 300ms,No clipping in CJK and 200% value test
|
||||
PrimaryButton,HUD or Modal,360x112,360x112,6px outer + 2px inner highlight,20px,normal/hover/pressed/disabled/locked,primary gold or cyan,verb first; maximum 6 Chinese characters,press 70ms down + 110ms rebound,Disabled state still readable at 4.5:1
|
||||
SecondaryButton,HUD or Modal,240x96,240x96,5px outer,18px,normal/pressed/disabled,slate violet,icon optional; never compete with primary,press 60ms down + 100ms rebound,Primary remains dominant in grayscale
|
||||
DangerButton,Modal,240x96,240x96,5px outer,18px,normal/pressed/disabled,danger crimson,must include destructive verb and icon,press 60ms; no idle pulse,Not used for ordinary exit or back
|
||||
ModalPanel,Modal,880xAuto,n/a,8px outer + 3px inner bevel,28px,enter/idle/exit,panel violet,one decision per modal; max two primary choices,enter 220ms overshoot; exit 160ms,Background dim 58-68%; no stacked modal
|
||||
TutorialBubble,Modal,820x220,n/a,6px outer + 2px inner,24px,enter/idle/advance,warm parchment or violet,one sentence; highlight one keyword only,type or fade 180-260ms; pointer bounce 600ms,Pointer targets current control; text <= 44 Chinese chars
|
||||
BoardNode,WorldUI,132x132,132x132,6px outer,50%,locked/current/cleared/reward/boss,node semantic,icon + ring + state badge; no text inside,unlock 300ms; reward pulse 900ms; current breathe 1200ms,Recognizable at 64x64 thumbnail
|
||||
PathRibbon,WorldUI,72px width,n/a,4px shadow edge,36px,current/cleared/locked,path gold,current path saturated; cleared desaturated 25%,flow sweep 600ms only on unlock,Never overlaps tappable node center
|
||||
TileCard,Choice,320x440,320x440,7px outer + quality frame,24px,normal/focused/selected/disabled,quality dual-code,title + icon + 2-line effect + cost,deal 180ms stagger; select 220ms,All candidates visible without horizontal scroll
|
||||
RewardCard,Reward,280x390,280x390,7px outer + quality frame,24px,hidden/reveal/claimed,quality dual-code,icon occupies 52-60%; quantity bottom-right,common flip 250ms; legendary 633ms,Quality readable without glow and without color
|
||||
StatusIcon,CombatHUD,72x72,88x88,3px outer,16px,active/expiring/stacked,status semantic,icon + stack count; timer ring outside,enter 120ms; expiry flash 300ms,At most 6 expanded; overflow collapses
|
||||
BossGauge,CombatHUD,760x64,n/a,5px outer,20px,normal/phase/break/danger,boss crimson or biome accent,name + phase marks + HP; no decorative text,phase break 350ms; damage lag 220ms,Readable over all six biome palettes
|
||||
Toast,HUD,680x92,n/a,4px outer,18px,info/success/warning/error,semantic neutral,one line + icon; no input,enter 180ms; hold 1400ms; exit 160ms,Does not cover dice button or boss tell
|
||||
|
||||
|
Reference in New Issue
Block a user