解决Unity项目中UI脚本丢失的问题

此脚本是解决UI脚本丢失

步骤:将此脚本放到项目下的Edit文件夹下,如果没有,请自行创建

步骤:点击窗口的Asstes → Reimport ui assemblies

using UnityEngine;
using System.Collections.Generic;
using UnityEditor;
using System.Text.RegularExpressions;
using System.IO;
using System.Text;
public class ReimportUnityEngineUI
{
[MenuItem(“Assets/Reimport UI Assemblies”, false, 100)]
public static void ReimportUI()
{
#if UNITY_4_6
var path = EditorApplication.applicationContentsPath + “/UnityExtensions/Unity/GUISystem/{0}/{1}”;
var version = Regex.Match( Application.unityVersion,@”^[0-9]+\.[0-9]+\.[0-9]+”).Value;
#else
var path = EditorApplication.applicationContentsPath + “/UnityExtensions/Unity/GUISystem/{1}”;
var version = string.Empty;
#endif
string engineDll = string.Format(path, version, “UnityEngine.UI.dll”);
string editorDll = string.Format(path, version, “Editor/UnityEditor.UI.dll”);
ReimportDll(engineDll);
ReimportDll(editorDll);
}
static void ReimportDll(string path)
{
if (File.Exists(path))
AssetDatabase.ImportAsset(path, ImportAssetOptions.ForceUpdate | ImportAssetOptions.DontDownloadFromCacheServer);
else
Debug.LogError(string.Format(“DLL not found {0}”, path));
}
}

补充:Unity材质丢失?用脚本自动解决吧!

unity HDRP的editor脚本来处理材质丢失问题

最近初学houdini,发现houdini digital asset导入到unity HDRP中材质出错,平时从max导fbx文件到unity中,也常常发现一些材质丢失,不支持,于是我写了一个unity的editor脚本来处理这种事情,

核心步骤如下:

1.找到选中物体及其所有子物体的材质

2.将这些材质的shader替换成为HDRP的Lit Shader。

此外还有两个功能,一个是将选中物体及其子物体都共用一个材质,这个在静态合批时比较有用。另一个功能是将选中物体中所有丢失材质的物体,赋予一个共用的材质,这样也是考虑到可以在静态合批时有用,因为例如车的模型内部有很多琐碎的材质表现座椅、内饰等细节,但是这些材质可能相似度很高,而且作为外景装饰,也看不太到,所以我把这些都合成了一个共用的材质,一并去表现。

中间遇到一个比较搞的问题是material 和sharedmaterial 的区别,之前看过又忘记了╮(╯▽╰)╭, material会在脚本调用时实例化一个材质出来,所以运行时才会生效,sharedmaterial是相当于直接更改的asset面板的材质,不需运行也可以生效,并且所有引用这个材质的物体都会跟着立即改变。

基本上对我来说,还是很实用的,毕竟这一片丢材质的粉红,实在是太难看了…

修好了就贼开心,自动化的工具就是好用呀!

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
public class resetMat : MonoBehaviour//直接将脚本复制到asset文件夹中即可在工具栏发现该工具
{
    public GameObject ob;
    [MenuItem("Gq_Tools/修复材质球shader丢失")]
    static void StartRun1()
    {
        var objs = Selection.objects;
        foreach (var obj in objs)
        {
            var go = obj as GameObject;
            var rs = go.GetComponentsInChildren<Renderer>();
            foreach (var r in rs)
            {
               Material [] shaderArr = new Material[r.materials.Length];
                shaderArr = r.materials;
                print("    DDDDD" + shaderArr.Length);
                for (int i=0;i<shaderArr.Length;i++)
                {
                    shaderArr[i].shader=Shader.Find("HDRP/Lit");
                }
            }
        }
    }
    [MenuItem("Gq_Tools/将选中物体都赋予同一材质球")]
    static void StartRun2()
    {
        Material newmat = new Material(Shader.Find("HDRP/Lit"));
        newmat.color = new Color(255, 228, 0, 1);
        var objs = Selection.objects;
        foreach (var obj in objs)//for每个选中的物体
        {
            var go = obj as GameObject;
            var rs = go.GetComponentsInChildren<Renderer>();//连带子物体
            foreach (var r in rs)//每个物体及子物体的renderer
            {
                Material[] matArr = new Material[r.materials.Length];
                matArr = r.materials;
                r.material = newmat;
            }
        }
    }
    [MenuItem("Gq_Tools/将所有丢失材质都强制赋予一个共用的材质")]
    static void StartRun3()
    {    Material newmat = new Material(Shader.Find("HDRP/Lit"));
        var objs = Selection.objects;
        foreach (var obj in objs)
        {
            var go = obj as GameObject;
            var rs = go.GetComponentsInChildren<Renderer>();
            foreach (var r in rs)//每个物体及子物体的renderer组件
            {
               // Material[] matArr = new Material[r.sharedMaterials.Length];
               // matArr = r.materials;
                if (r.sharedMaterial==null)//如果有丢失材质球的坑
                {
                    print("丢失材质");

                    r.sharedMaterial = newmat;
                }
                else { print("没有丢失"); }
            }
        }
    }
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。

(0)

相关推荐

  • Unity3D 单例模式和静态类的使用详解

    Unity3D的API提供了很多的功能,但是很多流程还是会自己去封装一下去.当然现在网上也有很多的框架可以去下载使用,但是肯定不会比自己写的用起来顺手. 对于是否需要使用框架的问题上,本人是持肯定态度的,把一些常用方法进行封装,做成一个功能性的框架,可以很大程度上提高代码的效率,维护也方便. 对于网络上很多教程上使用的"游戏通用MVC框架",现在看来并不符合MVC这种结构性框架的设计思想:要知道,MVC最初是被设计为Web应用的框架,而游戏中的很多事件并不是通过用户点击UI发生的,Vi

  • C#中public变量不能被unity面板识别的解决方案

    究其根本,原因在于,能在unity面板上识别的变量,public不是唯一的条件,另外一个条件是可序列化 比如你声明了如下一个类 using System.Collections; using System.Collections.Generic; using UnityEngine; public class Wave { public GameObject prefab; public int count; public float rate; } 在另外一个类中进行声明时如下: public

  • Unity 静态变量跨场景操作

    创建两个场景同时赋值StaticVarious 脚本 然后按键好,H ,J 进行不断切换场景,会发现unity 控制台输出数字不断增加,然后把静态去掉,这样结果都是10. using UnityEngine; using System.Collections; using UnityEngine.SceneManagement; public class StaticVarious : MonoBehaviour { static int value = 10; void Start () {

  • unity 切换场景不销毁物体问题的解决

    在用unity进行游戏开发时我们有时需要一些物体在场景切换时不需要被销毁这时我们可以用官方给的DontDestroyOnLoad()方法, 这个方法可以让我们在场景切换时不销毁场景.但如果你又返回这个场景(创建不可销毁物体的场景)时就会发现会有两个这个物体(标记为不可销毁的物体). 这个问题有一个较为简单的解决方法就是: 在物体的Awake()或Star()方法中加入这段代码.如果找到和自己一样的名字却不是自己的物体就将自己销毁,这样就解决了这个问题.(别的地方不知道,我的项目是可以用): if

  • 在Unity中使用全局变量的操作

    创建一个脚本,输入下面的代码.脚本不需要添加到任何物体上,globle变量可以跨场景全局调用. using System.Collections; using System.Collections.Generic; using UnityEngine; public class Globle { public static int globle= 1; } 和以前的许多语言不同,C#没有全局变量或全局函数.C#的所有字段和方法都在类的上下文中. 在C#中,与全局字段或函数等价的是静态字段或方法.

  • 在unity脚本中控制Inspector面板的参数操作

    在编写脚本的过程中我们会遇到一些小问题 比如一个的变量 为了在其他脚本中可以调用 我们需要写成public类型的 这样的话在Inspector面板中会出现此变量 这篇博客会给大家介绍一些方法去避免这些小问题 1.[Header(" ")] 这个的作用是给它下面的所有变量一个总标题 2.[Tooltip("")] 这个的作用是给下面的第一行(紧邻的语句)注释 这个注释和双斜杠的注释不同 这个注释的效果是在unity中鼠标拖到变量的名字上 他会出现注释(括号的双引号中的

  • Unity使用物理引擎实现多旋翼无人机的模拟飞行

    内容简介 最近在用Unity实现无人机的模拟飞行,但发现站里基本没有完整介绍如何实现该功能的博客,因时间紧迫,就自己简单做了一个仿真(不是完全按照现实物理情景来做,即通过各个螺旋桨旋转产生力带动机体飞行).下面我会简述完全按现实物理情景实现模拟飞行,并详细描述我自己做的模拟飞行(不完全仿真),给各位提供参考. 现实物理情景的实现--简述(以四旋翼无人机为例) 因为我没有实现1:1仿真,所以这里只介绍思路,希望能给到读者一点启发. 构建一个四旋翼无人机模型(可以网上下载.或用Maya等建一个) 将

  • 解决Unity项目中UI脚本丢失的问题

    此脚本是解决UI脚本丢失 步骤:将此脚本放到项目下的Edit文件夹下,如果没有,请自行创建 步骤:点击窗口的Asstes → Reimport ui assemblies using UnityEngine; using System.Collections.Generic; using UnityEditor; using System.Text.RegularExpressions; using System.IO; using System.Text; public class Reimp

  • 解决vue项目中页面调用数据 在数据加载完毕之前出现undefined问题

    在项目中遇到后台数据还没有加载完毕,但是页面上调用了后台数据中的字段,这样就会报undefined. 例如:一进入页面直接回显数据. 我在created里面请求接口进行赋值 this.matterAll=[]; 会报accessItemName为undefined: 原因以及解决办法: 在上面data()中,我定义了matterAll:[],也就是空的数组, template中,我又直接用了this.matterAll[0],这个时候this.matterAll[0]=undefined,所以t

  • 解决vue项目中某一页面不想引用公共组件app.vue的问题

    Vue 单页面应用 把公共组件放在 app.vue 但是我希望某个页面没有这些公共组件怎么办(比如登陆页面)每个页面都有 导航栏 但是我希望 登陆页面只有一个背景色和一个登陆框 没有导航栏 那应该怎样设置呢? vue中文文档:点击进入 在根组件中:在导航栏使用v-show判断当前路由是否是不需要的组件来完成页面: <template> <div id="app"> <home-header v-show="!(path ==='/') "

  • 解决Vue项目中tff报错的问题

    在webpack.config.js中的模块配置中加如下的配置规则: {test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, use: "url-loader"} const path = require('path'); const htmlWebpackplugin = require('html-webpack-plugin'); const VueLoaderPlugin = require('vue-loader/lib/plugin'); modu

  • 解决vue项目中遇到 Cannot find module ‘chalk‘ 报错的问题

    如下所示: 解决办法: 删掉项目中node_modules文件夹 ; 然后再 重新下载一下 cnpm install 补充知识:vue在npm run dev时报错Error: Cannot find module 'xxx' 今天在做项目时出现了下面这个错误,找了很多博客,都说改一下代码写法就行了.不过视情况而定,有点时候有些代码改起来很麻烦,千丝万缕的关系,不是说改一下代码就行了的. 然后就试了很多方法,最后发现是node版本的原因,当时用的是node的最新版本@14.6.0,个人认为是新版

  • 解决vue项目中出现Invalid Host header的问题

    在vue-cli版本为2.x的情况下修改webpack.dev.conf.js中的devServer对象加入disableHostCheck: true devServer: { disableHostCheck: true, } vue-cli版本3.0的情况下修改vue.config.js的配置 module.exports = { devServer: { disableHostCheck: true } } 补充知识:vue中使用wangeditor富文本编辑器 1.先下载 编辑器 cn

  • vue-cli npm如何解决vue项目中缺失core-js的问题

    目录 vue-cli npm解决vue项目中缺失core-js 报错 原因 解决办法 vue踩坑:this dependency was not found 问题背景 vue-cli npm解决vue项目中缺失core-js 报错 This dependency was not found: core-js/modules/es.object.to-string in ./src/router/index.jsTo install it, you can run: npm install --s

  • 解决vue项目中type=”file“ change事件只执行一次的问题

    问题描述 在最近的项目开发中遇到了这样的一个问题,当我上传了一个文件时,我将获取到的文件名清空后,却无法再次上传相同的文件 <template> <div class="hello"> <input type="button" value="上传文件" name="" id="" @click="updata"> <input type=&quo

  • 解决springmvc项目中使用过滤器来解决请求方式为post时出现乱码的问题

    在spring项目中,当请求方式为post时,可能在获取数据之后会有乱码的情况,其中一种解决方法就是在拿到请求参数之前设置编码格式为utf-8,如下 request.setCharacterEncoding("utf-8"); String strId = request.getParameter("id"); String strName = request.getParameter("name"); String strSex = reque

  • 解决Maven项目中 Invalid bound statement 无效的绑定问题

    问题 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): 关于这个问题,我的是 Maven 项目,在访问程序的接口时,抛出异常信息,无效的绑定语句. 在检查调用的 Mapper 接口时,发现在目标文件中没有找到 Mapper 映射的配置文件,在项目的 target 目标文件中可以看到,与接口对应的 Mapper 文件未加载,所以在程序启动时,就找不到对应的映射文件,导致的这个错误. 解决

随机推荐