unity prefabs批量处理

问题描述

本人是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()

效果

在这里插入图片描述

结语

为了实现第一个功能,我辛辛苦苦写了一下午,写完刚想装一下,忽然间就意识到这跟替换有啥区别,感觉是做了无用功,不过就当作自己的一个心路历程吧,没有好好考虑而急于动手.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值