zoukankan      html  css  js  c++  java
  • Unity编辑器下重启

      我们项目AssetBundle打包走的是全自动化流程,打包之前要进行各种资源检测,如果检测顺利通过,则进入打包,否则提示错误资源名称及路径,打包中断!有时候即使资源检测通过也会打包崩溃,初步断定是Unity的内存爆了,因为Unity在编辑器下打开工程中的资源不会释放掉,所以内存一直在占用,打包时要进行一系列资源依赖分析,我们也知道,如果资源量非常大时候,Unity要保存资源依赖的堆栈,所以会有内存崩掉的风险,所以我就想着,打包之前重启下Unity,让Unity释放掉一些没用的内存。完成这个工作,有以下几个步骤:
    1.获取Unity的安装路径,实现方法有两种:

      方法一:简单粗暴,E:\Unity 5.5.2\Unity\Editor\Unity.exe,不具有通用性。

      方法二:通过注册包表获取安装路径,获取操作如下:

     private static string GetUnityPath()
        {
            #region 通过注册便获取Unity安装路径
            var regKey = @"Unity package fileDefaultIcon";
            RegistryKey registryKey = Registry.ClassesRoot.OpenSubKey(regKey);
            string pathName = (string)registryKey.GetValue(null);  // "(Default)"  
            if (string.IsNullOrEmpty(pathName))
            {
                return null;
            }
            int index = pathName.LastIndexOf(",");
            if (index != -1)
            {
                var exepath = pathName.Substring(0, index).Replace(""", string.Empty);
                var binpath = Path.GetDirectoryName(exepath); 
                var di = new DirectoryInfo(binpath);
                if (di.Parent != null)
                {
                    return di.Parent.FullName;
                }
            }
            return null;   
            #endregion
        }
    View Code

     第二步:创建一个新的Unity进程。

        static void StartPeocess(string applicationPath)
    	{
    		Process po = new Process();
    		po.StartInfo.FileName = applicationPath;
    		po.Start();
    	}
    

    第三步:杀掉之前旧的进程

    string[] args = unityPath.Split('\');
    Process[] pro = Process.GetProcessesByName(args[args.Length - 1].Split('.')[0]);//Unity
    foreach (var item in pro)
    {
    	UnityEngine.Debug.Log(item.MainModule);
    	item.Kill();
    }
    

     好了,这样基本上就搞定了!

    完整代码:

    using Microsoft.Win32;
    using System.Collections;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.IO;
    using UnityEditor;
    using UnityEngine;
    
    public class ReStartUnityTools : MonoBehaviour
    {
        public static string UnityExePath = "E:\Unity 5.5.2\Unity\Editor\Unity.exe";
    
        [MenuItem("Tools/ReStartUnity(重启Unity)")]
        public static void ReStartUnity()
        {
            string unityPath = UnityExePath;// GetUnityPath();公司电脑通过注册表是可以的,家里电脑不行,你们可以用这个函数试下,实在不行先写上Unity安装路径吧
    
            StartPeocess(unityPath);
            string[] args = unityPath.Split('\');
            Process[] pro = Process.GetProcessesByName(args[args.Length - 1].Split('.')[0]);//Unity
            foreach (var item in pro)
            {
                UnityEngine.Debug.Log(item.MainModule);
                item.Kill();
            }
        }
    
        private static string GetUnityPath()
        {
            #region 通过注册便获取Unity安装路径
            var regKey = @"Unity package fileDefaultIcon";
            RegistryKey registryKey = Registry.ClassesRoot.OpenSubKey(regKey);
            string pathName = (string)registryKey.GetValue(null);  // "(Default)"  
            if (string.IsNullOrEmpty(pathName))
            {
                return null;
            }
            int index = pathName.LastIndexOf(",");
            if (index != -1)
            {
                var exepath = pathName.Substring(0, index).Replace(""", string.Empty);
                var binpath = Path.GetDirectoryName(exepath);   //  
                var di = new DirectoryInfo(binpath);
                if (di.Parent != null)
                {
                    return di.Parent.FullName;
                }
            }
            return null;   
            #endregion
        }
    
        static void StartPeocess(string applicationPath)
        {
            Process po = new Process();
            po.StartInfo.FileName = applicationPath;
            po.Start();
        }
    }

    运行结果:

    不早了,睡觉!如果注册表获取安装路径有问题,有兴趣的小伙伴可以研究下或者@我!

  • 相关阅读:
    面试高频题:讲讲项目中的技术难点?
    看完本文还不会安装mysql吗?
    spring中如何向一个单例bean中注入非单例bean
    一次性讲清楚spring中bean的生命周期之三:bean是如何实例化的
    java面试一日一题:字节java后端工程师面试题
    VMware 安装 Centos 7 虚拟机配置网络
    基于 Blazor 打造一款实时字幕
    MVP on Board 没用小技巧 👌
    数据治理实践:元数据管理架构的演变
    Apache Superset1.2.0教程(四)—— CentOS环境安装
  • 原文地址:https://www.cnblogs.com/wuzhang/p/wuzhang20171014.html
Copyright © 2011-2022 走看看