首页 > 其他分享 >Unity 代码调用重新生成csproj文件

Unity 代码调用重新生成csproj文件

时间:2022-08-17 20:45:18浏览次数:87  
标签:调用 csproj Unity CodeEditor UnityEditor InternalAPIEditorBridge.001 rect

结论

先放结论:editor代码中直接调用

    Unity.CodeEditor.CodeEditor.CurrentEditor.SyncAll();

原因

在一些操作后,比如修改csc.rsp的内容之后,需要重新生成csproj文件
方法是 Edit -> Preferences -> External Tools -> Regenerate project files
但是多按几次就比较烦了,想通过代码调用生成csproj文件
但是网上直接搜又找不到,可能因为关键词不对

首先查看unity官方开源的编辑器代码
找到了这段

        private void RegenerateProjectFiles()
        {
            var rect = EditorGUI.IndentedRect(EditorGUILayout.GetControlRect(new GUILayoutOption[] {}));
            rect.width = 252;
            if (GUI.Button(rect, "Regenerate project files"))
            {
                SyncVS.Synchronizer.Sync();
            }
        }

和按钮上的文字一模一样,应该就是这个了。
但是UnityEditor.SyncVS这个类访问权限是internal,直接访问不了,又不想再用反射一层层调

VS里面跳转到UnityEditor.SyncVS这个类的定义,可以看到程序集是UnityEditor.CoreModule, 也就是UnityEditor.dll这个文件
使用ILSpy导入这个dll,可以看到一堆诸如

[assembly: InternalsVisibleTo("Unity.InternalAPIEditorBridge.001")]

这样的内容。

Unity不想把所有方法都直接开放出来(所有人随便就能调用也容易出bug),又要给其他程序集使用,就预定义了一堆这种东西
只要一个程序集的名字在这里出现就可以调用UnityEditor.CoreModule的internal访问权限。
挑一个没被占用的(可能会被安装的Packages包占用),就“Unity.InternalAPIEditorBridge.001”了

新建文件夹"Assets/Editor/Unity.InternalAPIEditorBridge.001"
新建asmdef文件"Assets/Editor/Unity.InternalAPIEditorBridge.001/Unity.InternalAPIEditorBridge.001.asmdef"
新建一个C#代码文件"Assets/Editor/Unity.InternalAPIEditorBridge.001/UnityEditorExterns.cs"

namespace UnityEditor
{
    public static class UnityEditorExterns
    {
        public static void RegenerateCSharpProjectFiles()
        {
            UnityEditor.SyncVS.Synchronizer.Sync();
        }
    }
}

然后在正常的Editor代码文件里面调用即可

然后问题来了,生成文件之后,发现VS里面的引用不太对,甚至刚才写的UnityEditorExterns.RegenerateCSharpProjectFiles()都找不到引用了
对比手动去Preferences窗口点击之后生成的文件,也是有差距的。

难道被什么覆盖了?全局搜索“Regenerate project files”,在“[email protected]/Editor/VisualStudioEditor.cs”里面找到下面的内容

        private void RegenerateProjectFiles()
        {
            var rect = EditorGUI.IndentedRect(EditorGUILayout.GetControlRect(new GUILayoutOption[] {}));
            rect.width = 252;
            if (GUI.Button(rect, "Regenerate project files"))
            {
                _generator.Sync();
            }
        }

搜索“_generator.Sync()” 又找到了下面的内容

        public void SyncAll()
        {
            AssetDatabase.Refresh();
            _generator.Sync();
        }

看来如果能调用到这个SyncAll(), 应该就可以了

继续追踪后,发现这个方法是实现Unity.CodeEditor.IExternalCodeEditor的接口方法,而IExternalCodeEditor这个接口实例可以通过Unity.CodeEditor.CodeEditor.CurrentEditor取到, 这一路都是public的,甚至不需要“InternalAPIEditorBridge”

直接调用

    Unity.CodeEditor.CodeEditor.CurrentEditor.SyncAll();

执行后发现生成了正确的csproj文件

标签:调用,csproj,Unity,CodeEditor,UnityEditor,InternalAPIEditorBridge.001,rect
From: https://www.cnblogs.com/lunoctis/p/16596664.html

相关文章

  • Unity获取脚本的CustomEditor(自定义编辑)数据
    在此之前,粗略的介绍下CustomEditor(自定义编辑)。Unity对于我们创建的Mono脚本提供了属性面板的展示和修改。默认情况下,Inspector面板中会显示当前脚本类的公开字段(publi......
  • 面向对象——初识面向对象、回顾方法定义调用
    初识面向对象属性+方法=类对于描述复杂的事物,为了从宏观上把握、从整体上合理分析,我们需要使用面向对象来分析整个系统。但是,具体到微观操作,让然需要面向过程的思路去处......
  • unityprofiler各记录函数
    EarlyUpdate.UpdatePreloadingLoading.UpdatePreloading:在异步加载/卸载场景,异步加载AssetBundle,加载AssetBundle中的Asset,加载Resource文件夹中资源,调用UnloadUnusedAss......
  • 10、RestTemplate方式实现远程调用Client
    一、JSONObject类详解:JSONobject是FastJson提供的对象,在API中是用一个私有的常量map进行封装的,实际就是一个map,只不过 FastJson对其进行了封装,添加了很多方便快捷的属性......
  • 搭建UnityGameFramework框架最低需求项目
    1、下载GameFramework包进入官网的下载页面下载2021.05.31版本https://gameframework.cn/download/2、新建Unity项目,然后把包导入3、新建Editor文件夹,并创建GameFr......
  • 如果一个线程两次调用start(),会出现什么问题?
    如果一个线程两次调用start(),会出现什么问题?“如果一个线程两次调用start(),会出现什么问题?”如果这个问题出自阿里p6岗位第一面的提问,你能回答出来吗?大家好,我是Mic,一个......
  • Unity3d反射(Reflection)
    无论是VR、AR,还是游戏开发,都绕不开反射材质,一些童鞋说用反射探测器(ReflectionProbe)制作反射,总感觉地板的反射不正确,本文小姐姐就这一话题,和大家一起探讨一下反射材质的制......
  • 【Java面试】如果一个线程两次调用start(),会出现什么问题?
    “如果一个线程两次调用start(),会出现什么问题?”如果这个问题出自阿里p6岗位第一面的提问,你能回答出来吗?大家好,我是Mic,一个工作了14年的Java程序员。关于这个问题,涉及......
  • 避坑 | 调用feign远程get请求的接口却提示“Request method ‘POST‘ not supported”
    避坑修改前后的feign接口对比:(修改前)/***获取用户列表*@paramuser用户信息*@return列表*/@GetMapping("/user/list")R<TableDataInfo>selectUserList(......
  • 函数内部的匿名函数被调用
     defmultipliers():return[lambdax:i*xforiinrange(4)]print[m(2)forminmultipliers()]#执行结果:[6,6,6,6]说明:上面代码输出的......