fix_sprite_name_conflict.py 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. import yaml
  2. yaml_path = "D:\\x25\\trunk\\unity_project\\Assets\\Texture2D\\PartTex_Spriteshop.png.meta"
  3. def load_meta(path):
  4. f = open(file=path, mode="r", encoding="utf-8")
  5. txt = f.read()
  6. f.close()
  7. return yaml.load(stream=txt, Loader=yaml.FullLoader)
  8. meta = load_meta(yaml_path)
  9. internalIDToNameTable = meta['TextureImporter']['internalIDToNameTable']
  10. nameFileIdTable = meta['TextureImporter']['spriteSheet']['nameFileIdTable']
  11. sprites = meta['TextureImporter']['spriteSheet']['sprites']
  12. def get_id_name_map(tbl):
  13. name_to_id = {}
  14. id_to_name = {}
  15. for _, x in enumerate(tbl):
  16. _id = x['first'].get(213)
  17. name = x['second']
  18. name_to_id.setdefault(name, []).append(_id)
  19. id_to_name[_id] = name
  20. return name_to_id, id_to_name
  21. name_to_id, id_to_name = get_id_name_map(internalIDToNameTable)
  22. def new_id_to_name(name_to_id):
  23. id_to_name = {}
  24. for k, v in name_to_id.items():
  25. for i, id in enumerate(v):
  26. id_to_name[id] = k+"_"+str(i)
  27. return id_to_name
  28. new_id_name_map = new_id_to_name(name_to_id)
  29. def modify_id_to_name(internalIDToNameTable):
  30. for _, x in enumerate(internalIDToNameTable):
  31. _id = x['first'].get(213)
  32. new_name = new_id_name_map[_id]
  33. x['second'] = new_name
  34. return internalIDToNameTable
  35. modify_id_to_name(internalIDToNameTable)
  36. def new_name_to_id(new_id_name_map):
  37. ret = {}
  38. for k, v in new_id_name_map.items():
  39. ret[v] = k
  40. return ret
  41. new_name_id_map = new_name_to_id(new_id_name_map)
  42. print(len(sprites), len(new_id_name_map.keys()))
  43. print(name_to_id)
  44. def change_sprite_name(sprites):
  45. global name_to_id
  46. for _, v in enumerate(sprites):
  47. _id = v['internalID']
  48. old_name = v['name']
  49. new_name = new_id_name_map.get(_id, None)
  50. if new_name:
  51. v['name'] = new_name
  52. name_to_id[old_name].remove(_id)
  53. def handle_miss_id(sprites):
  54. global name_to_id
  55. for _, v in enumerate(sprites):
  56. _id = v['internalID']
  57. old_name = v['name']
  58. new_name = new_id_name_map.get(_id, None)
  59. if not new_name:
  60. new_id = name_to_id[old_name].pop(0)
  61. v['name'] = new_id_name_map[new_id]
  62. v['internalID'] = new_id
  63. change_sprite_name(sprites)
  64. handle_miss_id(sprites)
  65. print(name_to_id)
  66. #print(sprites)
  67. meta['TextureImporter']['spriteSheet']['nameFileIdTable'] = new_name_id_map
  68. meta['TextureImporter']['internalIDToNameTable'] = internalIDToNameTable
  69. def save_yaml(path, meta):
  70. f = open(path, 'w', encoding='utf-8')
  71. yaml.dump(meta, f)
  72. f.close()
  73. save_yaml(yaml_path+".dd", meta)