diff --git a/Assets/Resources/Units/art_size.csv b/Assets/Resources/Units/art_size.csv
index 5a1eb95d..8e63d6b7 100644
--- a/Assets/Resources/Units/art_size.csv
+++ b/Assets/Resources/Units/art_size.csv
@@ -1,128 +1,128 @@
-art,mounted,eye_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_boss_bianxi,0,172.1,471,556.0,266.0,835,1010.0,,1.05,
-cc_boss_caiyang,1,91.1,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_caohong,0,155.4,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_chezhou,0,133.1,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_gaolan,0,119.4,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_kongxiu,0,159.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_liudai,0,118.3,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_lvxiang,1,89.7,185,340.0,202.0,863,542.5,,,
-cc_boss_maojie,0,139.3,330,448.0,292.0,804,849.2,,,
-cc_boss_mengtan,1,95.6,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_wangzhi,0,135.3,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_xiahoudun,1,103.4,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_xiahoujie,1,94.2,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_xuhuang,0,151.7,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_yujin,0,138.4,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_cavalry,1,91.9,186,346.0,193.0,849,540.9,1,,
-cc_infantry,0,125.3,252,444.0,253.0,765,737.5,1,,
-cc_spear,0,124.1,255,481.0,243.0,785,730.4,1,,
-chunyuqiong,1,96.0,190,411.0,191.0,917,620.3,,1.08,
-dianwei,0,167.4,413,551.0,269.0,843,1132.7,,1.2,
-diaochan,0,158.2,320,569.5,320.0,911,1006.6,,1.08,
-dongxi,0,116.2,245,437.5,220.0,757,759.5,,1.12,
-dongzhuo,0,120.9,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_boss_caoxing,0,140.7,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_gaoshun,0,132.2,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_huzhen,1,87.5,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_zhangliao,1,95.7,203,430.0,197.0,876,582.6,,,
-dz_cavalry,1,96.2,197,364.0,207.0,873,566.2,1,,
-dz_infantry,0,139.1,304,507.0,259.0,844,818.7,1,,
-dz_spear,0,117.2,247,500.0,237.0,818,689.8,1,,
-guanping,0,132.9,306,540.0,239.0,770,878.2,,1.1,
-guanyu,0,122.7,287,568.5,214.0,725,722.2,1,,
-guojia,0,147.2,366,528.0,267.0,854,969.6,,1.12,
-hanxuan,0,113.5,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_boss_chengyuanzhi,0,137.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_guanhai,0,144.2,366,822.0,244.0,826,1075.6,,1.18,
-hgj_boss_peiyuanshao,0,134.3,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_zhangjiao,0,147.8,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_cavalry,1,107.4,242,439.0,214.0,879,632.1,1,,
-hgj_infantry,0,161.5,387,660.0,292.0,850,950.6,1,,
-hgj_spear,0,168.5,377,584.5,293.0,862,991.8,1,,
-huangzhong,0,148.8,394,503.0,230.0,797,875.8,1,,
-jiangwei,0,114.2,245,481.0,230.0,804,790.6,,1.15,
-jianyong,0,164.8,367,515.0,257.0,786,906.8,,,
-jiaxu,0,146.4,334,468.0,269.0,843,968.1,,1.15,
-jinxuan,0,128.2,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_caixun,0,143.2,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_chensun,0,111.4,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_zhangwu,1,84.7,177,332.0,188.0,862,521.2,,,
-jz_boss_zhangyun,0,139.5,298,515.0,277.0,871,998.8,,1.2,
-lijue,1,93.4,182,384.0,185.0,901,557.5,,,
-lingtong,0,139.3,414,585.0,285.0,853,1006.1,,1.1,
-liubei,0,142.2,373,478.0,243.0,752,837.0,1,,
-liufeng,1,95.8,192,364.0,202.0,851,580.1,,,
-lusu,0,158.0,418,485.0,244.0,777,905.3,,1.05,
-luxun,0,171.7,379,519.5,304.0,906,968.9,,,
-lvmeng,0,147.3,309,501.0,262.0,824,944.9,,1.15,
-machao,1,85.6,166,396.0,174.0,845,517.8,,,
-menghuo,0,147.7,332,735.0,363.0,860,1076.2,,1.08,
-mizhu,0,153.5,423,589.0,252.0,800,980.9,,1.05,
-pangtong,0,163.8,405,546.0,277.0,800,929.3,,,
-shu_archer,0,148.5,324,554.0,304.0,803,1024.4,,1.15,
-shu_cavalry,1,95.2,187,361.0,197.0,848,575.9,,,
-shu_infantry,0,140.1,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_strategist,0,134.0,328,460.0,251.0,789,816.7,,1.05,
-sunce,1,96.1,192,345.0,195.0,907,565.4,,,
-sunqian,0,151.7,400,460.0,266.0,838,852.8,,,
-sunquan,0,149.4,339,535.0,220.0,770,921.8,,1.05,
-sunshangxiang,0,132.8,281,550.0,236.0,676,764.8,,,
-taishici,0,146.9,403,632.0,268.0,777,997.5,,1.05,
-wanglang,0,137.5,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,
-weiyan,0,127.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_ganning,0,146.9,454,775.0,326.0,887,1102.3,,,
-wu_huanggai,0,146.5,417,627.0,215.0,762,944.7,,,
-wu_sunjian,0,171.2,411,537.0,269.0,876,1056.9,,1.12,
-wu_zhouyu,0,136.3,328,449.5,244.0,823,812.6,,1.05,
-xiahoumao,1,92.3,188,361.0,213.0,840,567.3,,,
-xiahouyuan,0,125.6,265,447.0,252.0,791,868.2,,1.18,
-xiaoqiao,0,158.2,343,577.0,292.0,859,995.8,,1.08,
-xunyu,0,142.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,
-yanbaihu,0,174.8,388,669.0,330.0,923,1185.5,,1.15,
-ys_boss_quyi,0,127.7,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_yanliang,0,120.4,249,458.0,215.0,755,788.6,,1.15,
-ys_gongsunzan,1,85.7,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_xunzheng,0,116.2,234,439.0,215.0,755,750.9,,1.12,
-yuanshao,0,131.8,275,520.0,250.0,822,846.8,,1.1,
-yuanshu,0,154.9,384,515.0,208.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 재디자인 · 자동 = 말 콧구멍 오검출)
-zhanglu,0,158.9,371,490.0,284.0,926,991.7,,1.1,
-zhangren,0,128.5,271,464.5,258.0,786,872.4,,1.15,
-zhaofan,0,134.6,373,441.0,264.0,798,839.4,,1.05,
-zhaoyun,1,100.4,199,393.0,192.0,926,590.9,1,,
-zhoucang,0,173.3,453,598.0,276.0,856,1149.8,,1.15,
-zhoutai,0,162.2,429,599.5,273.0,885,1045.9,,1.08,
-zhugejin,0,160.2,372,501.0,270.0,870,954.7,,1.08,
-zhugeliang,0,140.2,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(짙은 피부 = 피부 판정 밖)
+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,474.3,250,444.0,249.0,744,736.3,1,,
+cc_boss_bianxi,0,172.1,560.5,471,556.0,266.0,835,959.0,,0.997,
+cc_boss_caiyang,1,91.1,641.0,184,352.0,198.0,847,556.4,,,
+cc_boss_caocao,0,135.0,519.6,288,446.0,260.0,808,794.6,1,,
+cc_boss_caohong,0,155.4,513.7,335,546.0,304.0,843,1013.1,,1.12,
+cc_boss_caoren,0,148.1,515.2,303,519.0,282.0,829,984.4,,1.15,
+cc_boss_chezhou,0,133.1,490.6,304,424.0,249.0,804,772.1,,,
+cc_boss_chunyudao,0,125.6,483.7,264,497.0,256.0,829,874.9,,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,525.9,316,525.0,246.0,815,808.5,,,
+cc_boss_kongxiu,0,159.0,515.0,326,725.0,317.0,875,1066.5,,1.12,
+cc_boss_lidian,0,124.7,453.1,260,451.0,258.0,814,846.8,,1.15,
+cc_boss_liudai,0,118.3,461.8,258,487.0,227.0,774,778.4,,1.12,
+cc_boss_lvkuang,1,92.2,629.7,193,372.0,201.0,903,576.0,,,
+cc_boss_lvxiang,1,89.7,628.5,185,340.0,202.0,863,542.5,,,
+cc_boss_maojie,0,139.3,485.9,330,448.0,292.0,804,849.2,,,
+cc_boss_mengtan,1,95.6,643.7,185,363.0,204.0,853,578.7,,,
+cc_boss_qinqi,0,122.5,457.0,254,449.0,246.0,814,837.5,,1.15,
+cc_boss_wangzhi,0,135.3,504.0,322,553.5,255.0,811,826.7,,,
+cc_boss_wangzhong,0,125.2,480.0,269,450.0,247.0,783,847.6,,1.15,
+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,635.6,172,341.0,195.0,840,536.8,,,
+cc_boss_xiahoujie,1,94.2,617.7,182,369.0,217.0,845,579.5,,,
+cc_boss_xuchu,0,154.9,661.0,353,487.0,189.0,854,958.2,,1.121,
+cc_boss_xuhuang,0,151.7,497.4,319,763.0,321.0,805,1011.8,,1.08,
+cc_boss_yanming,0,112.0,454.4,239,425.0,233.0,786,799.7,,1.18,
+cc_boss_yujin,0,138.4,527.0,303,627.0,384.0,844,1059.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,594.3,186,346.0,193.0,849,540.9,1,,
+cc_infantry,0,125.3,478.6,252,444.0,253.0,765,737.5,1,,
+cc_spear,0,124.1,469.7,255,481.0,243.0,785,730.4,1,,
+chunyuqiong,1,96.0,652.6,190,411.0,191.0,917,620.3,,1.08,
+dianwei,0,167.4,582.7,413,551.0,269.0,843,1076.1,,1.14,
+diaochan,0,123.8,459.4,251,514.5,244.0,771,796.1,,1.08,
+dongxi,0,116.2,442.0,245,437.5,220.0,757,759.5,,1.12,
+dongzhuo,0,120.9,485.3,448,517.0,442.0,931,1070.7,,1.05,
+dz_archer,0,123.3,474.7,257,448.5,251.0,745,725.7,1,,
+dz_boss_caoxing,0,140.7,482.5,310,585.0,274.0,804,957.6,,1.15,
+dz_boss_chengong,0,157.8,546.6,376,532.0,290.0,892,980.1,,1.08,
+dz_boss_gaoshun,0,132.2,504.6,275,473.0,252.0,798,888.3,,1.15,
+dz_boss_huaxiong,0,116.7,510.0,263,444.0,230.0,774,827.7,,1.18,
+dz_boss_huzhen,1,87.5,639.3,183,344.0,184.0,836,538.6,,,
+dz_boss_lvbu,1,75.8,547.8,173,387.5,123.0,819,446.1,1,,
+dz_boss_zhangliao,1,95.7,586.6,203,430.0,197.0,876,582.6,,,
+dz_cavalry,1,96.2,630.9,197,364.0,207.0,873,566.2,1,,
+dz_infantry,0,139.1,553.8,304,507.0,259.0,844,818.7,1,,
+dz_spear,0,117.2,495.9,247,500.0,237.0,818,689.8,1,,
+guanping,0,132.9,475.8,306,540.0,239.0,770,878.2,,1.1,
+guanyu,0,122.7,463.4,287,568.5,214.0,725,722.2,1,,
+guojia,0,147.2,520.4,366,528.0,267.0,854,969.6,,1.12,
+hanxuan,0,113.5,476.2,262,477.0,234.0,793,791.0,,1.12,
+hgj_archer,0,154.7,523.3,376,573.0,298.0,833,910.5,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,501.2,346,515.0,250.0,803,894.4,,1.05,
+hgj_boss_guanhai,0,144.2,573.4,366,822.0,244.0,826,1021.8,,1.121,
+hgj_boss_peiyuanshao,0,134.3,461.9,304,531.0,273.0,736,903.9,,1.1,
+hgj_boss_zhangbao,0,155.7,492.4,371,548.0,258.0,804,907.1,,,
+hgj_boss_zhangjiao,0,147.8,510.4,341,524.0,341.0,854,869.9,1,,
+hgj_boss_zhangliang,0,160.1,603.4,370,649.0,269.0,882,1052.3,,1.092,
+hgj_cavalry,1,107.4,651.2,242,439.0,214.0,879,632.1,1,,
+hgj_infantry,0,161.5,553.1,387,660.0,292.0,850,950.6,1,,
+hgj_spear,0,168.5,549.3,377,584.5,293.0,862,991.8,1,,
+huangzhong,0,148.8,517.9,394,503.0,230.0,797,875.8,1,,
+jiangwei,0,114.2,471.3,245,481.0,230.0,804,790.6,,1.15,
+jianyong,0,164.8,482.4,367,515.0,257.0,786,906.8,,,
+jiaxu,0,146.4,498.7,334,468.0,269.0,843,968.1,,1.15,
+jinxuan,0,128.2,482.8,289,536.0,257.0,772,932.8,,1.2,
+jz_boss_caimao,0,131.1,502.7,278,511.0,248.0,805,902.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,577.6,324,509.0,276.0,872,956.0,,1.14,
+jz_boss_chensun,0,111.4,448.8,235,394.0,219.0,749,767.7,,1.18,
+jz_boss_wenpin,0,117.1,492.1,260,429.5,243.0,822,851.4,,1.22,
+jz_boss_zhangwu,1,84.7,664.4,177,332.0,188.0,862,521.2,,,
+jz_boss_zhangyun,0,139.5,553.4,298,515.0,277.0,871,998.8,,1.2,
+lijue,1,93.4,626.5,182,384.0,185.0,901,557.5,,,
+lingtong,0,139.3,539.6,414,585.0,285.0,853,1006.1,,1.1,
+liubei,0,142.2,450.0,373,478.0,243.0,752,837.0,1,,
+liufeng,1,95.8,628.6,192,364.0,202.0,851,580.1,,,
+lusu,0,158.0,481.0,418,485.0,244.0,777,905.3,,1.05,
+luxun,0,171.7,562.0,379,519.5,304.0,906,968.9,,,
+lvmeng,0,147.3,536.6,309,501.0,262.0,824,944.9,,1.15,
+machao,1,85.6,621.0,166,396.0,174.0,845,517.8,,,
+menghuo,0,147.7,531.8,332,735.0,363.0,860,1076.2,,1.08,
+mizhu,0,153.5,485.4,423,589.0,252.0,800,980.9,,1.05,
+pangtong,0,163.8,500.1,405,546.0,277.0,800,929.3,,,
+shu_archer,0,148.5,486.2,324,554.0,304.0,803,1024.4,,1.15,
+shu_cavalry,1,95.2,598.8,187,361.0,197.0,848,575.9,,,
+shu_infantry,0,140.1,580.7,309,524.0,287.0,881,993.0,,1.18,
+shu_spear,0,116.3,488.0,263,519.0,243.0,807,851.2,,1.18,
+shu_strategist,0,134.0,476.6,328,460.0,251.0,789,816.7,,1.05,
+sunce,1,96.1,629.1,192,345.0,195.0,907,565.4,,,
+sunqian,0,151.7,515.8,400,460.0,266.0,838,852.8,,,
+sunquan,0,149.4,476.7,339,535.0,220.0,770,921.8,,1.05,
+sunshangxiang,0,132.8,419.9,281,550.0,236.0,676,764.8,,,
+taishici,0,146.9,500.4,403,632.0,268.0,777,947.1,,0.997,
+wanglang,0,137.5,494.3,324,434.0,291.0,809,877.7,,1.05,
+wei_boss_simayi,0,148.8,501.9,318,439.0,258.0,846,882.8,,1.08,
+weiyan,0,127.7,474.7,257,452.0,246.0,764,857.9,,1.15,
+wu_chengpu,0,112.9,430.4,227,427.0,205.0,717,722.9,,1.12,
+wu_ganning,0,146.9,532.3,454,775.0,326.0,887,1102.3,,,
+wu_huanggai,0,146.5,502.7,417,627.0,215.0,762,897.5,,0.95,
+wu_sunjian,0,171.2,605.6,411,537.0,269.0,876,1004.1,,1.064,
+wu_zhouyu,0,136.3,525.5,328,449.5,244.0,823,812.6,,1.05,
+xiahoumao,1,92.3,612.0,188,361.0,213.0,840,567.3,,,
+xiahouyuan,0,125.6,492.0,265,447.0,252.0,791,868.2,,1.18,
+xiaoqiao,0,136.3,433.9,299,496.0,267.0,738,872.0,,1.08,
+xunyu,0,142.0,516.0,356,441.0,257.0,853,851.1,,1.05,
+xushu,0,164.5,565.0,454,551.0,286.0,898,982.2,,1.05,
+yanbaihu,0,174.8,576.2,388,669.0,330.0,923,1125.7,,1.092,
+ys_boss_quyi,0,127.7,504.8,256,471.0,255.0,793,875.8,,1.15,
+ys_boss_wenchou,1,88.3,649.4,182,392.0,181.0,913,579.3,,1.08,
+ys_boss_yanliang,0,120.4,464.0,249,458.0,215.0,755,788.6,,1.15,
+ys_gongsunzan,1,85.7,632.9,184,327.0,181.0,825,520.0,,,
+ysu_boss_jiling,0,111.2,464.2,232,401.0,208.0,765,761.2,,1.18,
+ysu_boss_xunzheng,0,116.2,461.5,234,439.0,215.0,755,750.9,,1.12,
+yuanshao,0,131.8,502.1,275,520.0,250.0,822,846.8,,1.1,
+yuanshu,0,154.9,546.0,384,515.0,209.0,879,965.5,,1.1,
+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,587.1,371,490.0,284.0,926,991.7,,1.1,
+zhangren,0,128.5,498.1,271,464.5,258.0,786,872.4,,1.15,
+zhaofan,0,134.6,469.2,373,441.0,264.0,798,839.4,,1.05,
+zhaoyun,1,100.4,655.1,199,393.0,192.0,926,590.9,1,,
+zhoucang,0,173.3,538.3,453,598.0,276.0,856,1091.8,,1.092,
+zhoutai,0,162.2,609.1,429,599.5,273.0,885,993.6,,1.026,
+zhugejin,0,160.2,562.8,372,501.0,270.0,870,954.7,,1.08,
+zhugeliang,0,140.2,529.3,336,469.0,264.0,886,962.8,,1.18,
+zhurong,0,118.3,458.4,0,0,0,773,821.6,,1.18,눈 수동 실측 2026-11-10(눈 간격·눈 높이): 눈 덩어리 중심 x 524.4 · 642.7(짙은 피부 = 피부 판정 밖)
diff --git a/Assets/Resources/Units/cc_boss_xuchu/front_idle/f000.png b/Assets/Resources/Units/cc_boss_xuchu/front_idle/f000.png
index c404215e..10123f17 100644
Binary files a/Assets/Resources/Units/cc_boss_xuchu/front_idle/f000.png and b/Assets/Resources/Units/cc_boss_xuchu/front_idle/f000.png differ
diff --git a/Assets/Resources/Units/diaochan/front_action/f000.png b/Assets/Resources/Units/diaochan/front_action/f000.png
index c35097e3..ded3bd63 100644
Binary files a/Assets/Resources/Units/diaochan/front_action/f000.png and b/Assets/Resources/Units/diaochan/front_action/f000.png differ
diff --git a/Assets/Resources/Units/diaochan/front_action/f000.png.meta b/Assets/Resources/Units/diaochan/front_action/f000.png.meta
index cc448412..cbb8dd24 100644
--- a/Assets/Resources/Units/diaochan/front_action/f000.png.meta
+++ b/Assets/Resources/Units/diaochan/front_action/f000.png.meta
@@ -50,7 +50,7 @@ TextureImporter:
spriteExtrude: 1
spriteMeshType: 0
alignment: 9
- spritePivot: {x: 0.5, y: 0.02049}
+ spritePivot: {x: 0.5, y: 0.02463}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
diff --git a/Assets/Resources/Units/diaochan/front_idle/f000.png b/Assets/Resources/Units/diaochan/front_idle/f000.png
index ad39b653..da489dbd 100644
Binary files a/Assets/Resources/Units/diaochan/front_idle/f000.png and b/Assets/Resources/Units/diaochan/front_idle/f000.png differ
diff --git a/Assets/Resources/Units/diaochan/front_idle/f000.png.meta b/Assets/Resources/Units/diaochan/front_idle/f000.png.meta
index d4738f80..04022c94 100644
--- a/Assets/Resources/Units/diaochan/front_idle/f000.png.meta
+++ b/Assets/Resources/Units/diaochan/front_idle/f000.png.meta
@@ -50,7 +50,7 @@ TextureImporter:
spriteExtrude: 1
spriteMeshType: 0
alignment: 9
- spritePivot: {x: 0.5, y: 0.02049}
+ spritePivot: {x: 0.5, y: 0.02463}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
diff --git a/Assets/Resources/Units/diaochan/front_ready/f000.png b/Assets/Resources/Units/diaochan/front_ready/f000.png
index b029aafc..9ca44d14 100644
Binary files a/Assets/Resources/Units/diaochan/front_ready/f000.png and b/Assets/Resources/Units/diaochan/front_ready/f000.png differ
diff --git a/Assets/Resources/Units/diaochan/front_ready/f000.png.meta b/Assets/Resources/Units/diaochan/front_ready/f000.png.meta
index 37eebe5b..79100114 100644
--- a/Assets/Resources/Units/diaochan/front_ready/f000.png.meta
+++ b/Assets/Resources/Units/diaochan/front_ready/f000.png.meta
@@ -50,7 +50,7 @@ TextureImporter:
spriteExtrude: 1
spriteMeshType: 0
alignment: 9
- spritePivot: {x: 0.5, y: 0.02049}
+ spritePivot: {x: 0.5, y: 0.02463}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
diff --git a/Assets/Resources/Units/diaochan/meta.json b/Assets/Resources/Units/diaochan/meta.json
index 39b63c7d..8f61d1ae 100644
--- a/Assets/Resources/Units/diaochan/meta.json
+++ b/Assets/Resources/Units/diaochan/meta.json
@@ -2,15 +2,15 @@
"fps": 1,
"ppu": 100,
"frame": [
- 874,
- 976
+ 857,
+ 812
],
"pivot": [
0.5,
- 0.02049
+ 0.02463
],
- "charHeightPx": 936,
- "bodyHeightPx": 911,
+ "charHeightPx": 772,
+ "bodyHeightPx": 771,
"clips": [
{
"name": "front_idle",
diff --git a/Assets/Resources/Units/xiaoqiao/front_action/f000.png b/Assets/Resources/Units/xiaoqiao/front_action/f000.png
index 09d5ec5f..96b4b1eb 100644
Binary files a/Assets/Resources/Units/xiaoqiao/front_action/f000.png and b/Assets/Resources/Units/xiaoqiao/front_action/f000.png differ
diff --git a/Assets/Resources/Units/xiaoqiao/front_action/f000.png.meta b/Assets/Resources/Units/xiaoqiao/front_action/f000.png.meta
index ae4a6129..491000ba 100644
--- a/Assets/Resources/Units/xiaoqiao/front_action/f000.png.meta
+++ b/Assets/Resources/Units/xiaoqiao/front_action/f000.png.meta
@@ -50,7 +50,7 @@ TextureImporter:
spriteExtrude: 1
spriteMeshType: 0
alignment: 9
- spritePivot: {x: 0.5, y: 0.02162}
+ spritePivot: {x: 0.5, y: 0.02509}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
diff --git a/Assets/Resources/Units/xiaoqiao/front_idle/f000.png b/Assets/Resources/Units/xiaoqiao/front_idle/f000.png
index 606b06f8..c3643bcd 100644
Binary files a/Assets/Resources/Units/xiaoqiao/front_idle/f000.png and b/Assets/Resources/Units/xiaoqiao/front_idle/f000.png differ
diff --git a/Assets/Resources/Units/xiaoqiao/front_idle/f000.png.meta b/Assets/Resources/Units/xiaoqiao/front_idle/f000.png.meta
index f945b9b7..d0d32095 100644
--- a/Assets/Resources/Units/xiaoqiao/front_idle/f000.png.meta
+++ b/Assets/Resources/Units/xiaoqiao/front_idle/f000.png.meta
@@ -50,7 +50,7 @@ TextureImporter:
spriteExtrude: 1
spriteMeshType: 0
alignment: 9
- spritePivot: {x: 0.5, y: 0.02162}
+ spritePivot: {x: 0.5, y: 0.02509}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
diff --git a/Assets/Resources/Units/xiaoqiao/front_ready/f000.png b/Assets/Resources/Units/xiaoqiao/front_ready/f000.png
index 3f7b271e..a795b455 100644
Binary files a/Assets/Resources/Units/xiaoqiao/front_ready/f000.png and b/Assets/Resources/Units/xiaoqiao/front_ready/f000.png differ
diff --git a/Assets/Resources/Units/xiaoqiao/front_ready/f000.png.meta b/Assets/Resources/Units/xiaoqiao/front_ready/f000.png.meta
index 47d4f651..9b6ba4a3 100644
--- a/Assets/Resources/Units/xiaoqiao/front_ready/f000.png.meta
+++ b/Assets/Resources/Units/xiaoqiao/front_ready/f000.png.meta
@@ -50,7 +50,7 @@ TextureImporter:
spriteExtrude: 1
spriteMeshType: 0
alignment: 9
- spritePivot: {x: 0.5, y: 0.02162}
+ spritePivot: {x: 0.5, y: 0.02509}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
diff --git a/Assets/Resources/Units/xiaoqiao/meta.json b/Assets/Resources/Units/xiaoqiao/meta.json
index 7238cef5..7373e50f 100644
--- a/Assets/Resources/Units/xiaoqiao/meta.json
+++ b/Assets/Resources/Units/xiaoqiao/meta.json
@@ -2,15 +2,15 @@
"fps": 1,
"ppu": 100,
"frame": [
- 885,
- 925
+ 677,
+ 797
],
"pivot": [
0.5,
- 0.02162
+ 0.02509
],
- "charHeightPx": 885,
- "bodyHeightPx": 859,
+ "charHeightPx": 757,
+ "bodyHeightPx": 738,
"clips": [
{
"name": "front_idle",
diff --git a/Assets/Resources/Units/yuanshu/front_idle/f000.png b/Assets/Resources/Units/yuanshu/front_idle/f000.png
index d068a2c6..b85585f3 100644
Binary files a/Assets/Resources/Units/yuanshu/front_idle/f000.png and b/Assets/Resources/Units/yuanshu/front_idle/f000.png differ
diff --git a/Assets/Resources/Units/zhurong/front_idle/f000.png b/Assets/Resources/Units/zhurong/front_idle/f000.png
index f9446a07..b6aea447 100644
Binary files a/Assets/Resources/Units/zhurong/front_idle/f000.png and b/Assets/Resources/Units/zhurong/front_idle/f000.png differ
diff --git a/Assets/Scripts/OutGame/UI/HeroScreens.cs b/Assets/Scripts/OutGame/UI/HeroScreens.cs
index d713f62c..7b004b0e 100644
--- a/Assets/Scripts/OutGame/UI/HeroScreens.cs
+++ b/Assets/Scripts/OutGame/UI/HeroScreens.cs
@@ -94,6 +94,10 @@ namespace TKS.OutGame
const float MountedDrop = 24f;
/// 말 탄 유닛 전신(발 ~ 머리 끝) 높이 상한(카드 px) — 크기 표 실측이 튀는 그림(예 여포 size_px 449)도 다른 기병과 비슷하게.
const float MountedMaxBody = 460f;
+ /// 눈 줄(카드 위에서 px · 크기 표 eye_up_px 가 있는 유닛) — 머리 끝 맞춤이면 관·투구가 낮은 유닛(전위·태사자)의 얼굴이 위로 뜸 →
+ /// 눈 높이를 맞춘다(PD 2026-11-10 「너무 위쪽에 등장하는 영웅은 내려」) · 값 = PD 확인 기존 20종의 머리 끝 맞춤 때 눈 높이 중앙값(걷는 216.5 · 기병 210.3).
+ const float EyeLine = 216f;
+ const float EyeLineMounted = 210f;
/// false = 미보유(PD 2026-11-10 「유닛 목록에 장수들의 모습이 보이도록」) — 일러를 테마 card_locked_art 로 조금 어둡게 · 「미보유」 꼬리 칩 · 레벨 배지·성장 점 없음
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)
{
float hgt = sp.rect.height;
- float headY = Mathf.Clamp01((m.pivot[1] * hgt + body) / hgt); // 머리 끝 = 프레임 아래에서의 비율
bool mounted = a.Mounted;
float k = UnitPx / size * (mounted ? MountedScale : 1f);
if (mounted) k = Mathf.Min(k, MountedMaxBody / body);
- float top = HeadTop + (mounted ? MountedDrop : FootDrop);
- 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();
+ float pivotY, y;
+ 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();
}
else
{
diff --git a/Assets/Scripts/Runtime/UnitArt.cs b/Assets/Scripts/Runtime/UnitArt.cs
index 6b6ca687..6b01fff2 100644
--- a/Assets/Scripts/Runtime/UnitArt.cs
+++ b/Assets/Scripts/Runtime/UnitArt.cs
@@ -44,6 +44,8 @@ namespace TKS
public float SizePx;
/// 말 탄 유닛(크기 표 mounted = 1) — 게임 배치 때 머리 끝 상한(BalanceConfig.mountedArtMaxTop)을 받는다.
public bool Mounted;
+ /// 대기 그림의 눈 높이(발 위 px · 크기 표 eye_up_px) · 0 = 없음 — 영웅 목록 카드가 눈 줄을 맞춘다(PD 2026-11-10 「전위·태사자처럼 너무 위쪽에 보이는 영웅은 내려」).
+ public float EyeUpPx;
/// 그림 속 몸(머리 끝~발) 세로 px — bodyHeightPx(무기 제외) 우선, 없으면 charHeightPx.
public float BodyPx
@@ -70,6 +72,7 @@ namespace TKS
public const string SizeTable = "art_size";
static readonly Dictionary cache = new Dictionary();
static Dictionary sizes;
+ static Dictionary eyeUps;
static HashSet mounted;
/// 크기 표의 size_px(없으면 0).
@@ -80,6 +83,14 @@ namespace TKS
return id != null && sizes.TryGetValue(id, out v) ? v : 0f;
}
+ /// 크기 표의 eye_up_px(대기 그림 눈 높이 · 발 위 px · 없으면 0).
+ public static float EyeUpOf(string id)
+ {
+ EnsureSizes();
+ float v;
+ return id != null && eyeUps.TryGetValue(id, out v) ? v : 0f;
+ }
+
/// 크기 표 mounted = 1(말 탄 유닛).
public static bool IsMounted(string id)
{
@@ -91,12 +102,13 @@ namespace TKS
{
if (sizes != null) return;
sizes = new Dictionary();
+ eyeUps = new Dictionary();
mounted = new HashSet();
var ta = Resources.Load(Root + SizeTable);
if (ta == null) return;
var lines = ta.text.TrimStart('').Split('\n');
var head = new List(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)
{
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)
sizes[c[ia]] = v;
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();
sizes = null;
+ eyeUps = null;
mounted = null;
}
@@ -147,7 +162,7 @@ namespace TKS
}
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)
{
if (c == null || string.IsNullOrEmpty(c.name)) continue;
diff --git a/Tools/unit_art_size.py b/Tools/unit_art_size.py
index 70477a28..c8c4db30 100644
--- a/Tools/unit_art_size.py
+++ b/Tools/unit_art_size.py
@@ -30,7 +30,7 @@ from PIL import Image, ImageDraw, ImageFont
from scipy import ndimage
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):
@@ -196,7 +196,12 @@ def main():
eye = float(prev['eye_px']) # 자동으로 못 찾는 그림(안대·눈썹과 붙은 눈·짙은 피부) = 표에 적은 수동 실측 값 유지
lock = prev.get('lock', '')
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,
'adjust': prev.get('adjust', ''), 'note': prev.get('note', '')})
shots.append((art, meta, img, eyes))