问题描述
本人是unity新手,最近在拿github上面的植物大战僵尸练手,然后改着改着就发现预制架的层级跟我的不太一样了,然后手动改完之后感觉太慢就萌生了个进行批处理的念头.
简单思路
打开prefabs文件(如下图),发现他是键值对的形式,也就是说我们只要改变 : 后面的值就可以,然后通过排除法可以得出层级的字段是 m_SortingOrder ,将它进行修改即可(对层级没要求的可以直接记事本替换–记得保留副本).
直接进行替换
我的思路是使用正则表达式判断是不是所需语句,若是则进行处理,代码如下.
import re
import os
tipShowFlag=True
inputFlag = True
def check(checkString,changeStr):
global tipShowFlag,inputFlag
if(re.match(patName, line)):
print("本次要修改的物体名称为:",line.split(":",1)[1],end="")
if(re.match(pat,line)):
if(tipShowFlag == True):
print(line,"|-|- 本条语句的值将会发生改变")
tipShowFlag = False
if(inputFlag == True):
changeFlag=input("根据默认值改变请按回车,启动憨批模式一键全改请按0,不改变请输入1,重新设定值请输入2,匹配不正确请输入3 : ")
else:
changeFlag = ''
if(changeFlag ==''):
#默认设置
temps = line.split(':',1)
endString = temps[0]+": "+changeStr
print(endString,file=fox)
return
if(changeFlag == '0'):
#憨批模式
#默认设置
temps = line.split(':',1)
endString = temps[0]+": "+changeStr
print(endString,file=fox)
inputFlag=False
return
if(changeFlag == '1'):
# 本次不修改
print(line,file=fox,end="")
return
if(changeFlag == '2'):
# 输入特定值
changeStrTemp=input("输入设定值:")
temps = line.split(':',1)
endString = temps[0]+": "+changeStrTemp
print(endString,file=fox)
return
if(changeFlag == '3'):
# 输入错误
print("请重新输入----")
quit()
print("您的输入已经超出范围,本系统将按照不做修改进行处理")
print(line,file=fox,end="")
PrefixPath = input("请输入预制件路径及文件名:")
# PrefixPath = "E:\GameCode\PVZ-main\PlantsVsZombie\Assets\Prefabs\ChangeUserName.prefab"
fo = open(PrefixPath,mode='r')
try:
line = fo.__next__()
except:
print(文件为空)
quit()
# PrefixPathx = input("请输入预制件输出路径及文件名:")
PrefixPathx = "E:\GameCode\PVZ-main\PlantsVsZombie\Assets\Prefabs\\textx.prefab"
# pat = input("请输入正则匹配模式:")
pat = "\s*m_SortingOrder"
patName = "\s*m_Name"
# pat = input("请输入同一修改值")
changeStr = "7"
fox= open(PrefixPathx,mode='w+')
while(1):
check(line,changeStr)
try:
line = fo.__next__()
except:
print("end of the file")
break
fo.close()
效果
很明显,是层级出了问题.
结论
如果只是做固定的修改基本可以在记事本里进行替换,就我使用的字段而言没有发生冲突之类的问题.
保留层级关系
只需要换成偏移量即可,对原有层级进行加法运算即可
import re
import os
tipShowFlag=True
inputFlag = True
def check(checkString,offStr):
global tipShowFlag,inputFlag
if(re.match(patName, line)):
print("本次要修改的物体名称为:",line.split(":",1)[1],end="")
if(re.match(pat,line)):
if(tipShowFlag == True):
print(line,"|-|- 本条语句的值将会发生改变")
tipShowFlag = False
if(inputFlag == True):
changeFlag=input("根据默认值改变请按回车,启动憨批模式一键全改请按0,不改变请输入1,重新设定值请输入2,匹配不正确请输入3 : ")
else:
changeFlag = ''
if(changeFlag ==''):
#默认设置
temps = line.split(':',1)
endString = temps[0]+": "+str(int(temps[1])+offStr)
print(endString,file=fox)
return
if(changeFlag == '0'):
#憨批模式
#默认设置
temps = line.split(':',1)
endString = temps[0]+": "+str(int(temps[1])+offStr)
print(endString,file=fox)
inputFlag=False
return
if(changeFlag == '1'):
# 本次不修改
print(line,file=fox,end="")
return
if(changeFlag == '2'):
# 输入特定值
changeStrTemp=input("输入设定值:")
temps = line.split(':',1)
endString = temps[0]+": "+changeStrTemp
print(endString,file=fox)
return
if(changeFlag == '3'):
# 输入错误
print("请重新输入----")
quit()
print("您的输入已经超出范围,本系统将按照不做修改进行处理")
print(line,file=fox,end="")
PrefixPath = input("请输入预制件路径及文件名:")
# PrefixPath = "E:\GameCode\PVZ-main\PlantsVsZombie\Assets\Prefabs\ChangeUserName.prefab"
fo = open(PrefixPath,mode='r')
try:
line = fo.__next__()
except:
print(文件为空)
quit()
# PrefixPathx = input("请输入预制件输出路径及文件名:")
PrefixPathx = "E:\GameCode\PVZ-main\PlantsVsZombie\Assets\Prefabs\\textx.prefab"
# pat = input("请输入正则匹配模式:")
pat = "\s*m_SortingOrder"
patName = "\s*m_Name"
# pat = input("请输入同一修改值")
offStr = 2
fox= open(PrefixPathx,mode='w+')
while(1):
check(line,offStr)
try:
line = fo.__next__()
except:
print("end of the file")
break
fo.close()
效果
结语
为了实现第一个功能,我辛辛苦苦写了一下午,写完刚想装一下,忽然间就意识到这跟替换有啥区别,感觉是做了无用功,不过就当作自己的一个心路历程吧,没有好好考虑而急于动手.