This commit is contained in:
2026-10-10 05:21:58 +08:00
parent 3dfe1393d7
commit 533efb2e29
25 changed files with 128 additions and 87 deletions
+104
View File
@@ -0,0 +1,104 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
using UnityEditor;
using UnityEngine;
/// <summary>
/// 一键修复图集"渗色 / 串图 / 边缘被邻居图片填充"问题。
///
/// 症状:圆形等带透明边缘的图片,四周被其他图片的像素填充;正方形区域采样/裁剪时会取到邻居图。
/// 成因:padding 过小 + 紧致打包(透明边被裁掉) + 未开 Alpha 扩张 + 图集可能被降采样。
///
/// 本工具对图集的 packingSettings 统一设置:
/// padding 4 → 8 相邻 sprite 之间留出大于压缩块的间隙
/// enableTightPacking off 不再裁掉透明边,sprite 保持完整矩形(正方形区域只含自己)
/// enableRotation off 不在图集内旋转贴图,避免采样方向错乱(串图)
/// enableAlphaDilation on 边缘颜色向外扩张,滤色采样不会取到邻居像素
///
/// 改完必须:重建 Addressables 内容 → 重出包。
/// </summary>
public static class AtlasPackingFix
{
private const int Padding = 8;
private const bool KeepRotation = false; // 需要省图集空间时可改回 true
[MenuItem("Tools/图集工具/修复所有图集(渗色·串图)")]
public static void FixAll()
{
var list = new List<string>();
foreach (var f in Directory.GetFiles("Assets", "*.spriteatlasv2", SearchOption.AllDirectories))
list.Add(f.Replace('\\', '/'));
foreach (var f in Directory.GetFiles("Assets", "*.spriteatlas", SearchOption.AllDirectories))
list.Add(f.Replace('\\', '/'));
if (list.Count == 0) { Debug.LogWarning("[图集修复] 没找到任何图集"); return; }
Apply(list);
}
[MenuItem("Tools/图集工具/修复选中图集(渗色·串图)")]
public static void FixSelected()
{
var list = new List<string>();
foreach (var guid in Selection.assetGUIDs)
{
var p = AssetDatabase.GUIDToAssetPath(guid);
if (p.EndsWith(".spriteatlas") || p.EndsWith(".spriteatlasv2"))
list.Add(p);
}
if (list.Count == 0)
{
Debug.LogWarning("[图集修复] 请先在 Project 里选中至少一个 .spriteatlas / .spriteatlasv2");
return;
}
Apply(list);
}
private static void Apply(List<string> paths)
{
int ok = 0, skip = 0;
try
{
AssetDatabase.StartAssetEditing();
foreach (var path in paths)
{
var importer = AssetImporter.GetAtPath(path);
if (importer == null) { skip++; continue; }
// 用反射拿 packingSettings,避免不同 Unity 版本字段可见性差异导致编译问题
var prop = importer.GetType().GetProperty("packingSettings");
if (prop == null || !prop.CanRead || !prop.CanWrite)
{
Debug.LogWarning($"[图集修复] 跳过(无 packingSettings): {path}");
skip++;
continue;
}
object boxed = prop.GetValue(importer); // 装箱的结构体副本
var st = boxed.GetType();
SetField(st, boxed, "padding", Padding);
SetField(st, boxed, "enableTightPacking", false);
SetField(st, boxed, "enableRotation", KeepRotation);
SetField(st, boxed, "enableAlphaDilation", true);
prop.SetValue(importer, boxed);
importer.SaveAndReimport();
ok++;
Debug.Log($"[图集修复] {Path.GetFileName(path)} → padding={Padding}, TightPacking=off, Rotation={(KeepRotation ? "on" : "off")}, AlphaDilation=on");
}
}
finally
{
AssetDatabase.StopAssetEditing();
AssetDatabase.Refresh();
}
Debug.Log($"[图集修复] 完成:处理 {ok} 个,跳过 {skip} 个。请重建 Addressables 内容后重出包。");
}
private static void SetField(Type t, object boxed, string name, object value)
{
var f = t.GetField(name, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
if (f != null) f.SetValue(boxed, value);
else Debug.LogWarning($"[图集修复] 字段不存在,已跳过: {name}");
}
}
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 2b39dc75916801143b04a2619782ab66
guid: f7b659919a9f5ac4cb757d05f5f151e6
MonoImporter:
externalObjects: {}
serializedVersion: 2
+1 -1
View File
@@ -9,7 +9,7 @@ MonoBehaviour:
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 0}
m_Script: {fileID: 11500000, guid: b29e98153ec2fbd44b8f7da1b41194e8, type: 3}
m_Name: SpineSettings
m_EditorClassIdentifier:
defaultScale: 0.01
-63
View File
@@ -1,63 +0,0 @@
using UnityEditor;
using UnityEditor.U2D;
using UnityEngine;
/// <summary>
/// 一键修复炮台/翅膀/战神三个图集的边缘渗色(设置存在 .meta 的 SpriteAtlasImporter 里):
/// 1) Padding 4 → 8(隔开相邻 sprite,大于 ASTC 压缩块尺寸,根治相邻像素渗色)
/// 2) 平台压缩 ASTC 6x6 → 4x4(质量档提高,减少压缩糊边/杂边)
/// 3) 尺寸上限 1024 → 2048(避免整体缩小带来的模糊)
/// 改动后必须:重建 Addressables 内容 → 重出包。
/// </summary>
public static class TurretAtlasBleedingFix
{
private static readonly string[] Atlases =
{
"Assets/MyGame/aa/UI/Atlases/PaoTaiSprite.spriteatlasv2",
"Assets/MyGame/aa/UI/Atlases/chibangSprite.spriteatlasv2",
"Assets/MyGame/aa/UI/Atlases/ZhanShenSprite.spriteatlasv2",
};
[MenuItem("Tools/图集工具/修复炮台三图集边缘渗色")]
public static void Fix()
{
foreach (var path in Atlases)
{
var importer = AssetImporter.GetAtPath(path) as SpriteAtlasImporter;
if (importer == null)
{
Debug.LogWarning($"[图集修复] 跳过(不是 SpriteAtlasImporter): {path}");
continue;
}
// 1) Padding 4 → 8
var packing = importer.packingSettings;
packing.padding = 8;
importer.packingSettings = packing;
// 2) 平台压缩与尺寸:ASTC 4x4 + 上限 2048
var android = importer.GetPlatformSettings("Android");
if (android != null)
{
android.overridden = true;
android.format = TextureImporterFormat.ASTC_4x4;
android.maxTextureSize = 2048;
importer.SetPlatformSettings(android);
}
var iphone = importer.GetPlatformSettings("iPhone");
if (iphone != null)
{
iphone.overridden = true;
iphone.format = TextureImporterFormat.ASTC_4x4;
iphone.maxTextureSize = 2048;
importer.SetPlatformSettings(iphone);
}
importer.SaveAndReimport();
Debug.Log($"[图集修复] {System.IO.Path.GetFileName(path)} → padding=8, ASTC 4x4, 上限2048");
}
AssetDatabase.Refresh();
Debug.Log("[图集修复] 完成 —— 请重建 Addressables 内容后重出包");
}
}
+1 -1
View File
@@ -583,7 +583,7 @@ PrefabInstance:
objectReference: {fileID: 0}
- target: {fileID: 22400762, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3}
propertyPath: m_AnchoredPosition.y
value: -0.000011444092
value: -0.000019073486
objectReference: {fileID: 0}
- target: {fileID: 22426080, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3}
propertyPath: m_AnchorMax.x
@@ -46,7 +46,7 @@ SpriteAtlasImporter:
blockOffset: 1
allowAlphaSplitting: 0
enableRotation: 1
enableTightPacking: 1
enableTightPacking: 0
enableAlphaDilation: 0
secondaryTextureSettings: {}
variantMultiplier: 1
@@ -46,7 +46,7 @@ SpriteAtlasImporter:
blockOffset: 1
allowAlphaSplitting: 0
enableRotation: 1
enableTightPacking: 1
enableTightPacking: 0
enableAlphaDilation: 0
secondaryTextureSettings: {}
variantMultiplier: 1
@@ -46,7 +46,7 @@ SpriteAtlasImporter:
blockOffset: 1
allowAlphaSplitting: 0
enableRotation: 1
enableTightPacking: 1
enableTightPacking: 0
enableAlphaDilation: 0
secondaryTextureSettings: {}
variantMultiplier: 1
@@ -46,7 +46,7 @@ SpriteAtlasImporter:
blockOffset: 1
allowAlphaSplitting: 0
enableRotation: 1
enableTightPacking: 1
enableTightPacking: 0
enableAlphaDilation: 0
secondaryTextureSettings: {}
variantMultiplier: 1
@@ -46,7 +46,7 @@ SpriteAtlasImporter:
blockOffset: 1
allowAlphaSplitting: 0
enableRotation: 1
enableTightPacking: 1
enableTightPacking: 0
enableAlphaDilation: 0
secondaryTextureSettings: {}
variantMultiplier: 1
@@ -46,7 +46,7 @@ SpriteAtlasImporter:
blockOffset: 1
allowAlphaSplitting: 0
enableRotation: 1
enableTightPacking: 1
enableTightPacking: 0
enableAlphaDilation: 0
secondaryTextureSettings: {}
variantMultiplier: 1
@@ -46,7 +46,7 @@ SpriteAtlasImporter:
blockOffset: 1
allowAlphaSplitting: 0
enableRotation: 1
enableTightPacking: 1
enableTightPacking: 0
enableAlphaDilation: 0
secondaryTextureSettings: {}
variantMultiplier: 1
@@ -59,7 +59,7 @@ SpriteAtlasImporter:
blockOffset: 1
allowAlphaSplitting: 0
enableRotation: 1
enableTightPacking: 1
enableTightPacking: 0
enableAlphaDilation: 0
secondaryTextureSettings: {}
variantMultiplier: 1
@@ -46,7 +46,7 @@ SpriteAtlasImporter:
blockOffset: 1
allowAlphaSplitting: 0
enableRotation: 1
enableTightPacking: 1
enableTightPacking: 0
enableAlphaDilation: 0
secondaryTextureSettings: {}
variantMultiplier: 1
@@ -46,7 +46,7 @@ SpriteAtlasImporter:
blockOffset: 1
allowAlphaSplitting: 0
enableRotation: 1
enableTightPacking: 1
enableTightPacking: 0
enableAlphaDilation: 0
secondaryTextureSettings: {}
variantMultiplier: 1
@@ -31,7 +31,7 @@ SpriteAtlasAsset:
- {fileID: 21300000, guid: f5f7b4d21474e88438f7e91a89f06c10, type: 3}
- {fileID: 21300000, guid: 2e0eabc28e0080044b777636a4fddf93, type: 3}
- {fileID: 21300000, guid: 6e045a3820e5b5349ad532f32d1fdfb0, type: 3}
- {fileID: 21300000, guid: e18a14c3bb174eb4b8e55cf48d32e3a0, type: 3}
- {fileID: 2800000, guid: e18a14c3bb174eb4b8e55cf48d32e3a0, type: 3}
- {fileID: 21300000, guid: 6b3195f69eabbf445bc3bf6ed8752fe0, type: 3}
- {fileID: 21300000, guid: 72b625933f6cd1f48a2fd5310fc1d01f, type: 3}
- {fileID: 21300000, guid: 07e53ec5e9d657744b6d459f20f72f11, type: 3}
@@ -46,7 +46,7 @@ SpriteAtlasImporter:
blockOffset: 1
allowAlphaSplitting: 0
enableRotation: 1
enableTightPacking: 1
enableTightPacking: 0
enableAlphaDilation: 0
secondaryTextureSettings: {}
variantMultiplier: 1
@@ -46,7 +46,7 @@ SpriteAtlasImporter:
blockOffset: 1
allowAlphaSplitting: 0
enableRotation: 1
enableTightPacking: 1
enableTightPacking: 0
enableAlphaDilation: 0
secondaryTextureSettings: {}
variantMultiplier: 1
@@ -46,7 +46,7 @@ SpriteAtlasImporter:
blockOffset: 1
allowAlphaSplitting: 0
enableRotation: 1
enableTightPacking: 1
enableTightPacking: 0
enableAlphaDilation: 0
secondaryTextureSettings: {}
variantMultiplier: 1
@@ -46,7 +46,7 @@ SpriteAtlasImporter:
blockOffset: 1
allowAlphaSplitting: 0
enableRotation: 1
enableTightPacking: 1
enableTightPacking: 0
enableAlphaDilation: 0
secondaryTextureSettings: {}
variantMultiplier: 1
@@ -46,7 +46,7 @@ SpriteAtlasImporter:
blockOffset: 1
allowAlphaSplitting: 0
enableRotation: 1
enableTightPacking: 1
enableTightPacking: 0
enableAlphaDilation: 0
secondaryTextureSettings: {}
variantMultiplier: 1
@@ -46,7 +46,7 @@ SpriteAtlasImporter:
blockOffset: 1
allowAlphaSplitting: 0
enableRotation: 1
enableTightPacking: 1
enableTightPacking: 0
enableAlphaDilation: 0
secondaryTextureSettings: {}
variantMultiplier: 1
@@ -46,7 +46,7 @@ SpriteAtlasImporter:
blockOffset: 1
allowAlphaSplitting: 0
enableRotation: 1
enableTightPacking: 1
enableTightPacking: 0
enableAlphaDilation: 0
secondaryTextureSettings: {}
variantMultiplier: 1
@@ -45,9 +45,9 @@ SpriteAtlasImporter:
padding: 8
blockOffset: 1
allowAlphaSplitting: 0
enableRotation: 1
enableTightPacking: 1
enableAlphaDilation: 0
enableRotation: 0
enableTightPacking: 0
enableAlphaDilation: 1
secondaryTextureSettings: {}
variantMultiplier: 1
bindAsDefault: 1