美文网首页
针对NGUI里面Anchor的OnUpdate调用频繁的对UIR

针对NGUI里面Anchor的OnUpdate调用频繁的对UIR

作者: 东方小白 | 来源:发表于2022-03-04 20:22 被阅读0次

    1.看源码

    通过Unity的控件发现有 image.png

    然后可以看到基础控件(比如UISprite)里面的这个属性一层层找过去会发现都是继承了UIRect,
    然后观察UIRect的源码可以发现:


    image.png
    这里确实有这个的枚举,然后再具体的看他的逻辑都在Update()里面,可以发现他在每一帧调用,这样确实比较频繁,而且没有这个必要,那我想对他进行优化就是比如能不能调用的不那么频繁,但是又不影响他本身的逻辑,比如我想他0.1s调用一次,这个人眼基本看不出来差别,所以我想增加一种新的类型,可以0.1s调用。

    2.修改

    image.png

    增加一种类型,然后在增加自己的逻辑,其实逻辑也比较简单,就是记录上次的时间,然后加一个时间间隔,先判断是否是显得类型,每一帧调用的时候判断下间隔是否0.1秒了,如果是就执行。

    核心逻辑:

    image.png image.png

    3.类型新增,然后呢?

    新增类型结束了,然后就是怎么将它修改到每一个的场景和控件中,这里需要俩步。你会发现需要修改的也只是每一个prefab和scene里面的anchor类型,他是有一个属性控制的,那个属性是updateAnchors.


    image.png

    1.我们的场景和prefab必须是可视化的,不然一个个修改,可能手都会断,新项目不至于,但是对于老项目来说容易错还有会遗漏,这需要先进行一个修改。打开unity的Project Setting:


    image.png

    这样就可以用文本文件打开了,这样也便于svn/git的管理。


    image.png
    随便打开一个prefab/unity能看到updateAnchor = 1,1就是OnUpdate的枚举,我们的枚举是 3,那么把1改成3就可以了。
    image.png

    4修改

    所有后面我们需要做的就是如何将这些美术资源里面的属性修改掉,我本来打算使用c#实现,写一个功能,奈何搁浅了,然后我就换了方式,我使用了python,发现python可以实现,就写了这样一个脚本,逻辑也不复杂,核心就是
    1:遍历Assets文件夹,获取所有的prefab和.unity的场景文件,
    2:读取并修改。
    代码如下:

    import os
    import chardet
    
    image_path = 'xxx/Assets'
    
    
    
    # 获取文件编码类型
    def get_encoding(file):
        # 二进制方式读取,获取字节数据,检测类型
        with open(file, 'rb') as f:
            return chardet.detect(f.read())['encoding']
    
    
    
    # 遍历文件夹及其子文件夹中的文件,并存储在一个列表中
    # 输入文件夹路径、空文件列表[]
    # 返回 文件列表Filelist,包含文件名(完整路径)
    def get_filelist(dir, Filelist):
        newDir = dir
        if os.path.isfile(dir):
            Filelist.append(dir)
            # # 若只是要返回文件文,使用这个
            # Filelist.append(os.path.basename(dir))
        elif os.path.isdir(dir):
            for s in os.listdir(dir):
                # 如果需要忽略某些文件夹,使用以下代码
                # print(s)
                # t = s.split('.')
                # if t[len(t)-1] != "prefab":
                #     continue
                newDir = os.path.join(dir, s)
                get_filelist(newDir, Filelist)
        return Filelist
    
    def modifyPrefab(file,old_str,new_str):
        """
        替换文件中的字符串
        :param file:文件名
        :param old_str:就字符串
        :param new_str:新字符串
        :return:
        """
        file_data = ""
        with open(file, "r", encoding="utf-8") as f:
            for line in f:
                if old_str in line:
                    line = line.replace(old_str,new_str)
                file_data += line
        with open(file,"w",encoding="utf-8") as f:
            f.write(file_data)
    
    if __name__ == '__main__':
        list = get_filelist(image_path, [])
        print("lenght------------------------------",len(list))
        for e in list:
            # print(e)
            t = e.split('.')
            if (t[len(t)-1] == "prefab" or t[len(t) - 1] == "unity"):
                # modifyPrefab(e,"updateAnchors: 1","updateAnchors: 3")
                # encoding = get_encoding(e)
                # if(encoding != 'utf-8'):
                #     print(t,"当前的编码格式不对----------------",encoding);
                # else:
                #     modifyPrefab(e,"updateAnchors: 1","updateAnchors: 3")
                #     print(e)
                modifyPrefab(e, "updateAnchors: 1", "updateAnchors: 3")
                print(e)
    

    ps:中间的编码格式,是因为遇到报错,中断了,先以为是编码格式的问题,后来发现是prefab的脚本丢失,导致他变成乱码,所以直接中断了,如果遇到这样的问题,找到那个prefab,要么找回对应的脚本,要么先删掉,或者先删掉整个的prefab,自己记录,后续修改,毕竟错误的情况不会那么多。然后执行完我这边大概有2000个文件,有修改的大概700多个,自己玩了下没有大问题。你们在python3的环境下直接填入自己的Asset的绝对路径又可以了,这样就解决了我们的问题了。
    我觉得解决问题,一定要先定位问题,在想好怎么做,一步步的解决就好了。

    相关文章

      网友评论

          本文标题:针对NGUI里面Anchor的OnUpdate调用频繁的对UIR

          本文链接:https://www.haomeiwen.com/subject/immmrrtx.html