영웅 목록 = 눈 줄 맞춤 + 너무 위에 뜨던 12종 크기 조금 키움 · 보는 방향 2차(원술·허저 반전 · 축융 되돌림) · 소교·초선 얼굴·소품 차별화(#1108 · PD 2026-11-10)

PD: 「전위, 태사자 등과 같이 영웅 목록에서 위치가 너무 위쪽에 등장하는 영웅은 위치를 조금 더 내리고 크기를 약간 더 키워」 · 「여전히 방향이 반대로 되어 있는 유닛 체크」 · 「소교와 초선은 복장·헤어는 좋으나 생김새·소품(부채)이 너무 같다」
- 원인: 카드가 머리 끝(관·투구 꼭대기)을 맞춰서 관·투구가 낮은 유닛은 얼굴이 위로 뜸(카드 위 눈 높이 기존 중앙 216.5 · 허저 −62 · 전위 −48 · 태사자 −31 px)
- 크기 표 eye_up_px(대기 그림 눈 높이 · 발 위 px · 자동 + 장비·하후돈·축융 수동) → UnitArt.EyeUpPx → HeroScreens 카드 = 눈 줄(걷는 216 · 기병 210 = 기존 20종 중앙값) 맞춤 · 없으면 머리 끝 맞춤
- 25 px 넘게 높던 12종 adjust × 0.95(5 % 크게)
- 방향 판정 = 두 눈 가운데 ↔ 얼굴 피부 폭 가운데(머리 실루엣은 투구·끈에 속음) + 확대 확인 → 원술·허저 반전 · 축융 = 1차 반전이 오판이라 되돌림 · 출발·돌진 = 왼쪽 0
- 소교 = 동그란 얼굴·발그레 볼·밝은 웃음 + 대나무 피리 · 초선 = 가는 아몬드 눈·붉은 입술 + 춤 비단 리본(옷·머리 문장 그대로 · seed 51~54 중 · QA PASS B 0)
- 테스트(고친 부분만): UnitArt_SizeTable · Lobby_Tabs_Back_ComingSoon · UILayerTests 각 1/1 · error 0 · 캡처 hero_list

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
깃 관리자 2026-11-10 13:13:46 +09:00
parent 5edd87badb
commit 8534ef88ab
21 changed files with 184 additions and 151 deletions

View File

@ -1,128 +1,128 @@
art,mounted,eye_px,face_px,head_px,crown_px,body_px,size_px,lock,adjust,note art,mounted,eye_px,eye_up_px,face_px,head_px,crown_px,body_px,size_px,lock,adjust,note
cc_archer,0,125.1,250,444.0,249.0,744,736.3,1,, cc_archer,0,125.1,474.3,250,444.0,249.0,744,736.3,1,,
cc_boss_bianxi,0,172.1,471,556.0,266.0,835,1010.0,,1.05, cc_boss_bianxi,0,172.1,560.5,471,556.0,266.0,835,959.0,,0.997,
cc_boss_caiyang,1,91.1,184,352.0,198.0,847,556.4,,, cc_boss_caiyang,1,91.1,641.0,184,352.0,198.0,847,556.4,,,
cc_boss_caocao,0,135.0,288,446.0,260.0,808,794.6,1,, cc_boss_caocao,0,135.0,519.6,288,446.0,260.0,808,794.6,1,,
cc_boss_caohong,0,155.4,335,546.0,304.0,843,1013.1,,1.12, cc_boss_caohong,0,155.4,513.7,335,546.0,304.0,843,1013.1,,1.12,
cc_boss_caoren,0,148.1,303,519.0,282.0,829,984.4,,1.15, cc_boss_caoren,0,148.1,515.2,303,519.0,282.0,829,984.4,,1.15,
cc_boss_chezhou,0,133.1,304,424.0,249.0,804,772.1,,, cc_boss_chezhou,0,133.1,490.6,304,424.0,249.0,804,772.1,,,
cc_boss_chunyudao,0,125.6,264,497.0,256.0,829,874.9,,1.15, cc_boss_chunyudao,0,125.6,483.7,264,497.0,256.0,829,874.9,,1.15,
cc_boss_gaolan,0,119.4,251,462.0,229.0,772,806.5,,1.15, cc_boss_gaolan,0,119.4,457.9,251,462.0,229.0,772,806.5,,1.15,
cc_boss_hanfu,0,131.8,316,525.0,246.0,815,808.5,,, cc_boss_hanfu,0,131.8,525.9,316,525.0,246.0,815,808.5,,,
cc_boss_kongxiu,0,159.0,326,725.0,317.0,875,1066.5,,1.12, cc_boss_kongxiu,0,159.0,515.0,326,725.0,317.0,875,1066.5,,1.12,
cc_boss_lidian,0,124.7,260,451.0,258.0,814,846.8,,1.15, cc_boss_lidian,0,124.7,453.1,260,451.0,258.0,814,846.8,,1.15,
cc_boss_liudai,0,118.3,258,487.0,227.0,774,778.4,,1.12, cc_boss_liudai,0,118.3,461.8,258,487.0,227.0,774,778.4,,1.12,
cc_boss_lvkuang,1,92.2,193,372.0,201.0,903,576.0,,, cc_boss_lvkuang,1,92.2,629.7,193,372.0,201.0,903,576.0,,,
cc_boss_lvxiang,1,89.7,185,340.0,202.0,863,542.5,,, cc_boss_lvxiang,1,89.7,628.5,185,340.0,202.0,863,542.5,,,
cc_boss_maojie,0,139.3,330,448.0,292.0,804,849.2,,, cc_boss_maojie,0,139.3,485.9,330,448.0,292.0,804,849.2,,,
cc_boss_mengtan,1,95.6,185,363.0,204.0,853,578.7,,, cc_boss_mengtan,1,95.6,643.7,185,363.0,204.0,853,578.7,,,
cc_boss_qinqi,0,122.5,254,449.0,246.0,814,837.5,,1.15, cc_boss_qinqi,0,122.5,457.0,254,449.0,246.0,814,837.5,,1.15,
cc_boss_wangzhi,0,135.3,322,553.5,255.0,811,826.7,,, cc_boss_wangzhi,0,135.3,504.0,322,553.5,255.0,811,826.7,,,
cc_boss_wangzhong,0,125.2,269,450.0,247.0,783,847.6,,1.15, cc_boss_wangzhong,0,125.2,480.0,269,450.0,247.0,783,847.6,,1.15,
cc_boss_xiahoudun,1,103.4,0,0,0,867,608.6,,,눈 수동 실측 2026-11-10: 왼눈 x 408.0 · 오른눈 = 수염 가운데 459.7 대칭 511.4(안대) cc_boss_xiahoudun,1,103.4,621.6,0,0,0,867,608.6,,,눈 수동 실측 2026-11-10(눈 간격·눈 높이): 왼눈 x 408.0 · 오른눈 = 수염 가운데 459.7 대칭 511.4(안대)
cc_boss_xiahouen,1,87.5,172,341.0,195.0,840,536.8,,, cc_boss_xiahouen,1,87.5,635.6,172,341.0,195.0,840,536.8,,,
cc_boss_xiahoujie,1,94.2,182,369.0,217.0,845,579.5,,, cc_boss_xiahoujie,1,94.2,617.7,182,369.0,217.0,845,579.5,,,
cc_boss_xuchu,0,154.9,353,487.0,189.0,854,1008.6,,1.18, cc_boss_xuchu,0,154.9,661.0,353,487.0,189.0,854,958.2,,1.121,
cc_boss_xuhuang,0,151.7,319,763.0,321.0,805,1011.8,,1.08, cc_boss_xuhuang,0,151.7,497.4,319,763.0,321.0,805,1011.8,,1.08,
cc_boss_yanming,0,112.0,239,425.0,233.0,786,799.7,,1.18, cc_boss_yanming,0,112.0,454.4,239,425.0,233.0,786,799.7,,1.18,
cc_boss_yujin,0,138.4,303,627.0,384.0,844,1059.0,,1.15, cc_boss_yujin,0,138.4,527.0,303,627.0,384.0,844,1059.0,,1.15,
cc_boss_zhanghe,0,112.3,228,477.0,235.0,853,793.0,,1.15, cc_boss_zhanghe,0,112.3,494.0,228,477.0,235.0,853,793.0,,1.15,
cc_cavalry,1,91.9,186,346.0,193.0,849,540.9,1,, cc_cavalry,1,91.9,594.3,186,346.0,193.0,849,540.9,1,,
cc_infantry,0,125.3,252,444.0,253.0,765,737.5,1,, cc_infantry,0,125.3,478.6,252,444.0,253.0,765,737.5,1,,
cc_spear,0,124.1,255,481.0,243.0,785,730.4,1,, cc_spear,0,124.1,469.7,255,481.0,243.0,785,730.4,1,,
chunyuqiong,1,96.0,190,411.0,191.0,917,620.3,,1.08, chunyuqiong,1,96.0,652.6,190,411.0,191.0,917,620.3,,1.08,
dianwei,0,167.4,413,551.0,269.0,843,1132.7,,1.2, dianwei,0,167.4,582.7,413,551.0,269.0,843,1076.1,,1.14,
diaochan,0,158.2,320,569.5,320.0,911,1006.6,,1.08, diaochan,0,123.8,459.4,251,514.5,244.0,771,796.1,,1.08,
dongxi,0,116.2,245,437.5,220.0,757,759.5,,1.12, dongxi,0,116.2,442.0,245,437.5,220.0,757,759.5,,1.12,
dongzhuo,0,120.9,448,517.0,442.0,931,1070.7,,1.05, dongzhuo,0,120.9,485.3,448,517.0,442.0,931,1070.7,,1.05,
dz_archer,0,123.3,257,448.5,251.0,745,725.7,1,, dz_archer,0,123.3,474.7,257,448.5,251.0,745,725.7,1,,
dz_boss_caoxing,0,140.7,310,585.0,274.0,804,957.6,,1.15, dz_boss_caoxing,0,140.7,482.5,310,585.0,274.0,804,957.6,,1.15,
dz_boss_chengong,0,157.8,376,532.0,290.0,892,980.1,,1.08, dz_boss_chengong,0,157.8,546.6,376,532.0,290.0,892,980.1,,1.08,
dz_boss_gaoshun,0,132.2,275,473.0,252.0,798,888.3,,1.15, dz_boss_gaoshun,0,132.2,504.6,275,473.0,252.0,798,888.3,,1.15,
dz_boss_huaxiong,0,116.7,263,444.0,230.0,774,827.7,,1.18, dz_boss_huaxiong,0,116.7,510.0,263,444.0,230.0,774,827.7,,1.18,
dz_boss_huzhen,1,87.5,183,344.0,184.0,836,538.6,,, dz_boss_huzhen,1,87.5,639.3,183,344.0,184.0,836,538.6,,,
dz_boss_lvbu,1,75.8,173,387.5,123.0,819,446.1,1,, dz_boss_lvbu,1,75.8,547.8,173,387.5,123.0,819,446.1,1,,
dz_boss_zhangliao,1,95.7,203,430.0,197.0,876,582.6,,, dz_boss_zhangliao,1,95.7,586.6,203,430.0,197.0,876,582.6,,,
dz_cavalry,1,96.2,197,364.0,207.0,873,566.2,1,, dz_cavalry,1,96.2,630.9,197,364.0,207.0,873,566.2,1,,
dz_infantry,0,139.1,304,507.0,259.0,844,818.7,1,, dz_infantry,0,139.1,553.8,304,507.0,259.0,844,818.7,1,,
dz_spear,0,117.2,247,500.0,237.0,818,689.8,1,, dz_spear,0,117.2,495.9,247,500.0,237.0,818,689.8,1,,
guanping,0,132.9,306,540.0,239.0,770,878.2,,1.1, guanping,0,132.9,475.8,306,540.0,239.0,770,878.2,,1.1,
guanyu,0,122.7,287,568.5,214.0,725,722.2,1,, guanyu,0,122.7,463.4,287,568.5,214.0,725,722.2,1,,
guojia,0,147.2,366,528.0,267.0,854,969.6,,1.12, guojia,0,147.2,520.4,366,528.0,267.0,854,969.6,,1.12,
hanxuan,0,113.5,262,477.0,234.0,793,791.0,,1.12, hanxuan,0,113.5,476.2,262,477.0,234.0,793,791.0,,1.12,
hgj_archer,0,154.7,376,573.0,298.0,833,910.5,1,, hgj_archer,0,154.7,523.3,376,573.0,298.0,833,910.5,1,,
hgj_boss_chengyuanzhi,0,137.2,395,478.5,233.0,740,875.3,,1.1, hgj_boss_chengyuanzhi,0,137.2,481.2,395,478.5,233.0,740,875.3,,1.1,
hgj_boss_dengmao,0,146.1,346,515.0,250.0,803,894.4,,1.05, hgj_boss_dengmao,0,146.1,501.2,346,515.0,250.0,803,894.4,,1.05,
hgj_boss_guanhai,0,144.2,366,822.0,244.0,826,1075.6,,1.18, hgj_boss_guanhai,0,144.2,573.4,366,822.0,244.0,826,1021.8,,1.121,
hgj_boss_peiyuanshao,0,134.3,304,531.0,273.0,736,903.9,,1.1, hgj_boss_peiyuanshao,0,134.3,461.9,304,531.0,273.0,736,903.9,,1.1,
hgj_boss_zhangbao,0,155.7,371,548.0,258.0,804,907.1,,, hgj_boss_zhangbao,0,155.7,492.4,371,548.0,258.0,804,907.1,,,
hgj_boss_zhangjiao,0,147.8,341,524.0,341.0,854,869.9,1,, hgj_boss_zhangjiao,0,147.8,510.4,341,524.0,341.0,854,869.9,1,,
hgj_boss_zhangliang,0,160.1,370,649.0,269.0,882,1108.2,,1.15, hgj_boss_zhangliang,0,160.1,603.4,370,649.0,269.0,882,1052.3,,1.092,
hgj_cavalry,1,107.4,242,439.0,214.0,879,632.1,1,, hgj_cavalry,1,107.4,651.2,242,439.0,214.0,879,632.1,1,,
hgj_infantry,0,161.5,387,660.0,292.0,850,950.6,1,, hgj_infantry,0,161.5,553.1,387,660.0,292.0,850,950.6,1,,
hgj_spear,0,168.5,377,584.5,293.0,862,991.8,1,, hgj_spear,0,168.5,549.3,377,584.5,293.0,862,991.8,1,,
huangzhong,0,148.8,394,503.0,230.0,797,875.8,1,, huangzhong,0,148.8,517.9,394,503.0,230.0,797,875.8,1,,
jiangwei,0,114.2,245,481.0,230.0,804,790.6,,1.15, jiangwei,0,114.2,471.3,245,481.0,230.0,804,790.6,,1.15,
jianyong,0,164.8,367,515.0,257.0,786,906.8,,, jianyong,0,164.8,482.4,367,515.0,257.0,786,906.8,,,
jiaxu,0,146.4,334,468.0,269.0,843,968.1,,1.15, jiaxu,0,146.4,498.7,334,468.0,269.0,843,968.1,,1.15,
jinxuan,0,128.2,289,536.0,257.0,772,932.8,,1.2, jinxuan,0,128.2,482.8,289,536.0,257.0,772,932.8,,1.2,
jz_boss_caimao,0,131.1,278,511.0,248.0,805,902.4,,1.18, jz_boss_caimao,0,131.1,502.7,278,511.0,248.0,805,902.4,,1.18,
jz_boss_caixun,0,143.2,320,543.0,296.0,833,1027.4,,1.18, jz_boss_caixun,0,143.2,492.4,320,543.0,296.0,833,1027.4,,1.18,
jz_boss_caizhong,0,139.4,324,509.0,276.0,872,1006.3,,1.2, jz_boss_caizhong,0,139.4,577.6,324,509.0,276.0,872,956.0,,1.14,
jz_boss_chensun,0,111.4,235,394.0,219.0,749,767.7,,1.18, jz_boss_chensun,0,111.4,448.8,235,394.0,219.0,749,767.7,,1.18,
jz_boss_wenpin,0,117.1,260,429.5,243.0,822,851.4,,1.22, jz_boss_wenpin,0,117.1,492.1,260,429.5,243.0,822,851.4,,1.22,
jz_boss_zhangwu,1,84.7,177,332.0,188.0,862,521.2,,, jz_boss_zhangwu,1,84.7,664.4,177,332.0,188.0,862,521.2,,,
jz_boss_zhangyun,0,139.5,298,515.0,277.0,871,998.8,,1.2, jz_boss_zhangyun,0,139.5,553.4,298,515.0,277.0,871,998.8,,1.2,
lijue,1,93.4,182,384.0,185.0,901,557.5,,, lijue,1,93.4,626.5,182,384.0,185.0,901,557.5,,,
lingtong,0,139.3,414,585.0,285.0,853,1006.1,,1.1, lingtong,0,139.3,539.6,414,585.0,285.0,853,1006.1,,1.1,
liubei,0,142.2,373,478.0,243.0,752,837.0,1,, liubei,0,142.2,450.0,373,478.0,243.0,752,837.0,1,,
liufeng,1,95.8,192,364.0,202.0,851,580.1,,, liufeng,1,95.8,628.6,192,364.0,202.0,851,580.1,,,
lusu,0,158.0,418,485.0,244.0,777,905.3,,1.05, lusu,0,158.0,481.0,418,485.0,244.0,777,905.3,,1.05,
luxun,0,171.7,379,519.5,304.0,906,968.9,,, luxun,0,171.7,562.0,379,519.5,304.0,906,968.9,,,
lvmeng,0,147.3,309,501.0,262.0,824,944.9,,1.15, lvmeng,0,147.3,536.6,309,501.0,262.0,824,944.9,,1.15,
machao,1,85.6,166,396.0,174.0,845,517.8,,, machao,1,85.6,621.0,166,396.0,174.0,845,517.8,,,
menghuo,0,147.7,332,735.0,363.0,860,1076.2,,1.08, menghuo,0,147.7,531.8,332,735.0,363.0,860,1076.2,,1.08,
mizhu,0,153.5,423,589.0,252.0,800,980.9,,1.05, mizhu,0,153.5,485.4,423,589.0,252.0,800,980.9,,1.05,
pangtong,0,163.8,405,546.0,277.0,800,929.3,,, pangtong,0,163.8,500.1,405,546.0,277.0,800,929.3,,,
shu_archer,0,148.5,324,554.0,304.0,803,1024.4,,1.15, shu_archer,0,148.5,486.2,324,554.0,304.0,803,1024.4,,1.15,
shu_cavalry,1,95.2,187,361.0,197.0,848,575.9,,, shu_cavalry,1,95.2,598.8,187,361.0,197.0,848,575.9,,,
shu_infantry,0,140.1,309,524.0,287.0,881,993.0,,1.18, shu_infantry,0,140.1,580.7,309,524.0,287.0,881,993.0,,1.18,
shu_spear,0,116.3,263,519.0,243.0,807,851.2,,1.18, shu_spear,0,116.3,488.0,263,519.0,243.0,807,851.2,,1.18,
shu_strategist,0,134.0,328,460.0,251.0,789,816.7,,1.05, shu_strategist,0,134.0,476.6,328,460.0,251.0,789,816.7,,1.05,
sunce,1,96.1,192,345.0,195.0,907,565.4,,, sunce,1,96.1,629.1,192,345.0,195.0,907,565.4,,,
sunqian,0,151.7,400,460.0,266.0,838,852.8,,, sunqian,0,151.7,515.8,400,460.0,266.0,838,852.8,,,
sunquan,0,149.4,339,535.0,220.0,770,921.8,,1.05, sunquan,0,149.4,476.7,339,535.0,220.0,770,921.8,,1.05,
sunshangxiang,0,132.8,281,550.0,236.0,676,764.8,,, sunshangxiang,0,132.8,419.9,281,550.0,236.0,676,764.8,,,
taishici,0,146.9,403,632.0,268.0,777,997.5,,1.05, taishici,0,146.9,500.4,403,632.0,268.0,777,947.1,,0.997,
wanglang,0,137.5,324,434.0,291.0,809,877.7,,1.05, wanglang,0,137.5,494.3,324,434.0,291.0,809,877.7,,1.05,
wei_boss_simayi,0,148.8,318,439.0,258.0,846,882.8,,1.08, wei_boss_simayi,0,148.8,501.9,318,439.0,258.0,846,882.8,,1.08,
weiyan,0,127.7,257,452.0,246.0,764,857.9,,1.15, weiyan,0,127.7,474.7,257,452.0,246.0,764,857.9,,1.15,
wu_chengpu,0,112.9,227,427.0,205.0,717,722.9,,1.12, wu_chengpu,0,112.9,430.4,227,427.0,205.0,717,722.9,,1.12,
wu_ganning,0,146.9,454,775.0,326.0,887,1102.3,,, wu_ganning,0,146.9,532.3,454,775.0,326.0,887,1102.3,,,
wu_huanggai,0,146.5,417,627.0,215.0,762,944.7,,, wu_huanggai,0,146.5,502.7,417,627.0,215.0,762,897.5,,0.95,
wu_sunjian,0,171.2,411,537.0,269.0,876,1056.9,,1.12, wu_sunjian,0,171.2,605.6,411,537.0,269.0,876,1004.1,,1.064,
wu_zhouyu,0,136.3,328,449.5,244.0,823,812.6,,1.05, wu_zhouyu,0,136.3,525.5,328,449.5,244.0,823,812.6,,1.05,
xiahoumao,1,92.3,188,361.0,213.0,840,567.3,,, xiahoumao,1,92.3,612.0,188,361.0,213.0,840,567.3,,,
xiahouyuan,0,125.6,265,447.0,252.0,791,868.2,,1.18, xiahouyuan,0,125.6,492.0,265,447.0,252.0,791,868.2,,1.18,
xiaoqiao,0,158.2,343,577.0,292.0,859,995.8,,1.08, xiaoqiao,0,136.3,433.9,299,496.0,267.0,738,872.0,,1.08,
xunyu,0,142.0,356,441.0,257.0,853,851.1,,1.05, xunyu,0,142.0,516.0,356,441.0,257.0,853,851.1,,1.05,
xushu,0,164.5,454,551.0,286.0,898,982.2,,1.05, xushu,0,164.5,565.0,454,551.0,286.0,898,982.2,,1.05,
yanbaihu,0,174.8,388,669.0,330.0,923,1185.5,,1.15, yanbaihu,0,174.8,576.2,388,669.0,330.0,923,1125.7,,1.092,
ys_boss_quyi,0,127.7,256,471.0,255.0,793,875.8,,1.15, ys_boss_quyi,0,127.7,504.8,256,471.0,255.0,793,875.8,,1.15,
ys_boss_wenchou,1,88.3,182,392.0,181.0,913,579.3,,1.08, ys_boss_wenchou,1,88.3,649.4,182,392.0,181.0,913,579.3,,1.08,
ys_boss_yanliang,0,120.4,249,458.0,215.0,755,788.6,,1.15, ys_boss_yanliang,0,120.4,464.0,249,458.0,215.0,755,788.6,,1.15,
ys_gongsunzan,1,85.7,184,327.0,181.0,825,520.0,,, ys_gongsunzan,1,85.7,632.9,184,327.0,181.0,825,520.0,,,
ysu_boss_jiling,0,111.2,232,401.0,208.0,765,761.2,,1.18, ysu_boss_jiling,0,111.2,464.2,232,401.0,208.0,765,761.2,,1.18,
ysu_boss_xunzheng,0,116.2,234,439.0,215.0,755,750.9,,1.12, ysu_boss_xunzheng,0,116.2,461.5,234,439.0,215.0,755,750.9,,1.12,
yuanshao,0,131.8,275,520.0,250.0,822,846.8,,1.1, yuanshao,0,131.8,502.1,275,520.0,250.0,822,846.8,,1.1,
yuanshu,0,154.9,384,515.0,208.0,879,965.5,,1.1, yuanshu,0,154.9,546.0,384,515.0,209.0,879,965.5,,1.1,
zhangfei,1,106.3,0,0,0,917,625.7,1,,눈 수동 실측 2026-11-10: 눈+눈썹 붙은 어두운 덩어리 중심 x 403.0 · 509.3(v5 재디자인 · 자동 = 말 콧구멍 오검출) zhangfei,1,106.3,633.4,0,0,0,917,625.7,1,,눈 수동 실측 2026-11-10(눈 간격·눈 높이): 눈+눈썹 붙은 어두운 덩어리 중심 x 403.0 · 509.3(v5 재디자인 · 자동 = 말 콧구멍 오검출)
zhanglu,0,158.9,371,490.0,284.0,926,991.7,,1.1, zhanglu,0,158.9,587.1,371,490.0,284.0,926,991.7,,1.1,
zhangren,0,128.5,271,464.5,258.0,786,872.4,,1.15, zhangren,0,128.5,498.1,271,464.5,258.0,786,872.4,,1.15,
zhaofan,0,134.6,373,441.0,264.0,798,839.4,,1.05, zhaofan,0,134.6,469.2,373,441.0,264.0,798,839.4,,1.05,
zhaoyun,1,100.4,199,393.0,192.0,926,590.9,1,, zhaoyun,1,100.4,655.1,199,393.0,192.0,926,590.9,1,,
zhoucang,0,173.3,453,598.0,276.0,856,1149.8,,1.15, zhoucang,0,173.3,538.3,453,598.0,276.0,856,1091.8,,1.092,
zhoutai,0,162.2,429,599.5,273.0,885,1045.9,,1.08, zhoutai,0,162.2,609.1,429,599.5,273.0,885,993.6,,1.026,
zhugejin,0,160.2,372,501.0,270.0,870,954.7,,1.08, zhugejin,0,160.2,562.8,372,501.0,270.0,870,954.7,,1.08,
zhugeliang,0,140.2,336,469.0,264.0,886,962.8,,1.18, zhugeliang,0,140.2,529.3,336,469.0,264.0,886,962.8,,1.18,
zhurong,0,118.3,0,0,0,773,821.6,,1.18,눈 수동 실측 2026-11-10: 눈 덩어리 중심 x 524.4 · 642.7(짙은 피부 = 피부 판정 밖) zhurong,0,118.3,458.4,0,0,0,773,821.6,,1.18,눈 수동 실측 2026-11-10(눈 간격·눈 높이): 눈 덩어리 중심 x 524.4 · 642.7(짙은 피부 = 피부 판정 밖)

1 art mounted eye_px eye_up_px face_px head_px crown_px body_px size_px lock adjust note
2 cc_archer 0 125.1 474.3 250 444.0 249.0 744 736.3 1
3 cc_boss_bianxi 0 172.1 560.5 471 556.0 266.0 835 1010.0 959.0 1.05 0.997
4 cc_boss_caiyang 1 91.1 641.0 184 352.0 198.0 847 556.4
5 cc_boss_caocao 0 135.0 519.6 288 446.0 260.0 808 794.6 1
6 cc_boss_caohong 0 155.4 513.7 335 546.0 304.0 843 1013.1 1.12
7 cc_boss_caoren 0 148.1 515.2 303 519.0 282.0 829 984.4 1.15
8 cc_boss_chezhou 0 133.1 490.6 304 424.0 249.0 804 772.1
9 cc_boss_chunyudao 0 125.6 483.7 264 497.0 256.0 829 874.9 1.15
10 cc_boss_gaolan 0 119.4 457.9 251 462.0 229.0 772 806.5 1.15
11 cc_boss_hanfu 0 131.8 525.9 316 525.0 246.0 815 808.5
12 cc_boss_kongxiu 0 159.0 515.0 326 725.0 317.0 875 1066.5 1.12
13 cc_boss_lidian 0 124.7 453.1 260 451.0 258.0 814 846.8 1.15
14 cc_boss_liudai 0 118.3 461.8 258 487.0 227.0 774 778.4 1.12
15 cc_boss_lvkuang 1 92.2 629.7 193 372.0 201.0 903 576.0
16 cc_boss_lvxiang 1 89.7 628.5 185 340.0 202.0 863 542.5
17 cc_boss_maojie 0 139.3 485.9 330 448.0 292.0 804 849.2
18 cc_boss_mengtan 1 95.6 643.7 185 363.0 204.0 853 578.7
19 cc_boss_qinqi 0 122.5 457.0 254 449.0 246.0 814 837.5 1.15
20 cc_boss_wangzhi 0 135.3 504.0 322 553.5 255.0 811 826.7
21 cc_boss_wangzhong 0 125.2 480.0 269 450.0 247.0 783 847.6 1.15
22 cc_boss_xiahoudun 1 103.4 621.6 0 0 0 867 608.6 눈 수동 실측 2026-11-10: 왼눈 x 408.0 · 오른눈 = 수염 가운데 459.7 대칭 511.4(안대) 눈 수동 실측 2026-11-10(눈 간격·눈 높이): 왼눈 x 408.0 · 오른눈 = 수염 가운데 459.7 대칭 511.4(안대)
23 cc_boss_xiahouen 1 87.5 635.6 172 341.0 195.0 840 536.8
24 cc_boss_xiahoujie 1 94.2 617.7 182 369.0 217.0 845 579.5
25 cc_boss_xuchu 0 154.9 661.0 353 487.0 189.0 854 1008.6 958.2 1.18 1.121
26 cc_boss_xuhuang 0 151.7 497.4 319 763.0 321.0 805 1011.8 1.08
27 cc_boss_yanming 0 112.0 454.4 239 425.0 233.0 786 799.7 1.18
28 cc_boss_yujin 0 138.4 527.0 303 627.0 384.0 844 1059.0 1.15
29 cc_boss_zhanghe 0 112.3 494.0 228 477.0 235.0 853 793.0 1.15
30 cc_cavalry 1 91.9 594.3 186 346.0 193.0 849 540.9 1
31 cc_infantry 0 125.3 478.6 252 444.0 253.0 765 737.5 1
32 cc_spear 0 124.1 469.7 255 481.0 243.0 785 730.4 1
33 chunyuqiong 1 96.0 652.6 190 411.0 191.0 917 620.3 1.08
34 dianwei 0 167.4 582.7 413 551.0 269.0 843 1132.7 1076.1 1.2 1.14
35 diaochan 0 158.2 123.8 459.4 320 251 569.5 514.5 320.0 244.0 911 771 1006.6 796.1 1.08
36 dongxi 0 116.2 442.0 245 437.5 220.0 757 759.5 1.12
37 dongzhuo 0 120.9 485.3 448 517.0 442.0 931 1070.7 1.05
38 dz_archer 0 123.3 474.7 257 448.5 251.0 745 725.7 1
39 dz_boss_caoxing 0 140.7 482.5 310 585.0 274.0 804 957.6 1.15
40 dz_boss_chengong 0 157.8 546.6 376 532.0 290.0 892 980.1 1.08
41 dz_boss_gaoshun 0 132.2 504.6 275 473.0 252.0 798 888.3 1.15
42 dz_boss_huaxiong 0 116.7 510.0 263 444.0 230.0 774 827.7 1.18
43 dz_boss_huzhen 1 87.5 639.3 183 344.0 184.0 836 538.6
44 dz_boss_lvbu 1 75.8 547.8 173 387.5 123.0 819 446.1 1
45 dz_boss_zhangliao 1 95.7 586.6 203 430.0 197.0 876 582.6
46 dz_cavalry 1 96.2 630.9 197 364.0 207.0 873 566.2 1
47 dz_infantry 0 139.1 553.8 304 507.0 259.0 844 818.7 1
48 dz_spear 0 117.2 495.9 247 500.0 237.0 818 689.8 1
49 guanping 0 132.9 475.8 306 540.0 239.0 770 878.2 1.1
50 guanyu 0 122.7 463.4 287 568.5 214.0 725 722.2 1
51 guojia 0 147.2 520.4 366 528.0 267.0 854 969.6 1.12
52 hanxuan 0 113.5 476.2 262 477.0 234.0 793 791.0 1.12
53 hgj_archer 0 154.7 523.3 376 573.0 298.0 833 910.5 1
54 hgj_boss_chengyuanzhi 0 137.2 481.2 395 478.5 233.0 740 875.3 1.1
55 hgj_boss_dengmao 0 146.1 501.2 346 515.0 250.0 803 894.4 1.05
56 hgj_boss_guanhai 0 144.2 573.4 366 822.0 244.0 826 1075.6 1021.8 1.18 1.121
57 hgj_boss_peiyuanshao 0 134.3 461.9 304 531.0 273.0 736 903.9 1.1
58 hgj_boss_zhangbao 0 155.7 492.4 371 548.0 258.0 804 907.1
59 hgj_boss_zhangjiao 0 147.8 510.4 341 524.0 341.0 854 869.9 1
60 hgj_boss_zhangliang 0 160.1 603.4 370 649.0 269.0 882 1108.2 1052.3 1.15 1.092
61 hgj_cavalry 1 107.4 651.2 242 439.0 214.0 879 632.1 1
62 hgj_infantry 0 161.5 553.1 387 660.0 292.0 850 950.6 1
63 hgj_spear 0 168.5 549.3 377 584.5 293.0 862 991.8 1
64 huangzhong 0 148.8 517.9 394 503.0 230.0 797 875.8 1
65 jiangwei 0 114.2 471.3 245 481.0 230.0 804 790.6 1.15
66 jianyong 0 164.8 482.4 367 515.0 257.0 786 906.8
67 jiaxu 0 146.4 498.7 334 468.0 269.0 843 968.1 1.15
68 jinxuan 0 128.2 482.8 289 536.0 257.0 772 932.8 1.2
69 jz_boss_caimao 0 131.1 502.7 278 511.0 248.0 805 902.4 1.18
70 jz_boss_caixun 0 143.2 492.4 320 543.0 296.0 833 1027.4 1.18
71 jz_boss_caizhong 0 139.4 577.6 324 509.0 276.0 872 1006.3 956.0 1.2 1.14
72 jz_boss_chensun 0 111.4 448.8 235 394.0 219.0 749 767.7 1.18
73 jz_boss_wenpin 0 117.1 492.1 260 429.5 243.0 822 851.4 1.22
74 jz_boss_zhangwu 1 84.7 664.4 177 332.0 188.0 862 521.2
75 jz_boss_zhangyun 0 139.5 553.4 298 515.0 277.0 871 998.8 1.2
76 lijue 1 93.4 626.5 182 384.0 185.0 901 557.5
77 lingtong 0 139.3 539.6 414 585.0 285.0 853 1006.1 1.1
78 liubei 0 142.2 450.0 373 478.0 243.0 752 837.0 1
79 liufeng 1 95.8 628.6 192 364.0 202.0 851 580.1
80 lusu 0 158.0 481.0 418 485.0 244.0 777 905.3 1.05
81 luxun 0 171.7 562.0 379 519.5 304.0 906 968.9
82 lvmeng 0 147.3 536.6 309 501.0 262.0 824 944.9 1.15
83 machao 1 85.6 621.0 166 396.0 174.0 845 517.8
84 menghuo 0 147.7 531.8 332 735.0 363.0 860 1076.2 1.08
85 mizhu 0 153.5 485.4 423 589.0 252.0 800 980.9 1.05
86 pangtong 0 163.8 500.1 405 546.0 277.0 800 929.3
87 shu_archer 0 148.5 486.2 324 554.0 304.0 803 1024.4 1.15
88 shu_cavalry 1 95.2 598.8 187 361.0 197.0 848 575.9
89 shu_infantry 0 140.1 580.7 309 524.0 287.0 881 993.0 1.18
90 shu_spear 0 116.3 488.0 263 519.0 243.0 807 851.2 1.18
91 shu_strategist 0 134.0 476.6 328 460.0 251.0 789 816.7 1.05
92 sunce 1 96.1 629.1 192 345.0 195.0 907 565.4
93 sunqian 0 151.7 515.8 400 460.0 266.0 838 852.8
94 sunquan 0 149.4 476.7 339 535.0 220.0 770 921.8 1.05
95 sunshangxiang 0 132.8 419.9 281 550.0 236.0 676 764.8
96 taishici 0 146.9 500.4 403 632.0 268.0 777 997.5 947.1 1.05 0.997
97 wanglang 0 137.5 494.3 324 434.0 291.0 809 877.7 1.05
98 wei_boss_simayi 0 148.8 501.9 318 439.0 258.0 846 882.8 1.08
99 weiyan 0 127.7 474.7 257 452.0 246.0 764 857.9 1.15
100 wu_chengpu 0 112.9 430.4 227 427.0 205.0 717 722.9 1.12
101 wu_ganning 0 146.9 532.3 454 775.0 326.0 887 1102.3
102 wu_huanggai 0 146.5 502.7 417 627.0 215.0 762 944.7 897.5 0.95
103 wu_sunjian 0 171.2 605.6 411 537.0 269.0 876 1056.9 1004.1 1.12 1.064
104 wu_zhouyu 0 136.3 525.5 328 449.5 244.0 823 812.6 1.05
105 xiahoumao 1 92.3 612.0 188 361.0 213.0 840 567.3
106 xiahouyuan 0 125.6 492.0 265 447.0 252.0 791 868.2 1.18
107 xiaoqiao 0 158.2 136.3 433.9 343 299 577.0 496.0 292.0 267.0 859 738 995.8 872.0 1.08
108 xunyu 0 142.0 516.0 356 441.0 257.0 853 851.1 1.05
109 xushu 0 164.5 565.0 454 551.0 286.0 898 982.2 1.05
110 yanbaihu 0 174.8 576.2 388 669.0 330.0 923 1185.5 1125.7 1.15 1.092
111 ys_boss_quyi 0 127.7 504.8 256 471.0 255.0 793 875.8 1.15
112 ys_boss_wenchou 1 88.3 649.4 182 392.0 181.0 913 579.3 1.08
113 ys_boss_yanliang 0 120.4 464.0 249 458.0 215.0 755 788.6 1.15
114 ys_gongsunzan 1 85.7 632.9 184 327.0 181.0 825 520.0
115 ysu_boss_jiling 0 111.2 464.2 232 401.0 208.0 765 761.2 1.18
116 ysu_boss_xunzheng 0 116.2 461.5 234 439.0 215.0 755 750.9 1.12
117 yuanshao 0 131.8 502.1 275 520.0 250.0 822 846.8 1.1
118 yuanshu 0 154.9 546.0 384 515.0 208.0 209.0 879 965.5 1.1
119 zhangfei 1 106.3 633.4 0 0 0 917 625.7 1 눈 수동 실측 2026-11-10: 눈+눈썹 붙은 어두운 덩어리 중심 x 403.0 · 509.3(v5 재디자인 · 자동 = 말 콧구멍 오검출) 눈 수동 실측 2026-11-10(눈 간격·눈 높이): 눈+눈썹 붙은 어두운 덩어리 중심 x 403.0 · 509.3(v5 재디자인 · 자동 = 말 콧구멍 오검출)
120 zhanglu 0 158.9 587.1 371 490.0 284.0 926 991.7 1.1
121 zhangren 0 128.5 498.1 271 464.5 258.0 786 872.4 1.15
122 zhaofan 0 134.6 469.2 373 441.0 264.0 798 839.4 1.05
123 zhaoyun 1 100.4 655.1 199 393.0 192.0 926 590.9 1
124 zhoucang 0 173.3 538.3 453 598.0 276.0 856 1149.8 1091.8 1.15 1.092
125 zhoutai 0 162.2 609.1 429 599.5 273.0 885 1045.9 993.6 1.08 1.026
126 zhugejin 0 160.2 562.8 372 501.0 270.0 870 954.7 1.08
127 zhugeliang 0 140.2 529.3 336 469.0 264.0 886 962.8 1.18
128 zhurong 0 118.3 458.4 0 0 0 773 821.6 1.18 눈 수동 실측 2026-11-10: 눈 덩어리 중심 x 524.4 · 642.7(짙은 피부 = 피부 판정 밖) 눈 수동 실측 2026-11-10(눈 간격·눈 높이): 눈 덩어리 중심 x 524.4 · 642.7(짙은 피부 = 피부 판정 밖)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 545 KiB

After

Width:  |  Height:  |  Size: 544 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 402 KiB

After

Width:  |  Height:  |  Size: 338 KiB

View File

@ -50,7 +50,7 @@ TextureImporter:
spriteExtrude: 1 spriteExtrude: 1
spriteMeshType: 0 spriteMeshType: 0
alignment: 9 alignment: 9
spritePivot: {x: 0.5, y: 0.02049} spritePivot: {x: 0.5, y: 0.02463}
spritePixelsToUnits: 100 spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0} spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1 spriteGenerateFallbackPhysicsShape: 1

Binary file not shown.

Before

Width:  |  Height:  |  Size: 412 KiB

After

Width:  |  Height:  |  Size: 329 KiB

View File

@ -50,7 +50,7 @@ TextureImporter:
spriteExtrude: 1 spriteExtrude: 1
spriteMeshType: 0 spriteMeshType: 0
alignment: 9 alignment: 9
spritePivot: {x: 0.5, y: 0.02049} spritePivot: {x: 0.5, y: 0.02463}
spritePixelsToUnits: 100 spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0} spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1 spriteGenerateFallbackPhysicsShape: 1

Binary file not shown.

Before

Width:  |  Height:  |  Size: 315 KiB

After

Width:  |  Height:  |  Size: 286 KiB

View File

@ -50,7 +50,7 @@ TextureImporter:
spriteExtrude: 1 spriteExtrude: 1
spriteMeshType: 0 spriteMeshType: 0
alignment: 9 alignment: 9
spritePivot: {x: 0.5, y: 0.02049} spritePivot: {x: 0.5, y: 0.02463}
spritePixelsToUnits: 100 spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0} spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1 spriteGenerateFallbackPhysicsShape: 1

View File

@ -2,15 +2,15 @@
"fps": 1, "fps": 1,
"ppu": 100, "ppu": 100,
"frame": [ "frame": [
874, 857,
976 812
], ],
"pivot": [ "pivot": [
0.5, 0.5,
0.02049 0.02463
], ],
"charHeightPx": 936, "charHeightPx": 772,
"bodyHeightPx": 911, "bodyHeightPx": 771,
"clips": [ "clips": [
{ {
"name": "front_idle", "name": "front_idle",

Binary file not shown.

Before

Width:  |  Height:  |  Size: 397 KiB

After

Width:  |  Height:  |  Size: 308 KiB

View File

@ -50,7 +50,7 @@ TextureImporter:
spriteExtrude: 1 spriteExtrude: 1
spriteMeshType: 0 spriteMeshType: 0
alignment: 9 alignment: 9
spritePivot: {x: 0.5, y: 0.02162} spritePivot: {x: 0.5, y: 0.02509}
spritePixelsToUnits: 100 spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0} spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1 spriteGenerateFallbackPhysicsShape: 1

Binary file not shown.

Before

Width:  |  Height:  |  Size: 318 KiB

After

Width:  |  Height:  |  Size: 274 KiB

View File

@ -50,7 +50,7 @@ TextureImporter:
spriteExtrude: 1 spriteExtrude: 1
spriteMeshType: 0 spriteMeshType: 0
alignment: 9 alignment: 9
spritePivot: {x: 0.5, y: 0.02162} spritePivot: {x: 0.5, y: 0.02509}
spritePixelsToUnits: 100 spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0} spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1 spriteGenerateFallbackPhysicsShape: 1

Binary file not shown.

Before

Width:  |  Height:  |  Size: 343 KiB

After

Width:  |  Height:  |  Size: 304 KiB

View File

@ -50,7 +50,7 @@ TextureImporter:
spriteExtrude: 1 spriteExtrude: 1
spriteMeshType: 0 spriteMeshType: 0
alignment: 9 alignment: 9
spritePivot: {x: 0.5, y: 0.02162} spritePivot: {x: 0.5, y: 0.02509}
spritePixelsToUnits: 100 spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0} spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1 spriteGenerateFallbackPhysicsShape: 1

View File

@ -2,15 +2,15 @@
"fps": 1, "fps": 1,
"ppu": 100, "ppu": 100,
"frame": [ "frame": [
885, 677,
925 797
], ],
"pivot": [ "pivot": [
0.5, 0.5,
0.02162 0.02509
], ],
"charHeightPx": 885, "charHeightPx": 757,
"bodyHeightPx": 859, "bodyHeightPx": 738,
"clips": [ "clips": [
{ {
"name": "front_idle", "name": "front_idle",

Binary file not shown.

Before

Width:  |  Height:  |  Size: 498 KiB

After

Width:  |  Height:  |  Size: 498 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 360 KiB

After

Width:  |  Height:  |  Size: 360 KiB

View File

@ -94,6 +94,10 @@ namespace TKS.OutGame
const float MountedDrop = 24f; const float MountedDrop = 24f;
/// <summary>말 탄 유닛 전신(발 ~ 머리 끝) 높이 상한(카드 px) — 크기 표 실측이 튀는 그림(예 여포 size_px 449)도 다른 기병과 비슷하게.</summary> /// <summary>말 탄 유닛 전신(발 ~ 머리 끝) 높이 상한(카드 px) — 크기 표 실측이 튀는 그림(예 여포 size_px 449)도 다른 기병과 비슷하게.</summary>
const float MountedMaxBody = 460f; const float MountedMaxBody = 460f;
/// <summary>눈 줄(카드 위에서 px · 크기 표 eye_up_px 가 있는 유닛) — 머리 끝 맞춤이면 관·투구가 낮은 유닛(전위·태사자)의 얼굴이 위로 뜸 →
/// 눈 높이를 맞춘다(PD 2026-11-10 「너무 위쪽에 등장하는 영웅은 내려」) · 값 = PD 확인 기존 20종의 머리 끝 맞춤 때 눈 높이 중앙값(걷는 216.5 · 기병 210.3).</summary>
const float EyeLine = 216f;
const float EyeLineMounted = 210f;
/// <param name="owned">false = 미보유(PD 2026-11-10 「유닛 목록에 장수들의 모습이 보이도록」) — 일러를 테마 card_locked_art 로 조금 어둡게 · 「미보유」 꼬리 칩 · 레벨 배지·성장 점 없음</param> /// <param name="owned">false = 미보유(PD 2026-11-10 「유닛 목록에 장수들의 모습이 보이도록」) — 일러를 테마 card_locked_art 로 조금 어둡게 · 「미보유」 꼬리 칩 · 레벨 배지·성장 점 없음</param>
public static Image Card(Transform content, OutGameSession s, HeroDb.Hero h, bool deployed, System.Action onTap, bool owned = true) public static Image Card(Transform content, OutGameSession s, HeroDb.Hero h, bool deployed, System.Action onTap, bool owned = true)
@ -125,12 +129,21 @@ namespace TKS.OutGame
if (body > 0.5f && m.pivot != null && m.pivot.Length > 1) if (body > 0.5f && m.pivot != null && m.pivot.Length > 1)
{ {
float hgt = sp.rect.height; float hgt = sp.rect.height;
float headY = Mathf.Clamp01((m.pivot[1] * hgt + body) / hgt); // 머리 끝 = 프레임 아래에서의 비율
bool mounted = a.Mounted; bool mounted = a.Mounted;
float k = UnitPx / size * (mounted ? MountedScale : 1f); float k = UnitPx / size * (mounted ? MountedScale : 1f);
if (mounted) k = Mathf.Min(k, MountedMaxBody / body); if (mounted) k = Mathf.Min(k, MountedMaxBody / body);
float top = HeadTop + (mounted ? MountedDrop : FootDrop); float pivotY, y;
art = UiKit.Rect("Character", b, new Vector2(0.5f, 1f), new Vector2(0.5f, headY), new Vector2(0f, -top), sp.rect.size * k).gameObject.AddComponent<Image>(); if (a.EyeUpPx > 0.5f)
{
pivotY = Mathf.Clamp01((m.pivot[1] * hgt + a.EyeUpPx) / hgt); // 눈 줄 = 프레임 아래에서의 비율
y = mounted ? EyeLineMounted : EyeLine;
}
else
{
pivotY = Mathf.Clamp01((m.pivot[1] * hgt + body) / hgt); // 머리 끝 = 프레임 아래에서의 비율(눈 높이 없는 그림)
y = HeadTop + (mounted ? MountedDrop : FootDrop);
}
art = UiKit.Rect("Character", b, new Vector2(0.5f, 1f), new Vector2(0.5f, pivotY), new Vector2(0f, -y), sp.rect.size * k).gameObject.AddComponent<Image>();
} }
else else
{ {

View File

@ -44,6 +44,8 @@ namespace TKS
public float SizePx; public float SizePx;
/// <summary>말 탄 유닛(크기 표 mounted = 1) — 게임 배치 때 머리 끝 상한(BalanceConfig.mountedArtMaxTop)을 받는다.</summary> /// <summary>말 탄 유닛(크기 표 mounted = 1) — 게임 배치 때 머리 끝 상한(BalanceConfig.mountedArtMaxTop)을 받는다.</summary>
public bool Mounted; public bool Mounted;
/// <summary>대기 그림의 눈 높이(발 위 px · 크기 표 eye_up_px) · 0 = 없음 — 영웅 목록 카드가 눈 줄을 맞춘다(PD 2026-11-10 「전위·태사자처럼 너무 위쪽에 보이는 영웅은 내려」).</summary>
public float EyeUpPx;
/// <summary>그림 속 몸(머리 끝~발) 세로 px — bodyHeightPx(무기 제외) 우선, 없으면 charHeightPx.</summary> /// <summary>그림 속 몸(머리 끝~발) 세로 px — bodyHeightPx(무기 제외) 우선, 없으면 charHeightPx.</summary>
public float BodyPx public float BodyPx
@ -70,6 +72,7 @@ namespace TKS
public const string SizeTable = "art_size"; public const string SizeTable = "art_size";
static readonly Dictionary<string, UnitArtData> cache = new Dictionary<string, UnitArtData>(); static readonly Dictionary<string, UnitArtData> cache = new Dictionary<string, UnitArtData>();
static Dictionary<string, float> sizes; static Dictionary<string, float> sizes;
static Dictionary<string, float> eyeUps;
static HashSet<string> mounted; static HashSet<string> mounted;
/// <summary>크기 표의 size_px(없으면 0).</summary> /// <summary>크기 표의 size_px(없으면 0).</summary>
@ -80,6 +83,14 @@ namespace TKS
return id != null && sizes.TryGetValue(id, out v) ? v : 0f; return id != null && sizes.TryGetValue(id, out v) ? v : 0f;
} }
/// <summary>크기 표의 eye_up_px(대기 그림 눈 높이 · 발 위 px · 없으면 0).</summary>
public static float EyeUpOf(string id)
{
EnsureSizes();
float v;
return id != null && eyeUps.TryGetValue(id, out v) ? v : 0f;
}
/// <summary>크기 표 mounted = 1(말 탄 유닛).</summary> /// <summary>크기 표 mounted = 1(말 탄 유닛).</summary>
public static bool IsMounted(string id) public static bool IsMounted(string id)
{ {
@ -91,12 +102,13 @@ namespace TKS
{ {
if (sizes != null) return; if (sizes != null) return;
sizes = new Dictionary<string, float>(); sizes = new Dictionary<string, float>();
eyeUps = new Dictionary<string, float>();
mounted = new HashSet<string>(); mounted = new HashSet<string>();
var ta = Resources.Load<TextAsset>(Root + SizeTable); var ta = Resources.Load<TextAsset>(Root + SizeTable);
if (ta == null) return; if (ta == null) return;
var lines = ta.text.TrimStart('').Split('\n'); var lines = ta.text.TrimStart('').Split('\n');
var head = new List<string>(lines[0].Trim().Split(',')); var head = new List<string>(lines[0].Trim().Split(','));
int ia = head.IndexOf("art"), isz = head.IndexOf("size_px"), im = head.IndexOf("mounted"); int ia = head.IndexOf("art"), isz = head.IndexOf("size_px"), im = head.IndexOf("mounted"), ieu = head.IndexOf("eye_up_px");
if (ia < 0 || isz < 0 || im < 0) if (ia < 0 || isz < 0 || im < 0)
{ {
Debug.LogWarning("[TKS] 유닛 크기 표 열(art · mounted · size_px) 없음"); Debug.LogWarning("[TKS] 유닛 크기 표 열(art · mounted · size_px) 없음");
@ -111,6 +123,8 @@ namespace TKS
if (float.TryParse(c[isz], System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out v) && v > 0f) if (float.TryParse(c[isz], System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out v) && v > 0f)
sizes[c[ia]] = v; sizes[c[ia]] = v;
if (c[im] == "1") mounted.Add(c[ia]); if (c[im] == "1") mounted.Add(c[ia]);
if (ieu >= 0 && ieu < c.Length && float.TryParse(c[ieu], System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out v) && v > 0f)
eyeUps[c[ia]] = v;
} }
} }
@ -128,6 +142,7 @@ namespace TKS
{ {
cache.Clear(); cache.Clear();
sizes = null; sizes = null;
eyeUps = null;
mounted = null; mounted = null;
} }
@ -147,7 +162,7 @@ namespace TKS
} }
if (meta == null || meta.clips == null) return null; if (meta == null || meta.clips == null) return null;
var d = new UnitArtData { Id = id, Meta = meta, SizePx = SizeOf(id), Mounted = IsMounted(id) }; var d = new UnitArtData { Id = id, Meta = meta, SizePx = SizeOf(id), Mounted = IsMounted(id), EyeUpPx = EyeUpOf(id) };
foreach (var c in meta.clips) foreach (var c in meta.clips)
{ {
if (c == null || string.IsNullOrEmpty(c.name)) continue; if (c == null || string.IsNullOrEmpty(c.name)) continue;

View File

@ -30,7 +30,7 @@ from PIL import Image, ImageDraw, ImageFont
from scipy import ndimage from scipy import ndimage
TABLE = 'Assets/Resources/Units/art_size.csv' TABLE = 'Assets/Resources/Units/art_size.csv'
FIELDS = ['art', 'mounted', 'eye_px', 'face_px', 'head_px', 'crown_px', 'body_px', 'size_px', 'lock', 'adjust', 'note'] FIELDS = ['art', 'mounted', 'eye_px', 'eye_up_px', 'face_px', 'head_px', 'crown_px', 'body_px', 'size_px', 'lock', 'adjust', 'note']
def head_width(img, eyes): def head_width(img, eyes):
@ -196,7 +196,12 @@ def main():
eye = float(prev['eye_px']) # 자동으로 못 찾는 그림(안대·눈썹과 붙은 눈·짙은 피부) = 표에 적은 수동 실측 값 유지 eye = float(prev['eye_px']) # 자동으로 못 찾는 그림(안대·눈썹과 붙은 눈·짙은 피부) = 표에 적은 수동 실측 값 유지
lock = prev.get('lock', '') lock = prev.get('lock', '')
hw, cr = head_width(img, eyes) hw, cr = head_width(img, eyes)
rows.append({'art': art, 'mounted': mounted, 'eye_px': eye, 'face_px': face_width(img, eyes), 'head_px': hw, 'crown_px': cr, # 눈 높이(발 위 px) = 영웅 목록 카드가 눈 줄을 맞추는 기준(PD 2026-11-10 「전위·태사자처럼 너무 위쪽에 보이는 영웅은 내려」)
foot_y = img.height - meta['pivot'][1] * img.height
eye_up = round(foot_y - (eyes[0][2] + eyes[1][2]) / 2, 1) if eyes else 0
if not eyes and prev.get('note', '').startswith('눈 수동') and float(prev.get('eye_up_px') or 0) > 0:
eye_up = float(prev['eye_up_px'])
rows.append({'art': art, 'mounted': mounted, 'eye_px': eye, 'eye_up_px': eye_up, 'face_px': face_width(img, eyes), 'head_px': hw, 'crown_px': cr,
'body_px': body, 'size_px': float(prev['size_px']) if lock == '1' and prev.get('size_px') else '', 'lock': lock, 'body_px': body, 'size_px': float(prev['size_px']) if lock == '1' and prev.get('size_px') else '', 'lock': lock,
'adjust': prev.get('adjust', ''), 'note': prev.get('note', '')}) 'adjust': prev.get('adjust', ''), 'note': prev.get('note', '')})
shots.append((art, meta, img, eyes)) shots.append((art, meta, img, eyes))